From ab7f8c4b17a7a2857b06af646531dd9908e9afb8 Mon Sep 17 00:00:00 2001 From: Jungyeon Seo Date: Mon, 30 Sep 2024 19:39:49 +0900 Subject: [PATCH 01/54] Refactor : profile retrieval api --- pochak/pochak.xcodeproj/project.pbxproj | 34 +++- .../APIs/Profile/ProfileRetrievalAPI.swift | 36 +++++ .../Profile/ProfileRetrievalRequest.swift | 12 ++ .../Profile/ProfileRetrievalResponse.swift | 40 +++++ .../Network/Services/ProfileService.swift | 29 ++++ .../MyProfileTabViewController.swift | 87 ++++++---- .../ProfileAPI/MyProfilePochakPostModel.swift | 70 ++++---- .../MyProfilePochakedPostModel.swift | 32 ++-- .../ProfileAPI/MyProfilePostDataManager.swift | 150 +++++++++--------- 9 files changed, 336 insertions(+), 154 deletions(-) create mode 100644 pochak/pochak/Network/APIs/Profile/ProfileRetrievalAPI.swift create mode 100644 pochak/pochak/Network/Models/Profile/ProfileRetrievalRequest.swift create mode 100644 pochak/pochak/Network/Models/Profile/ProfileRetrievalResponse.swift create mode 100644 pochak/pochak/Network/Services/ProfileService.swift diff --git a/pochak/pochak.xcodeproj/project.pbxproj b/pochak/pochak.xcodeproj/project.pbxproj index 18fcc3e7..3cc85aa5 100644 --- a/pochak/pochak.xcodeproj/project.pbxproj +++ b/pochak/pochak.xcodeproj/project.pbxproj @@ -145,6 +145,10 @@ 3769D6D22B3C56F100294CD1 /* PochakPostTabmanViewController.swift in Sources */ = {isa = PBXBuildFile; fileRef = 3769D6D12B3C56F100294CD1 /* PochakPostTabmanViewController.swift */; }; 3769D6D52B3C59F900294CD1 /* ProfilePostCollectionViewCell.swift in Sources */ = {isa = PBXBuildFile; fileRef = 3769D6D32B3C59F900294CD1 /* ProfilePostCollectionViewCell.swift */; }; 3769D6D62B3C59F900294CD1 /* ProfilePostCollectionViewCell.xib in Resources */ = {isa = PBXBuildFile; fileRef = 3769D6D42B3C59F900294CD1 /* ProfilePostCollectionViewCell.xib */; }; + 376EA1292CAAADCF00FEFB63 /* ProfileRetrievalAPI.swift in Sources */ = {isa = PBXBuildFile; fileRef = 376EA1282CAAADCF00FEFB63 /* ProfileRetrievalAPI.swift */; }; + 376EA12C2CAAAE5600FEFB63 /* ProfileRetrievalResponse.swift in Sources */ = {isa = PBXBuildFile; fileRef = 376EA12B2CAAAE5600FEFB63 /* ProfileRetrievalResponse.swift */; }; + 376EA12E2CAAAE6800FEFB63 /* ProfileRetrievalRequest.swift in Sources */ = {isa = PBXBuildFile; fileRef = 376EA12D2CAAAE6800FEFB63 /* ProfileRetrievalRequest.swift */; }; + 376EA1302CAAAF6900FEFB63 /* ProfileService.swift in Sources */ = {isa = PBXBuildFile; fileRef = 376EA12F2CAAAF6900FEFB63 /* ProfileService.swift */; }; 376F125B2A8B7440005F469B /* SocialLoginViewController.swift in Sources */ = {isa = PBXBuildFile; fileRef = 376F125A2A8B7440005F469B /* SocialLoginViewController.swift */; }; 379A6A342B569DFA0087FAAC /* AuthenticationCredential.swift in Sources */ = {isa = PBXBuildFile; fileRef = 379A6A332B569DFA0087FAAC /* AuthenticationCredential.swift */; }; 379A6A3A2B56BDBF0087FAAC /* Authenticator.swift in Sources */ = {isa = PBXBuildFile; fileRef = 379A6A392B56BDBF0087FAAC /* Authenticator.swift */; }; @@ -326,7 +330,7 @@ 08C02EF52BF3945000627C21 /* UIFont+.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = "UIFont+.swift"; sourceTree = ""; }; 08C02EF72BF394B800627C21 /* UIAlertController+.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = "UIAlertController+.swift"; sourceTree = ""; }; 08C9151B2C6461B10044A9A8 /* PostService.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = PostService.swift; sourceTree = ""; }; - 08D2B98C2C68C02D00BD7450 /* GoogleService-Info.plist */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = text.plist.xml; name = "GoogleService-Info.plist"; path = "../../../Downloads/GoogleService-Info.plist"; sourceTree = ""; }; + 08D2B98C2C68C02D00BD7450 /* GoogleService-Info.plist */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = text.plist.xml; name = "GoogleService-Info.plist"; path = "../../../../../Downloads/GoogleService-Info.plist"; sourceTree = ""; }; 08D98C492AFEE8D700E9A097 /* LikedUsersDataModel.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = LikedUsersDataModel.swift; sourceTree = ""; }; 08E8DCDB2C38118000EC78C2 /* UILabel+.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = "UILabel+.swift"; sourceTree = ""; }; 08EB5D242C280CFE00E35C16 /* UIImage+.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = "UIImage+.swift"; sourceTree = ""; }; @@ -383,6 +387,10 @@ 3769D6D12B3C56F100294CD1 /* PochakPostTabmanViewController.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = PochakPostTabmanViewController.swift; sourceTree = ""; }; 3769D6D32B3C59F900294CD1 /* ProfilePostCollectionViewCell.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = ProfilePostCollectionViewCell.swift; sourceTree = ""; }; 3769D6D42B3C59F900294CD1 /* ProfilePostCollectionViewCell.xib */ = {isa = PBXFileReference; lastKnownFileType = file.xib; path = ProfilePostCollectionViewCell.xib; sourceTree = ""; }; + 376EA1282CAAADCF00FEFB63 /* ProfileRetrievalAPI.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = ProfileRetrievalAPI.swift; sourceTree = ""; }; + 376EA12B2CAAAE5600FEFB63 /* ProfileRetrievalResponse.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = ProfileRetrievalResponse.swift; sourceTree = ""; }; + 376EA12D2CAAAE6800FEFB63 /* ProfileRetrievalRequest.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = ProfileRetrievalRequest.swift; sourceTree = ""; }; + 376EA12F2CAAAF6900FEFB63 /* ProfileService.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = ProfileService.swift; sourceTree = ""; }; 376F125A2A8B7440005F469B /* SocialLoginViewController.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = SocialLoginViewController.swift; sourceTree = ""; }; 379A6A332B569DFA0087FAAC /* AuthenticationCredential.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = AuthenticationCredential.swift; sourceTree = ""; }; 379A6A392B56BDBF0087FAAC /* Authenticator.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = Authenticator.swift; sourceTree = ""; }; @@ -1019,6 +1027,23 @@ path = PostListTabman; sourceTree = ""; }; + 376EA1272CAAAD3500FEFB63 /* Profile */ = { + isa = PBXGroup; + children = ( + 376EA1282CAAADCF00FEFB63 /* ProfileRetrievalAPI.swift */, + ); + path = Profile; + sourceTree = ""; + }; + 376EA12A2CAAAE3600FEFB63 /* Profile */ = { + isa = PBXGroup; + children = ( + 376EA12B2CAAAE5600FEFB63 /* ProfileRetrievalResponse.swift */, + 376EA12D2CAAAE6800FEFB63 /* ProfileRetrievalRequest.swift */, + ); + path = Profile; + sourceTree = ""; + }; 37C3AF442B3CB26000B4C79C /* ProfileAPI */ = { isa = PBXGroup; children = ( @@ -1199,6 +1224,7 @@ 08C9151B2C6461B10044A9A8 /* PostService.swift */, EA7E146A2C8E9360001DA769 /* AlarmService.swift */, EA7E14602C858EC6001DA769 /* CameraService.swift */, + 376EA12F2CAAAF6900FEFB63 /* ProfileService.swift */, ); path = Services; sourceTree = ""; @@ -1206,6 +1232,7 @@ EA2CD6332C5F458900644EFE /* Models */ = { isa = PBXGroup; children = ( + 376EA12A2CAAAE3600FEFB63 /* Profile */, 0822A05A2CA1983C00F87E2C /* Post */, 0822A0552CA1983C00F87E2C /* Search */, 0822A0582CA1983C00F87E2C /* User */, @@ -1232,6 +1259,7 @@ EA2CD6352C5F45A100644EFE /* APIs */ = { isa = PBXGroup; children = ( + 376EA1272CAAAD3500FEFB63 /* Profile */, 0822A04D2CA1980200F87E2C /* User */, 0822A04A2CA197F800F87E2C /* Search */, 0822A0382CA197E700F87E2C /* Post */, @@ -1652,6 +1680,7 @@ buildActionMask = 2147483647; files = ( EA7EE1D82BF38921009486CC /* PochakAlarmTableViewCell.swift in Sources */, + 376EA1302CAAAF6900FEFB63 /* ProfileService.swift in Sources */, EA01079E2A59556800A3AE85 /* PostViewController.swift in Sources */, 3766F40F2C398AA8001DD239 /* NetworkResult400.swift in Sources */, 0822A0532CA1983100F87E2C /* ExploreRequest.swift in Sources */, @@ -1666,6 +1695,7 @@ 0822A0542CA1983100F87E2C /* ExploreResponse.swift in Sources */, 0822A0662CA1983C00F87E2C /* SearchRequest.swift in Sources */, 0822A0712CA1983C00F87E2C /* PostDetailResponse.swift in Sources */, + 376EA12C2CAAAE5600FEFB63 /* ProfileRetrievalResponse.swift in Sources */, EA0107A72A5CF73900A3AE85 /* AlarmViewController.swift in Sources */, 08EB99B72C53EA8500FAC08A /* TaggedUsersTableViewCell.swift in Sources */, EACF0F6E2C3044C000C0016C /* TagSearchTableViewCell.swift in Sources */, @@ -1740,6 +1770,7 @@ 0822A0462CA197E700F87E2C /* CommentPostAPI.swift in Sources */, 3766F4062C370A7C001DD239 /* BlockedUserListDataManager.swift in Sources */, 3769D6D52B3C59F900294CD1 /* ProfilePostCollectionViewCell.swift in Sources */, + 376EA12E2CAAAE6800FEFB63 /* ProfileRetrievalRequest.swift in Sources */, EA96D0562C8F192B00D80562 /* TagApproveResponse.swift in Sources */, 3769D6B62B3C302C00294CD1 /* JoinDataModel.swift in Sources */, 084AF4C72A5D831100C6454A /* HomeCollectionViewCell.swift in Sources */, @@ -1804,6 +1835,7 @@ EAC582742C3074EA006F44AF /* UIColor+.swift in Sources */, 3769D6BB2B3C347000294CD1 /* FollowListViewController.swift in Sources */, 3769D6B42B3C301B00294CD1 /* JoinDataManager.swift in Sources */, + 376EA1292CAAADCF00FEFB63 /* ProfileRetrievalAPI.swift in Sources */, EA96D0522C8F186900D80562 /* TagApproveAPI.swift in Sources */, 0822A07B2CA1992B00F87E2C /* PostService.swift in Sources */, 37D311DA2B53134200A1D7C1 /* LogoutDataManager.swift in Sources */, diff --git a/pochak/pochak/Network/APIs/Profile/ProfileRetrievalAPI.swift b/pochak/pochak/Network/APIs/Profile/ProfileRetrievalAPI.swift new file mode 100644 index 00000000..91df703d --- /dev/null +++ b/pochak/pochak/Network/APIs/Profile/ProfileRetrievalAPI.swift @@ -0,0 +1,36 @@ +// +// ProfileRetrievalAPI.swift +// pochak +// +// Created by Seo Cindy on 9/30/24. +// + +import Foundation + +enum ProfileRetrievalAPI { + case getProfile(handle: String, request: ProfileRetrievalRequest) +} + +extension ProfileRetrievalAPI: BaseAPI { + + typealias Response = ProfileRetrievalResponse + + var method: HTTPMethod { + switch self { + case .getProfile: return .get + } + } + + var path: String { + switch self { + case .getProfile(let handle, _): return "/v2/members/\(handle)" + } + } + + var parameters: RequestParams? { + switch self { + case .getProfile(_, let request): return .query(request) + } + } +} + diff --git a/pochak/pochak/Network/Models/Profile/ProfileRetrievalRequest.swift b/pochak/pochak/Network/Models/Profile/ProfileRetrievalRequest.swift new file mode 100644 index 00000000..349902ad --- /dev/null +++ b/pochak/pochak/Network/Models/Profile/ProfileRetrievalRequest.swift @@ -0,0 +1,12 @@ +// +// ProfileRetrievalRequest.swift +// pochak +// +// Created by Seo Cindy on 9/30/24. +// + +import Foundation + +struct ProfileRetrievalRequest: Encodable { + let page: Int +} diff --git a/pochak/pochak/Network/Models/Profile/ProfileRetrievalResponse.swift b/pochak/pochak/Network/Models/Profile/ProfileRetrievalResponse.swift new file mode 100644 index 00000000..2bcb80d2 --- /dev/null +++ b/pochak/pochak/Network/Models/Profile/ProfileRetrievalResponse.swift @@ -0,0 +1,40 @@ +// +// ProfileRetrievalResponse.swift +// pochak +// +// Created by Seo Cindy on 9/30/24. +// + +import Foundation + +struct ProfileRetrievalResponse: Codable { + let isSuccess: Bool + let code: String + let message: String + let result: ProfileRetrievalResult +} + +struct ProfileRetrievalResult : Codable { + var handle: String? + var profileImage: String? + var name: String? + var message: String? + var totalPostNum: Int? + var followerCount: Int? + var followingCount: Int? + var isFollow: Bool? + var pageInfo : ProfilePageInfo + var postList : [ProfilePochakedPostList] +} + +struct ProfilePageInfo : Codable { + var lastPage : Bool + var totalPages : Int + var totalElements : Int + var size : Int +} + +struct ProfilePochakedPostList : Codable { + var postId : Int + var postImage : String +} diff --git a/pochak/pochak/Network/Services/ProfileService.swift b/pochak/pochak/Network/Services/ProfileService.swift new file mode 100644 index 00000000..18f5af2c --- /dev/null +++ b/pochak/pochak/Network/Services/ProfileService.swift @@ -0,0 +1,29 @@ +// +// ProfileService.swift +// pochak +// +// Created by Seo Cindy on 9/30/24. +// + +import Foundation + +struct ProfileService { + /// - Parameters: + /// - request: 받아올 프로필 탭 페이지 + /// - completion: 통신 후 핸들러 (뷰컨트롤러에 있음) + static func getProfile( + handle: String, + request: ProfileRetrievalRequest, + completion: @escaping (_ succeed: ProfileRetrievalResponse?, _ failed: NetworkError?) -> Void) { + NetworkService.shared.request(ProfileRetrievalAPI.getProfile(handle: handle, request: request)) { response in + switch response { + case .success(let data): + completion(data, nil) + case .failure(let error): + print("=== getProfile error ===") + print(error.localizedDescription) + completion(nil, error) + } + } + } +} diff --git a/pochak/pochak/UI/Profile/MyProfile/MyProfileTabViewController.swift b/pochak/pochak/UI/Profile/MyProfile/MyProfileTabViewController.swift index 31e0ee9c..d9d44552 100644 --- a/pochak/pochak/UI/Profile/MyProfile/MyProfileTabViewController.swift +++ b/pochak/pochak/UI/Profile/MyProfile/MyProfileTabViewController.swift @@ -126,36 +126,69 @@ class MyProfileTabViewController: UIViewController { } private func setUpData() { - MyProfilePostDataManager.shared.myProfileUserAndPochakedPostDataManager(handle, 0,{ response in - switch response { - case .success(let resultData): - let imageURL = resultData.profileImage ?? "" - UserDefaultsManager.setData(value: imageURL, key: .profileImgUrl) - if let url = URL(string: imageURL) { - self.profileImage.kf.setImage(with: url) { result in - switch result { - case .success(let value): - print("Image successfully loaded: \(value.image)") - case .failure(let error): - print("Image failed to load with error: \(error.localizedDescription)") - } - } + + let request = ProfileRetrievalRequest(page: 0) + ProfileService.getProfile(handle: handle, request: request) { [weak self] data, failed in + guard let data = data else { + // 에러가 난 경우, alert 창 present + switch failed { + case .disconnected: + self?.present(UIAlertController.networkErrorAlert(title: failed!.localizedDescription), animated: true) + case .serverError: + self?.present(UIAlertController.networkErrorAlert(title: failed!.localizedDescription), animated: true) + case .unknownError: + self?.present(UIAlertController.networkErrorAlert(title: failed!.localizedDescription), animated: true) + default: + self?.present(UIAlertController.networkErrorAlert(title: "요청에 실패하였습니다."), animated: true) } - - // 필요한 데이터 뷰에 반영 - self.setUpResponseData(resultData) - - // UserDefaultsManager에 새로운 데이터 저장 후 관리 : followerCount, followingCount - self.setUpUserDefaults(resultData) - - case .MEMBER4002: - print("유효하지 않은 멤버의 handle입니다.") - self.present(UIAlertController.networkErrorAlert(title: "유효하지 않은 멤버의 handle입니다."), animated: true) + return + } + + print("=== Profile, setup data succeeded ===") + print("== data: \(data)") + + // load 프로필 이미지 + var imageURL = data.result.profileImage + if let url = URL(string: (imageURL)) { + profileImage.load(with: url) } - }) + // 필요한 데이터 뷰에 반영 + self.setUpResponseData(data.result) + + // UserDefaultsManager에 새로운 데이터 저장 후 관리 : followerCount, followingCount + self.setUpUserDefaults(data.result) + + } +// MyProfilePostDataManager.shared.myProfileUserAndPochakedPostDataManager(handle, 0,{ response in +// switch response { +// case .success(let resultData): +// let imageURL = resultData.profileImage ?? "" +// UserDefaultsManager.setData(value: imageURL, key: .profileImgUrl) +// if let url = URL(string: imageURL) { +// self.profileImage.kf.setImage(with: url) { result in +// switch result { +// case .success(let value): +// print("Image successfully loaded: \(value.image)") +// case .failure(let error): +// print("Image failed to load with error: \(error.localizedDescription)") +// } +// } +// } +// +// // 필요한 데이터 뷰에 반영 +// self.setUpResponseData(resultData) +// +// // UserDefaultsManager에 새로운 데이터 저장 후 관리 : followerCount, followingCount +// self.setUpUserDefaults(resultData) +// +// case .MEMBER4002: +// print("유효하지 않은 멤버의 handle입니다.") +// self.present(UIAlertController.networkErrorAlert(title: "유효하지 않은 멤버의 handle입니다."), animated: true) +// } +// }) } - private func setUpResponseData(_ resposeData: MyProfileUserAndPochakedPostModel) { + private func setUpResponseData(_ resposeData: ProfileRetrievalResult) { self.profileImage.contentMode = .scaleAspectFill self.userName.text = String(resposeData.name ?? "") self.userMessage.text = String(resposeData.message ?? "") @@ -164,7 +197,7 @@ class MyProfileTabViewController: UIViewController { self.followingCount.text = String(resposeData.followingCount ?? 0) } - private func setUpUserDefaults(_ resposeData: MyProfileUserAndPochakedPostModel) { + private func setUpUserDefaults(_ resposeData: ProfileRetrievalResult) { UserDefaultsManager.setData(value: resposeData.name, key: .name) UserDefaultsManager.setData(value: resposeData.message, key: .message) UserDefaultsManager.setData(value: resposeData.followerCount, key: .followerCount) diff --git a/pochak/pochak/UI/Profile/MyProfile/ProfileAPI/MyProfilePochakPostModel.swift b/pochak/pochak/UI/Profile/MyProfile/ProfileAPI/MyProfilePochakPostModel.swift index 489b7b3a..a4cddeeb 100644 --- a/pochak/pochak/UI/Profile/MyProfile/ProfileAPI/MyProfilePochakPostModel.swift +++ b/pochak/pochak/UI/Profile/MyProfile/ProfileAPI/MyProfilePochakPostModel.swift @@ -1,38 +1,38 @@ +//// +//// MyProfilePochakPostModel.swift +//// pochak +//// +//// Created by Seo Cindy on 12/28/23. +//// // -// MyProfilePochakPostModel.swift -// pochak +//struct MyProfileUserAndPochakedPostResponse: Codable { +// let isSuccess: Bool +// let code: String +// let message: String +// let result: MyProfileUserAndPochakedPostModel +//} // -// Created by Seo Cindy on 12/28/23. +//struct MyProfileUserAndPochakedPostModel : Codable { +// var handle: String? +// var profileImage: String? +// var name: String? +// var message: String? +// var totalPostNum: Int? +// var followerCount: Int? +// var followingCount: Int? +// var isFollow: Bool? +// var pageInfo : PageDataModel +// var postList : [PostDataModel] +//} // - -struct MyProfileUserAndPochakedPostResponse: Codable { - let isSuccess: Bool - let code: String - let message: String - let result: MyProfileUserAndPochakedPostModel -} - -struct MyProfileUserAndPochakedPostModel : Codable { - var handle: String? - var profileImage: String? - var name: String? - var message: String? - var totalPostNum: Int? - var followerCount: Int? - var followingCount: Int? - var isFollow: Bool? - var pageInfo : PageDataModel - var postList : [PostDataModel] -} - -struct PageDataModel : Codable { - var lastPage : Bool - var totalPages : Int - var totalElements : Int - var size : Int -} - -struct PostDataModel : Codable { - var postId : Int - var postImage : String -} +//struct PageDataModel : Codable { +// var lastPage : Bool +// var totalPages : Int +// var totalElements : Int +// var size : Int +//} +// +//struct PostDataModel : Codable { +// var postId : Int +// var postImage : String +//} diff --git a/pochak/pochak/UI/Profile/MyProfile/ProfileAPI/MyProfilePochakedPostModel.swift b/pochak/pochak/UI/Profile/MyProfile/ProfileAPI/MyProfilePochakedPostModel.swift index 0c84f1b0..ffcb6743 100644 --- a/pochak/pochak/UI/Profile/MyProfile/ProfileAPI/MyProfilePochakedPostModel.swift +++ b/pochak/pochak/UI/Profile/MyProfile/ProfileAPI/MyProfilePochakedPostModel.swift @@ -1,18 +1,18 @@ +//// +//// MyProfilePochakedPostModel.swift +//// pochak +//// +//// Created by Seo Cindy on 12/28/23. +//// // -// MyProfilePochakedPostModel.swift -// pochak +//struct MyProfilePochakPostResponse: Codable { +// let isSuccess: Bool +// let code: String +// let message: String +// let result: MyProfilePochakPostModel +//} // -// Created by Seo Cindy on 12/28/23. -// - -struct MyProfilePochakPostResponse: Codable { - let isSuccess: Bool - let code: String - let message: String - let result: MyProfilePochakPostModel -} - -struct MyProfilePochakPostModel : Codable { - var pageInfo : PageDataModel - var postList : [PostDataModel] -} +//struct MyProfilePochakPostModel : Codable { +// var pageInfo : PageDataModel +// var postList : [PostDataModel] +//} diff --git a/pochak/pochak/UI/Profile/MyProfile/ProfileAPI/MyProfilePostDataManager.swift b/pochak/pochak/UI/Profile/MyProfile/ProfileAPI/MyProfilePostDataManager.swift index ecbec8b7..1bb9a537 100644 --- a/pochak/pochak/UI/Profile/MyProfile/ProfileAPI/MyProfilePostDataManager.swift +++ b/pochak/pochak/UI/Profile/MyProfile/ProfileAPI/MyProfilePostDataManager.swift @@ -1,78 +1,78 @@ +//// +//// MyProfilePostDataManager.swift +//// pochak +//// +//// Created by Seo Cindy on 12/28/23. +//// // -// MyProfilePostDataManager.swift -// pochak +//import Alamofire // -// Created by Seo Cindy on 12/28/23. +//struct SimpleJson: Codable { +// var isSuccess: Bool +// var code: String +// var message: String +//} // - -import Alamofire - -struct SimpleJson: Codable { - var isSuccess: Bool - var code: String - var message: String -} - -class MyProfilePostDataManager { - - static let shared = MyProfilePostDataManager() - - func myProfileUserAndPochakedPostDataManager(_ handle : String, _ page : Int, _ completion: @escaping (NetworkResult400) -> Void) { - - let url = "\(APIConstants.baseURL)/api/v2/members/\(handle)?page=\(page)" - - AF.request(url, - method: .get, - encoding: URLEncoding.default, - interceptor: RequestInterceptor.getRequestInterceptor()) - .validate() - .responseDecodable(of: MyProfileUserAndPochakedPostResponse.self) { response in - print(response) - switch response.result { - case .success(let result): - let resultData = result.result - completion(.success(resultData)) - case .failure(let error): - print("myProfileUserAndPochakedPostDataManager error : \(error.localizedDescription)") - if let data = response.data, let errorMessage = String(data: data, encoding: .utf8) { - print("Failure Data: \(errorMessage)") - } - if let statusCode = response.response?.statusCode { - if statusCode == 400 { - completion(.MEMBER4002) - } - } - } - } - } - - func myProfilePochakPostDataManager(_ handle : String, _ page : Int, _ completion: @escaping (MyProfilePochakPostModel) -> Void) { - - let url = "\(APIConstants.baseURLv2)/api/v2/members/\(handle)/upload?page=\(page)" - - AF.request(url, - method: .get, - encoding: URLEncoding.default, - interceptor: RequestInterceptor.getRequestInterceptor()) - .validate() - .responseDecodable(of: MyProfilePochakPostResponse.self) { response in - print(response) - switch response.result { - case .success(let result): - let resultData = result.result - completion(resultData) - case .failure(let error): - print("myProfilePochakPostDataManager error : \(error.localizedDescription)") - guard let data = response.data else { return } - // data - let decoder = JSONDecoder() - if let json = try? decoder.decode(SimpleJson.self, from: data) { - print(">>>>> decoder : \(json.code)") // hyeon - } - if let errorMessage = String(data: data, encoding: .utf8) { - print("Failure Data: \(errorMessage)") - } - } - } - } -} +//class MyProfilePostDataManager { +// +// static let shared = MyProfilePostDataManager() +// +// func myProfileUserAndPochakedPostDataManager(_ handle : String, _ page : Int, _ completion: @escaping (NetworkResult400) -> Void) { +// +// let url = "\(APIConstants.baseURL)/api/v2/members/\(handle)?page=\(page)" +// +// AF.request(url, +// method: .get, +// encoding: URLEncoding.default, +// interceptor: RequestInterceptor.getRequestInterceptor()) +// .validate() +// .responseDecodable(of: MyProfileUserAndPochakedPostResponse.self) { response in +// print(response) +// switch response.result { +// case .success(let result): +// let resultData = result.result +// completion(.success(resultData)) +// case .failure(let error): +// print("myProfileUserAndPochakedPostDataManager error : \(error.localizedDescription)") +// if let data = response.data, let errorMessage = String(data: data, encoding: .utf8) { +// print("Failure Data: \(errorMessage)") +// } +// if let statusCode = response.response?.statusCode { +// if statusCode == 400 { +// completion(.MEMBER4002) +// } +// } +// } +// } +// } +// +// func myProfilePochakPostDataManager(_ handle : String, _ page : Int, _ completion: @escaping (MyProfilePochakPostModel) -> Void) { +// +// let url = "\(APIConstants.baseURLv2)/api/v2/members/\(handle)/upload?page=\(page)" +// +// AF.request(url, +// method: .get, +// encoding: URLEncoding.default, +// interceptor: RequestInterceptor.getRequestInterceptor()) +// .validate() +// .responseDecodable(of: MyProfilePochakPostResponse.self) { response in +// print(response) +// switch response.result { +// case .success(let result): +// let resultData = result.result +// completion(resultData) +// case .failure(let error): +// print("myProfilePochakPostDataManager error : \(error.localizedDescription)") +// guard let data = response.data else { return } +// // data +// let decoder = JSONDecoder() +// if let json = try? decoder.decode(SimpleJson.self, from: data) { +// print(">>>>> decoder : \(json.code)") // hyeon +// } +// if let errorMessage = String(data: data, encoding: .utf8) { +// print("Failure Data: \(errorMessage)") +// } +// } +// } +// } +//} From 495dd3ff872caef2d1e6defc10ce737d3644d6ad Mon Sep 17 00:00:00 2001 From: Jungyeon Seo Date: Mon, 30 Sep 2024 20:12:10 +0900 Subject: [PATCH 02/54] Refactor : pochak post retrieval api --- pochak/pochak.xcodeproj/project.pbxproj | 24 ++++- .../APIs/Profile/PochakPostRetrievalAPI.swift | 37 +++++++ .../Profile/PochakPostRetrievalResponse.swift | 20 ++++ .../Profile/ProfileRetrievalResponse.swift | 4 +- .../Network/Services/ProfileService.swift | 17 +++ .../MyProfileTabViewController.swift | 1 - .../PochakPostTabmanViewController.swift | 49 ++++++++- .../PochakedPostTabmanViewController.swift | 101 +++++++++++++----- .../MyProfilePochakPostModel.swift | 0 .../MyProfilePochakedPostModel.swift | 0 .../MyProfilePostDataManager.swift | 0 11 files changed, 212 insertions(+), 41 deletions(-) create mode 100644 pochak/pochak/Network/APIs/Profile/PochakPostRetrievalAPI.swift create mode 100644 pochak/pochak/Network/Models/Profile/PochakPostRetrievalResponse.swift rename pochak/pochak/UI/Profile/MyProfile/{ProfileAPI => ProfileAPI_fin}/MyProfilePochakPostModel.swift (100%) rename pochak/pochak/UI/Profile/MyProfile/{ProfileAPI => ProfileAPI_fin}/MyProfilePochakedPostModel.swift (100%) rename pochak/pochak/UI/Profile/MyProfile/{ProfileAPI => ProfileAPI_fin}/MyProfilePostDataManager.swift (100%) diff --git a/pochak/pochak.xcodeproj/project.pbxproj b/pochak/pochak.xcodeproj/project.pbxproj index 3cc85aa5..f2bb8ecf 100644 --- a/pochak/pochak.xcodeproj/project.pbxproj +++ b/pochak/pochak.xcodeproj/project.pbxproj @@ -120,6 +120,10 @@ 3742617D2C359D6100B67886 /* CheckHandleDuplicationDataManager.swift in Sources */ = {isa = PBXBuildFile; fileRef = 3742617C2C359D6100B67886 /* CheckHandleDuplicationDataManager.swift */; }; 3742617F2C359D6D00B67886 /* CheckHandleDuplicationDataModel.swift in Sources */ = {isa = PBXBuildFile; fileRef = 3742617E2C359D6D00B67886 /* CheckHandleDuplicationDataModel.swift */; }; 3747E9722BF3827500364BED /* SettingsViewController.swift in Sources */ = {isa = PBXBuildFile; fileRef = 3747E9712BF3827500364BED /* SettingsViewController.swift */; }; + 374E461F2CAABAF3008AE361 /* PochakPostRetrievalAPI.swift in Sources */ = {isa = PBXBuildFile; fileRef = 374E461E2CAABAF3008AE361 /* PochakPostRetrievalAPI.swift */; }; + 374E46232CAABB31008AE361 /* PochakPostRetrievalResponse.swift in Sources */ = {isa = PBXBuildFile; fileRef = 374E46222CAABB31008AE361 /* PochakPostRetrievalResponse.swift */; }; + 374E46252CAABE08008AE361 /* ProfileUpdateResponse.swift in Sources */ = {isa = PBXBuildFile; fileRef = 374E46242CAABE07008AE361 /* ProfileUpdateResponse.swift */; }; + 374E46292CAABE50008AE361 /* ProfileUpdateAPI.swift in Sources */ = {isa = PBXBuildFile; fileRef = 374E46282CAABE50008AE361 /* ProfileUpdateAPI.swift */; }; 3766F4022C3706DC001DD239 /* BlockedUserTableViewCell.xib in Resources */ = {isa = PBXBuildFile; fileRef = 3766F4012C3706DC001DD239 /* BlockedUserTableViewCell.xib */; }; 3766F4032C3706DC001DD239 /* BlockedUserTableViewCell.swift in Sources */ = {isa = PBXBuildFile; fileRef = 3766F4002C3706DC001DD239 /* BlockedUserTableViewCell.swift */; }; 3766F4062C370A7C001DD239 /* BlockedUserListDataManager.swift in Sources */ = {isa = PBXBuildFile; fileRef = 3766F4052C370A7C001DD239 /* BlockedUserListDataManager.swift */; }; @@ -361,6 +365,10 @@ 3742617C2C359D6100B67886 /* CheckHandleDuplicationDataManager.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = CheckHandleDuplicationDataManager.swift; sourceTree = ""; }; 3742617E2C359D6D00B67886 /* CheckHandleDuplicationDataModel.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = CheckHandleDuplicationDataModel.swift; sourceTree = ""; }; 3747E9712BF3827500364BED /* SettingsViewController.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = SettingsViewController.swift; sourceTree = ""; }; + 374E461E2CAABAF3008AE361 /* PochakPostRetrievalAPI.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = PochakPostRetrievalAPI.swift; sourceTree = ""; }; + 374E46222CAABB31008AE361 /* PochakPostRetrievalResponse.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = PochakPostRetrievalResponse.swift; sourceTree = ""; }; + 374E46242CAABE07008AE361 /* ProfileUpdateResponse.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = ProfileUpdateResponse.swift; sourceTree = ""; }; + 374E46282CAABE50008AE361 /* ProfileUpdateAPI.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = ProfileUpdateAPI.swift; sourceTree = ""; }; 3750669E2C3BB1660036E264 /* pochak.entitlements */ = {isa = PBXFileReference; lastKnownFileType = text.plist.entitlements; path = pochak.entitlements; sourceTree = ""; }; 3766F4002C3706DC001DD239 /* BlockedUserTableViewCell.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = BlockedUserTableViewCell.swift; sourceTree = ""; }; 3766F4012C3706DC001DD239 /* BlockedUserTableViewCell.xib */ = {isa = PBXFileReference; lastKnownFileType = file.xib; path = BlockedUserTableViewCell.xib; sourceTree = ""; }; @@ -997,7 +1005,7 @@ 37A284C02B52FC910023EB9D /* UpdateProfileViewController.swift */, 3742616A2C3075B400B67886 /* Setting */, 37D311D32B53053C00A1D7C1 /* ProfileUpdateAPI */, - 37C3AF442B3CB26000B4C79C /* ProfileAPI */, + 37C3AF442B3CB26000B4C79C /* ProfileAPI_fin */, 3769D6CC2B3C560200294CD1 /* PostListTabman */, 3769D6CB2B3C55E500294CD1 /* FollowListTabman */, ); @@ -1031,6 +1039,8 @@ isa = PBXGroup; children = ( 376EA1282CAAADCF00FEFB63 /* ProfileRetrievalAPI.swift */, + 374E461E2CAABAF3008AE361 /* PochakPostRetrievalAPI.swift */, + 374E46282CAABE50008AE361 /* ProfileUpdateAPI.swift */, ); path = Profile; sourceTree = ""; @@ -1038,20 +1048,22 @@ 376EA12A2CAAAE3600FEFB63 /* Profile */ = { isa = PBXGroup; children = ( - 376EA12B2CAAAE5600FEFB63 /* ProfileRetrievalResponse.swift */, 376EA12D2CAAAE6800FEFB63 /* ProfileRetrievalRequest.swift */, + 376EA12B2CAAAE5600FEFB63 /* ProfileRetrievalResponse.swift */, + 374E46222CAABB31008AE361 /* PochakPostRetrievalResponse.swift */, + 374E46242CAABE07008AE361 /* ProfileUpdateResponse.swift */, ); path = Profile; sourceTree = ""; }; - 37C3AF442B3CB26000B4C79C /* ProfileAPI */ = { + 37C3AF442B3CB26000B4C79C /* ProfileAPI_fin */ = { isa = PBXGroup; children = ( 37C3AF472B3CB2B300B4C79C /* MyProfilePochakedPostModel.swift */, 37C3AF492B3CB2C700B4C79C /* MyProfilePochakPostModel.swift */, 37C3AF452B3CB29A00B4C79C /* MyProfilePostDataManager.swift */, ); - path = ProfileAPI; + path = ProfileAPI_fin; sourceTree = ""; }; 37D311D32B53053C00A1D7C1 /* ProfileUpdateAPI */ = { @@ -1738,6 +1750,7 @@ 3766F40C2C3736F1001DD239 /* RequestInterceptor.swift in Sources */, EA0F23662C319C030014F94E /* PreviewAlarmViewController.swift in Sources */, 0822A0422CA197E700F87E2C /* PostReportAPI.swift in Sources */, + 374E46292CAABE50008AE361 /* ProfileUpdateAPI.swift in Sources */, 0844D7EF2BF219F6001154AC /* DeleteViewCell.swift in Sources */, 374261742C3092B900B67886 /* UnblockDataModel.swift in Sources */, EA2CD63B2C5F463700644EFE /* NetworkService.swift in Sources */, @@ -1773,6 +1786,7 @@ 376EA12E2CAAAE6800FEFB63 /* ProfileRetrievalRequest.swift in Sources */, EA96D0562C8F192B00D80562 /* TagApproveResponse.swift in Sources */, 3769D6B62B3C302C00294CD1 /* JoinDataModel.swift in Sources */, + 374E461F2CAABAF3008AE361 /* PochakPostRetrievalAPI.swift in Sources */, 084AF4C72A5D831100C6454A /* HomeCollectionViewCell.swift in Sources */, 37C3AF4A2B3CB2C700B4C79C /* MyProfilePochakPostModel.swift in Sources */, 08C02EF82BF394B800627C21 /* UIAlertController+.swift in Sources */, @@ -1799,6 +1813,7 @@ 0820B1902A63A18100604DA8 /* ReplyTableViewCell.swift in Sources */, 374261702C30917600B67886 /* BlockDataModel.swift in Sources */, 083249782C295E4000A77C03 /* CustomAlertViewController.swift in Sources */, + 374E46252CAABE08008AE361 /* ProfileUpdateResponse.swift in Sources */, 37C3AF482B3CB2B300B4C79C /* MyProfilePochakedPostModel.swift in Sources */, 0822A04F2CA1980200F87E2C /* FollowAPI.swift in Sources */, EA2CD6392C5F45E300644EFE /* BaseAPI.swift in Sources */, @@ -1847,6 +1862,7 @@ 0822A07D2CA19A9A00F87E2C /* UICommentModel.swift in Sources */, EA7E146D2C8EA119001DA769 /* AlarmListResponse.swift in Sources */, 08EB99B42C53D76C00FAC08A /* UIScrollView+.swift in Sources */, + 374E46232CAABB31008AE361 /* PochakPostRetrievalResponse.swift in Sources */, EA6306DA2C2BFE83000DB0A7 /* CustomTabbar.swift in Sources */, EA2CD6422C5F5A0500644EFE /* HomeService.swift in Sources */, EA7E14652C858EFA001DA769 /* CameraUploadRequest.swift in Sources */, diff --git a/pochak/pochak/Network/APIs/Profile/PochakPostRetrievalAPI.swift b/pochak/pochak/Network/APIs/Profile/PochakPostRetrievalAPI.swift new file mode 100644 index 00000000..81058e77 --- /dev/null +++ b/pochak/pochak/Network/APIs/Profile/PochakPostRetrievalAPI.swift @@ -0,0 +1,37 @@ +// +// PochakPostRetrievalAPI.swift +// pochak +// +// Created by Seo Cindy on 9/30/24. +// + +import Foundation + + +enum PochakPostRetrievalAPI { + case getPochakPost(handle: String, request: ProfileRetrievalRequest) +} + +extension PochakPostRetrievalAPI: BaseAPI { + + typealias Response = PochakPostRetrievalResponse + + var method: HTTPMethod { + switch self { + case .getPochakPost: return .get + } + } + + var path: String { + switch self { + case .getPochakPost(let handle, _): return "/v2/members/\(handle)/upload" + } + } + + var parameters: RequestParams? { + switch self { + case .getPochakPost(_, let request): return .query(request) + } + } +} + diff --git a/pochak/pochak/Network/Models/Profile/PochakPostRetrievalResponse.swift b/pochak/pochak/Network/Models/Profile/PochakPostRetrievalResponse.swift new file mode 100644 index 00000000..87286140 --- /dev/null +++ b/pochak/pochak/Network/Models/Profile/PochakPostRetrievalResponse.swift @@ -0,0 +1,20 @@ +// +// PochakPostRetrievalResponse.swift +// pochak +// +// Created by Seo Cindy on 9/30/24. +// + +import Foundation + +struct PochakPostRetrievalResponse: Codable { + let isSuccess: Bool + let code: String + let message: String + let result: PochakPostRetrievalResult +} + +struct PochakPostRetrievalResult : Codable { + var pageInfo : ProfilePageInfo + var postList : [ProfilePostList] +} diff --git a/pochak/pochak/Network/Models/Profile/ProfileRetrievalResponse.swift b/pochak/pochak/Network/Models/Profile/ProfileRetrievalResponse.swift index 2bcb80d2..51f82494 100644 --- a/pochak/pochak/Network/Models/Profile/ProfileRetrievalResponse.swift +++ b/pochak/pochak/Network/Models/Profile/ProfileRetrievalResponse.swift @@ -24,7 +24,7 @@ struct ProfileRetrievalResult : Codable { var followingCount: Int? var isFollow: Bool? var pageInfo : ProfilePageInfo - var postList : [ProfilePochakedPostList] + var postList : [ProfilePostList] } struct ProfilePageInfo : Codable { @@ -34,7 +34,7 @@ struct ProfilePageInfo : Codable { var size : Int } -struct ProfilePochakedPostList : Codable { +struct ProfilePostList : Codable { var postId : Int var postImage : String } diff --git a/pochak/pochak/Network/Services/ProfileService.swift b/pochak/pochak/Network/Services/ProfileService.swift index 18f5af2c..4dd542c4 100644 --- a/pochak/pochak/Network/Services/ProfileService.swift +++ b/pochak/pochak/Network/Services/ProfileService.swift @@ -26,4 +26,21 @@ struct ProfileService { } } } + + static func getProfilePochakPosts( + handle: String, + request: PochakPostRetrievalRequest, + completion: @escaping (_ succeed: PochakPostRetrievalResponse?, _ failed: NetworkError?) -> Void) { + NetworkService.shared.request(PochakPostRetrievalAPI.getPochakPost(handle: handle, request: request)) { response in + switch response { + case .success(let data): + completion(data, nil) + case .failure(let error): + print("=== getProfilePochakPosts error ===") + print(error.localizedDescription) + completion(nil, error) + } + } + } + } diff --git a/pochak/pochak/UI/Profile/MyProfile/MyProfileTabViewController.swift b/pochak/pochak/UI/Profile/MyProfile/MyProfileTabViewController.swift index d9d44552..1ff16548 100644 --- a/pochak/pochak/UI/Profile/MyProfile/MyProfileTabViewController.swift +++ b/pochak/pochak/UI/Profile/MyProfile/MyProfileTabViewController.swift @@ -126,7 +126,6 @@ class MyProfileTabViewController: UIViewController { } private func setUpData() { - let request = ProfileRetrievalRequest(page: 0) ProfileService.getProfile(handle: handle, request: request) { [weak self] data, failed in guard let data = data else { diff --git a/pochak/pochak/UI/Profile/MyProfile/PostListTabman/PochakPostTabmanViewController.swift b/pochak/pochak/UI/Profile/MyProfile/PostListTabman/PochakPostTabmanViewController.swift index b84a1ad2..7e97ee02 100644 --- a/pochak/pochak/UI/Profile/MyProfile/PostListTabman/PochakPostTabmanViewController.swift +++ b/pochak/pochak/UI/Profile/MyProfile/PostListTabman/PochakPostTabmanViewController.swift @@ -62,13 +62,33 @@ class PochakPostTabmanViewController: UIViewController { } private func setUpData() { - MyProfilePostDataManager.shared.myProfilePochakPostDataManager(receivedHandle ?? "",currentFetchingPage,{resultData in - let newPosts = resultData.postList - let startIndex = resultData.postList.count + isCurrentlyFetching = true + let request = ProfileRetrievalRequest(page: currentFetchingPage) + ProfileService.getProfilePochakPosts(handle: receivedHandle, request: request) { [weak self] data, failed in + guard let data = data else { + // 에러가 난 경우, alert 창 present + switch failed { + case .disconnected: + self?.present(UIAlertController.networkErrorAlert(title: failed!.localizedDescription), animated: true) + case .serverError: + self?.present(UIAlertController.networkErrorAlert(title: failed!.localizedDescription), animated: true) + case .unknownError: + self?.present(UIAlertController.networkErrorAlert(title: failed!.localizedDescription), animated: true) + default: + self?.present(UIAlertController.networkErrorAlert(title: "요청에 실패하였습니다."), animated: true) + } + return + } + + print("=== Profile Pochak Tab, setup data succeeded ===") + print("== data: \(data)") + + let newPosts = data.result.postList + let startIndex = data.result.postList.count let endIndex = startIndex + newPosts.count let newIndexPaths = (startIndex..>>>>>> PochakPostDataManager is currently reloading!!!!!!!") +// } else { +// self.postCollectionView.insertItems(at: newIndexPaths) +// } +// self.isCurrentlyFetching = false +// self.currentFetchingPage += 1; +// } +// }) } } diff --git a/pochak/pochak/UI/Profile/MyProfile/PostListTabman/PochakedPostTabmanViewController.swift b/pochak/pochak/UI/Profile/MyProfile/PostListTabman/PochakedPostTabmanViewController.swift index 9ba038d4..cda8ed48 100644 --- a/pochak/pochak/UI/Profile/MyProfile/PostListTabman/PochakedPostTabmanViewController.swift +++ b/pochak/pochak/UI/Profile/MyProfile/PostListTabman/PochakedPostTabmanViewController.swift @@ -62,37 +62,80 @@ class PochakedPostTabmanViewController: UIViewController { private func setUpData() { isCurrentlyFetching = true - MyProfilePostDataManager.shared.myProfileUserAndPochakedPostDataManager(receivedHandle ?? "", currentFetchingPage, { response in - switch response { - case .success(let resultData): - - let newPosts = resultData.postList - let startIndex = resultData.postList.count - print("startIndex : \(startIndex)") - let endIndex = startIndex + newPosts.count - print("endIndex : \(endIndex)") - let newIndexPaths = (startIndex..>>>>>> PochakedPostDataManager is currently reloading!!!!!!!") - } else { - self.postCollectionView.insertItems(at: newIndexPaths) - print(">>>>>>> PochakedPostDataManager is currently fethcing!!!!!!!") - } - self.isCurrentlyFetching = false - self.currentFetchingPage += 1; + let request = ProfileRetrievalRequest(page: currentFetchingPage) + ProfileService.getProfile(handle: receivedHandle, request: request) { [weak self] data, failed in + guard let data = data else { + // 에러가 난 경우, alert 창 present + switch failed { + case .disconnected: + self?.present(UIAlertController.networkErrorAlert(title: failed!.localizedDescription), animated: true) + case .serverError: + self?.present(UIAlertController.networkErrorAlert(title: failed!.localizedDescription), animated: true) + case .unknownError: + self?.present(UIAlertController.networkErrorAlert(title: failed!.localizedDescription), animated: true) + default: + self?.present(UIAlertController.networkErrorAlert(title: "요청에 실패하였습니다."), animated: true) } - case .MEMBER4002: - print("유효하지 않은 멤버의 handle입니다.") + return } - }) - } + + print("=== Profile Pochaked Tab, setup data succeeded ===") + print("== data: \(data)") + + let newPosts = data.result.postList + let startIndex = data.result.postList.count + print("startIndex : \(startIndex)") + let endIndex = startIndex + newPosts.count + print("endIndex : \(endIndex)") + let newIndexPaths = (startIndex..>>>>>> PochakedPostDataManager is currently reloading!!!!!!!") + } else { + self.postCollectionView.insertItems(at: newIndexPaths) + print(">>>>>>> PochakedPostDataManager is currently fethcing!!!!!!!") + } + self.isCurrentlyFetching = false + self.currentFetchingPage += 1; + } + } +// MyProfilePostDataManager.shared.myProfileUserAndPochakedPostDataManager(receivedHandle ?? "", currentFetchingPage, { response in +// switch response { +// case .success(let resultData): +// +// let newPosts = resultData.postList +// let startIndex = resultData.postList.count +// print("startIndex : \(startIndex)") +// let endIndex = startIndex + newPosts.count +// print("endIndex : \(endIndex)") +// let newIndexPaths = (startIndex..>>>>>> PochakedPostDataManager is currently reloading!!!!!!!") +// } else { +// self.postCollectionView.insertItems(at: newIndexPaths) +// print(">>>>>>> PochakedPostDataManager is currently fethcing!!!!!!!") +// } +// self.isCurrentlyFetching = false +// self.currentFetchingPage += 1; +// } +// case .MEMBER4002: +// print("유효하지 않은 멤버의 handle입니다.") +// } +// }) +// } } // MARK: - Extension : UICollectionViewDelegate, UICollectionViewDataSource, UICollectionViewDelegateFlowLayout, UIScrollViewDelegate diff --git a/pochak/pochak/UI/Profile/MyProfile/ProfileAPI/MyProfilePochakPostModel.swift b/pochak/pochak/UI/Profile/MyProfile/ProfileAPI_fin/MyProfilePochakPostModel.swift similarity index 100% rename from pochak/pochak/UI/Profile/MyProfile/ProfileAPI/MyProfilePochakPostModel.swift rename to pochak/pochak/UI/Profile/MyProfile/ProfileAPI_fin/MyProfilePochakPostModel.swift diff --git a/pochak/pochak/UI/Profile/MyProfile/ProfileAPI/MyProfilePochakedPostModel.swift b/pochak/pochak/UI/Profile/MyProfile/ProfileAPI_fin/MyProfilePochakedPostModel.swift similarity index 100% rename from pochak/pochak/UI/Profile/MyProfile/ProfileAPI/MyProfilePochakedPostModel.swift rename to pochak/pochak/UI/Profile/MyProfile/ProfileAPI_fin/MyProfilePochakedPostModel.swift diff --git a/pochak/pochak/UI/Profile/MyProfile/ProfileAPI/MyProfilePostDataManager.swift b/pochak/pochak/UI/Profile/MyProfile/ProfileAPI_fin/MyProfilePostDataManager.swift similarity index 100% rename from pochak/pochak/UI/Profile/MyProfile/ProfileAPI/MyProfilePostDataManager.swift rename to pochak/pochak/UI/Profile/MyProfile/ProfileAPI_fin/MyProfilePostDataManager.swift From db36d184bb0fa31859f50870cfd135e3c042b559 Mon Sep 17 00:00:00 2001 From: Jungyeon Seo Date: Mon, 30 Sep 2024 20:26:51 +0900 Subject: [PATCH 03/54] Refactor : profile update api --- pochak/pochak.xcodeproj/project.pbxproj | 10 ++-- .../APIs/Profile/ProfileUpdateAPI.swift | 36 +++++++++++++ .../Models/Profile/ProfileUpdateRequest.swift | 13 +++++ .../Profile/ProfileUpdateResponse.swift} | 6 ++- .../Network/Services/ProfileService.swift | 17 ++++++ .../ProfileUpdateDataManager.swift | 54 ------------------- .../ProfileUpdateDataManager.swift | 54 +++++++++++++++++++ .../ProfileUpdateDataModel.swift | 20 +++++++ .../UpdateProfileViewController.swift | 52 ++++++++++++++---- 9 files changed, 192 insertions(+), 70 deletions(-) create mode 100644 pochak/pochak/Network/APIs/Profile/ProfileUpdateAPI.swift create mode 100644 pochak/pochak/Network/Models/Profile/ProfileUpdateRequest.swift rename pochak/pochak/{UI/Profile/MyProfile/ProfileUpdateAPI/ProfileUpdateDataModel.swift => Network/Models/Profile/ProfileUpdateResponse.swift} (78%) delete mode 100644 pochak/pochak/UI/Profile/MyProfile/ProfileUpdateAPI/ProfileUpdateDataManager.swift create mode 100644 pochak/pochak/UI/Profile/MyProfile/ProfileUpdateAPI_fin/ProfileUpdateDataManager.swift create mode 100644 pochak/pochak/UI/Profile/MyProfile/ProfileUpdateAPI_fin/ProfileUpdateDataModel.swift diff --git a/pochak/pochak.xcodeproj/project.pbxproj b/pochak/pochak.xcodeproj/project.pbxproj index f2bb8ecf..90b8049f 100644 --- a/pochak/pochak.xcodeproj/project.pbxproj +++ b/pochak/pochak.xcodeproj/project.pbxproj @@ -124,6 +124,7 @@ 374E46232CAABB31008AE361 /* PochakPostRetrievalResponse.swift in Sources */ = {isa = PBXBuildFile; fileRef = 374E46222CAABB31008AE361 /* PochakPostRetrievalResponse.swift */; }; 374E46252CAABE08008AE361 /* ProfileUpdateResponse.swift in Sources */ = {isa = PBXBuildFile; fileRef = 374E46242CAABE07008AE361 /* ProfileUpdateResponse.swift */; }; 374E46292CAABE50008AE361 /* ProfileUpdateAPI.swift in Sources */ = {isa = PBXBuildFile; fileRef = 374E46282CAABE50008AE361 /* ProfileUpdateAPI.swift */; }; + 374E462B2CAABF7B008AE361 /* ProfileUpdateRequest.swift in Sources */ = {isa = PBXBuildFile; fileRef = 374E462A2CAABF7A008AE361 /* ProfileUpdateRequest.swift */; }; 3766F4022C3706DC001DD239 /* BlockedUserTableViewCell.xib in Resources */ = {isa = PBXBuildFile; fileRef = 3766F4012C3706DC001DD239 /* BlockedUserTableViewCell.xib */; }; 3766F4032C3706DC001DD239 /* BlockedUserTableViewCell.swift in Sources */ = {isa = PBXBuildFile; fileRef = 3766F4002C3706DC001DD239 /* BlockedUserTableViewCell.swift */; }; 3766F4062C370A7C001DD239 /* BlockedUserListDataManager.swift in Sources */ = {isa = PBXBuildFile; fileRef = 3766F4052C370A7C001DD239 /* BlockedUserListDataManager.swift */; }; @@ -369,6 +370,7 @@ 374E46222CAABB31008AE361 /* PochakPostRetrievalResponse.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = PochakPostRetrievalResponse.swift; sourceTree = ""; }; 374E46242CAABE07008AE361 /* ProfileUpdateResponse.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = ProfileUpdateResponse.swift; sourceTree = ""; }; 374E46282CAABE50008AE361 /* ProfileUpdateAPI.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = ProfileUpdateAPI.swift; sourceTree = ""; }; + 374E462A2CAABF7A008AE361 /* ProfileUpdateRequest.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = ProfileUpdateRequest.swift; sourceTree = ""; }; 3750669E2C3BB1660036E264 /* pochak.entitlements */ = {isa = PBXFileReference; lastKnownFileType = text.plist.entitlements; path = pochak.entitlements; sourceTree = ""; }; 3766F4002C3706DC001DD239 /* BlockedUserTableViewCell.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = BlockedUserTableViewCell.swift; sourceTree = ""; }; 3766F4012C3706DC001DD239 /* BlockedUserTableViewCell.xib */ = {isa = PBXFileReference; lastKnownFileType = file.xib; path = BlockedUserTableViewCell.xib; sourceTree = ""; }; @@ -1004,7 +1006,7 @@ 3769D6B82B3C345800294CD1 /* MyProfileTabViewController.swift */, 37A284C02B52FC910023EB9D /* UpdateProfileViewController.swift */, 3742616A2C3075B400B67886 /* Setting */, - 37D311D32B53053C00A1D7C1 /* ProfileUpdateAPI */, + 37D311D32B53053C00A1D7C1 /* ProfileUpdateAPI_fin */, 37C3AF442B3CB26000B4C79C /* ProfileAPI_fin */, 3769D6CC2B3C560200294CD1 /* PostListTabman */, 3769D6CB2B3C55E500294CD1 /* FollowListTabman */, @@ -1052,6 +1054,7 @@ 376EA12B2CAAAE5600FEFB63 /* ProfileRetrievalResponse.swift */, 374E46222CAABB31008AE361 /* PochakPostRetrievalResponse.swift */, 374E46242CAABE07008AE361 /* ProfileUpdateResponse.swift */, + 374E462A2CAABF7A008AE361 /* ProfileUpdateRequest.swift */, ); path = Profile; sourceTree = ""; @@ -1066,13 +1069,13 @@ path = ProfileAPI_fin; sourceTree = ""; }; - 37D311D32B53053C00A1D7C1 /* ProfileUpdateAPI */ = { + 37D311D32B53053C00A1D7C1 /* ProfileUpdateAPI_fin */ = { isa = PBXGroup; children = ( 37D311D62B53057700A1D7C1 /* ProfileUpdateDataModel.swift */, 37D311D42B53056700A1D7C1 /* ProfileUpdateDataManager.swift */, ); - path = ProfileUpdateAPI; + path = ProfileUpdateAPI_fin; sourceTree = ""; }; 37D311D82B53131D00A1D7C1 /* LogoutAPI */ = { @@ -1860,6 +1863,7 @@ 371D337A2B4E8D1F0084FF6A /* KeychainManager.swift in Sources */, EAF918542AA4692E0037C270 /* NetworkResult.swift in Sources */, 0822A07D2CA19A9A00F87E2C /* UICommentModel.swift in Sources */, + 374E462B2CAABF7B008AE361 /* ProfileUpdateRequest.swift in Sources */, EA7E146D2C8EA119001DA769 /* AlarmListResponse.swift in Sources */, 08EB99B42C53D76C00FAC08A /* UIScrollView+.swift in Sources */, 374E46232CAABB31008AE361 /* PochakPostRetrievalResponse.swift in Sources */, diff --git a/pochak/pochak/Network/APIs/Profile/ProfileUpdateAPI.swift b/pochak/pochak/Network/APIs/Profile/ProfileUpdateAPI.swift new file mode 100644 index 00000000..8a51931e --- /dev/null +++ b/pochak/pochak/Network/APIs/Profile/ProfileUpdateAPI.swift @@ -0,0 +1,36 @@ +// +// ProfileUpdateAPI.swift +// pochak +// +// Created by Seo Cindy on 9/30/24. +// + +import Foundation + + +enum ProfileUpdateAPI { + case updateProfile(handle: String, request: ProfileUpdateRequest) +} + +extension ProfileUpdateAPI: BaseAPI { + + typealias Response = ProfileUpdateResponse + + var method: HTTPMethod { + switch self { + case .updateProfile: return .post + } + } + + var path: String { + switch self { + case .updateProfile(let handle, _): return "/v2/members/\(handle)" + } + } + + var parameters: RequestParams? { + switch self { + case .updateProfile(_, let request): return .body(request) + } + } +} diff --git a/pochak/pochak/Network/Models/Profile/ProfileUpdateRequest.swift b/pochak/pochak/Network/Models/Profile/ProfileUpdateRequest.swift new file mode 100644 index 00000000..05139547 --- /dev/null +++ b/pochak/pochak/Network/Models/Profile/ProfileUpdateRequest.swift @@ -0,0 +1,13 @@ +// +// ProfileUpdateRequest.swift +// pochak +// +// Created by Seo Cindy on 9/30/24. +// + +import Foundation + +struct ProfileUpdateRequest: Encodable { + let name: String + let message: String +} diff --git a/pochak/pochak/UI/Profile/MyProfile/ProfileUpdateAPI/ProfileUpdateDataModel.swift b/pochak/pochak/Network/Models/Profile/ProfileUpdateResponse.swift similarity index 78% rename from pochak/pochak/UI/Profile/MyProfile/ProfileUpdateAPI/ProfileUpdateDataModel.swift rename to pochak/pochak/Network/Models/Profile/ProfileUpdateResponse.swift index bf6978a9..fbbf5e38 100644 --- a/pochak/pochak/UI/Profile/MyProfile/ProfileUpdateAPI/ProfileUpdateDataModel.swift +++ b/pochak/pochak/Network/Models/Profile/ProfileUpdateResponse.swift @@ -1,10 +1,12 @@ // -// MyProfileUpdateDataModel.swift +// ProfileUpdateResponse.swift // pochak // -// Created by Seo Cindy on 1/14/24. +// Created by Seo Cindy on 9/30/24. // +import Foundation + struct ProfileUpdateResponse: Codable { let isSuccess: Bool let code: String diff --git a/pochak/pochak/Network/Services/ProfileService.swift b/pochak/pochak/Network/Services/ProfileService.swift index 4dd542c4..3ec41304 100644 --- a/pochak/pochak/Network/Services/ProfileService.swift +++ b/pochak/pochak/Network/Services/ProfileService.swift @@ -43,4 +43,21 @@ struct ProfileService { } } + static func profileUpdate( + handle: String, + files: [(Data, String, String)], + request: ProfileUpdateRequest, + completion: @escaping (_ succeed: ProfileUpdateResponse?, _ failed: NetworkError?) -> Void) { + NetworkService.shared.uploadMultipart(ProfileUpdateAPI.updateProfile(handle: handle, request: request), files: files) { response in + switch response { + case .success(let data): + completion(data, nil) + case .failure(let error): + print("=== profileUpdate error ===") + print(error.localizedDescription) + completion(nil, error) + } + } + } + } diff --git a/pochak/pochak/UI/Profile/MyProfile/ProfileUpdateAPI/ProfileUpdateDataManager.swift b/pochak/pochak/UI/Profile/MyProfile/ProfileUpdateAPI/ProfileUpdateDataManager.swift deleted file mode 100644 index 6824415a..00000000 --- a/pochak/pochak/UI/Profile/MyProfile/ProfileUpdateAPI/ProfileUpdateDataManager.swift +++ /dev/null @@ -1,54 +0,0 @@ -// -// MyProfileUpdateDataManager.swift -// pochak -// -// Created by Seo Cindy on 1/14/24. -// - -import Alamofire - -class ProfileUpdateDataManager{ - static let shared = ProfileUpdateDataManager() - - func updateDataManager(_ name : String, - _ handle : String, - _ message : String, - _ profileImage : UIImage?, - _ completion: @escaping (ProfileUpdateDataModel) -> Void) { - - let accessToken = GetToken.getAccessToken() - - let header : HTTPHeaders = ["Authorization": accessToken, "Content-type": "multipart/form-data"] - let url = "\(APIConstants.baseURL)/api/v2/members/\(handle)" - let requestBody : [String : String] = [ - "name" : name, - "message" : message] - - AF.upload(multipartFormData: { multipartFormData in - // requestBody 추가 - for (key, value) in requestBody { - if let valueData = value.data(using: .utf8) { - multipartFormData.append(valueData, withName: key) - } - } - - // profileImage 추가 - if let image = profileImage?.jpegData(compressionQuality: 0.1) { - multipartFormData.append(image, withName: "profileImage", fileName: "profileImage.jpg", mimeType: "image/jpeg") - } - }, to: url, method: .put, headers: header).validate().responseDecodable(of: ProfileUpdateResponse.self) { response in - switch response.result { - case .success(let result): - let resultData = result.result - print("update 성공!!!!!!!!!!") - print(resultData) - completion(resultData) - case .failure(let error): - print("updateDataManager error : \(error.localizedDescription)") - if let data = response.data, let errorMessage = String(data: data, encoding: .utf8) { - print("Failure Data: \(errorMessage)") - } - } - } - } -} diff --git a/pochak/pochak/UI/Profile/MyProfile/ProfileUpdateAPI_fin/ProfileUpdateDataManager.swift b/pochak/pochak/UI/Profile/MyProfile/ProfileUpdateAPI_fin/ProfileUpdateDataManager.swift new file mode 100644 index 00000000..1705b3ad --- /dev/null +++ b/pochak/pochak/UI/Profile/MyProfile/ProfileUpdateAPI_fin/ProfileUpdateDataManager.swift @@ -0,0 +1,54 @@ +//// +//// MyProfileUpdateDataManager.swift +//// pochak +//// +//// Created by Seo Cindy on 1/14/24. +//// +// +//import Alamofire +// +//class ProfileUpdateDataManager{ +// static let shared = ProfileUpdateDataManager() +// +// func updateDataManager(_ name : String, +// _ handle : String, +// _ message : String, +// _ profileImage : UIImage?, +// _ completion: @escaping (ProfileUpdateDataModel) -> Void) { +// +// let accessToken = GetToken.getAccessToken() +// +// let header : HTTPHeaders = ["Authorization": accessToken, "Content-type": "multipart/form-data"] +// let url = "\(APIConstants.baseURL)/api/v2/members/\(handle)" +// let requestBody : [String : String] = [ +// "name" : name, +// "message" : message] +// +// AF.upload(multipartFormData: { multipartFormData in +// // requestBody 추가 +// for (key, value) in requestBody { +// if let valueData = value.data(using: .utf8) { +// multipartFormData.append(valueData, withName: key) +// } +// } +// +// // profileImage 추가 +// if let image = profileImage?.jpegData(compressionQuality: 0.1) { +// multipartFormData.append(image, withName: "profileImage", fileName: "profileImage.jpg", mimeType: "image/jpeg") +// } +// }, to: url, method: .put, headers: header).validate().responseDecodable(of: ProfileUpdateResponse.self) { response in +// switch response.result { +// case .success(let result): +// let resultData = result.result +// print("update 성공!!!!!!!!!!") +// print(resultData) +// completion(resultData) +// case .failure(let error): +// print("updateDataManager error : \(error.localizedDescription)") +// if let data = response.data, let errorMessage = String(data: data, encoding: .utf8) { +// print("Failure Data: \(errorMessage)") +// } +// } +// } +// } +//} diff --git a/pochak/pochak/UI/Profile/MyProfile/ProfileUpdateAPI_fin/ProfileUpdateDataModel.swift b/pochak/pochak/UI/Profile/MyProfile/ProfileUpdateAPI_fin/ProfileUpdateDataModel.swift new file mode 100644 index 00000000..696a3a6f --- /dev/null +++ b/pochak/pochak/UI/Profile/MyProfile/ProfileUpdateAPI_fin/ProfileUpdateDataModel.swift @@ -0,0 +1,20 @@ +// +// MyProfileUpdateDataModel.swift +// pochak +// +// Created by Seo Cindy on 1/14/24. +// + +//struct ProfileUpdateResponse: Codable { +// let isSuccess: Bool +// let code: String +// let message: String +// let result: ProfileUpdateDataModel +//} +// +//struct ProfileUpdateDataModel : Codable { +// var name : String? +// var handle : String? +// var message : String? +// var profileImage : String? +//} diff --git a/pochak/pochak/UI/Profile/MyProfile/UpdateProfileViewController.swift b/pochak/pochak/UI/Profile/MyProfile/UpdateProfileViewController.swift index 38c2eba9..9dce541e 100644 --- a/pochak/pochak/UI/Profile/MyProfile/UpdateProfileViewController.swift +++ b/pochak/pochak/UI/Profile/MyProfile/UpdateProfileViewController.swift @@ -41,20 +41,50 @@ class UpdateProfileViewController: UIViewController { // UserDefaults에 데이터 추가 guard let name = nameTextField.text else {return} guard let message = messageTextView.text else {return} - guard let profileImage = profileImg.image else {return} + guard let profileImage = profileImg.image.jpegData(compressionQuality: 0.2) else {return} - ProfileUpdateDataManager.shared.updateDataManager(name, - handle, - message, - profileImage, - {resultData in - UserDefaultsManager.setData(value: resultData.name, key: .name) - UserDefaultsManager.setData(value: resultData.handle, key: .handle) - UserDefaultsManager.setData(value: resultData.message, key: .message) - UserDefaultsManager.setData(value: resultData.profileImage, key: .profileImgUrl) + let request = ProfileUpdateRequest(name: name, message: message) + var files: [(Data, String, String)] = [] + if let profileImage = profileImage { + let fileTuple: (Data, String, String) = (profileImage, "profileImage", "image/jpeg") + files.append(fileTuple) + } + ProfileService.profileUpdate(handle: handle, files: files, request: request) { [weak self] data, failed in + guard let data = data else { + // 에러가 난 경우, alert 창 present + switch failed { + case .disconnected: + self?.present(UIAlertController.networkErrorAlert(title: failed!.localizedDescription), animated: true) + case .serverError: + self?.present(UIAlertController.networkErrorAlert(title: failed!.localizedDescription), animated: true) + case .unknownError: + self?.present(UIAlertController.networkErrorAlert(title: failed!.localizedDescription), animated: true) + default: + self?.present(UIAlertController.networkErrorAlert(title: "요청에 실패하였습니다."), animated: true) + } + return + } + + UserDefaultsManager.setData(value: data.result.name, key: .name) + UserDefaultsManager.setData(value: data.result.handle, key: .handle) + UserDefaultsManager.setData(value: data.result.message, key: .message) + UserDefaultsManager.setData(value: data.result.profileImage, key: .profileImgUrl) // 프로필 화면으로 전환 self.navigationController?.popViewController(animated: true) - }) + } + +// ProfileUpdateDataManager.shared.updateDataManager(name, +// handle, +// message, +// profileImage, +// {resultData in +// UserDefaultsManager.setData(value: resultData.name, key: .name) +// UserDefaultsManager.setData(value: resultData.handle, key: .handle) +// UserDefaultsManager.setData(value: resultData.message, key: .message) +// UserDefaultsManager.setData(value: resultData.profileImage, key: .profileImgUrl) +// // 프로필 화면으로 전환 +// self.navigationController?.popViewController(animated: true) +// }) } /* < 앨범 사진 선택 > From 1f2ccabd46fc623a273d38f169a6bf085fc2b691 Mon Sep 17 00:00:00 2001 From: Jungyeon Seo Date: Mon, 30 Sep 2024 20:45:57 +0900 Subject: [PATCH 04/54] Refactor : signout & logout api refactor --- pochak/pochak.xcodeproj/project.pbxproj | 48 ++++++++++++++++--- .../APIs/Authentication/LogOutAPI.swift | 29 +++++++++++ .../APIs/Authentication/SignOutAPI.swift | 29 +++++++++++ .../Authentication/LogOutResponse.swift | 14 ++++++ .../Authentication/SignOutResponse.swift | 14 ++++++ .../Services/AuthenticationService.swift | 40 ++++++++++++++++ .../Network/Services/ProfileService.swift | 32 ++++++------- .../Setting/LogoutAPI/LogoutDataManager.swift | 35 -------------- .../Setting/LogoutAPI/LogoutDataModel.swift | 12 ----- .../LogoutAPI_fin/LogoutDataManager.swift | 35 ++++++++++++++ .../LogoutAPI_fin/LogoutDataModel.swift | 12 +++++ .../Setting/SettingsViewController.swift | 30 +++++++----- .../SignoutAPI/SignOutDataManager.swift | 35 -------------- .../Setting/SignoutAPI/SignOutDataModel.swift | 12 ----- .../SignoutAPI_fin/SignOutDataManager.swift | 35 ++++++++++++++ .../SignoutAPI_fin/SignOutDataModel.swift | 12 +++++ 16 files changed, 297 insertions(+), 127 deletions(-) create mode 100644 pochak/pochak/Network/APIs/Authentication/LogOutAPI.swift create mode 100644 pochak/pochak/Network/APIs/Authentication/SignOutAPI.swift create mode 100644 pochak/pochak/Network/Models/Authentication/LogOutResponse.swift create mode 100644 pochak/pochak/Network/Models/Authentication/SignOutResponse.swift create mode 100644 pochak/pochak/Network/Services/AuthenticationService.swift delete mode 100644 pochak/pochak/UI/Profile/MyProfile/Setting/LogoutAPI/LogoutDataManager.swift delete mode 100644 pochak/pochak/UI/Profile/MyProfile/Setting/LogoutAPI/LogoutDataModel.swift create mode 100644 pochak/pochak/UI/Profile/MyProfile/Setting/LogoutAPI_fin/LogoutDataManager.swift create mode 100644 pochak/pochak/UI/Profile/MyProfile/Setting/LogoutAPI_fin/LogoutDataModel.swift delete mode 100644 pochak/pochak/UI/Profile/MyProfile/Setting/SignoutAPI/SignOutDataManager.swift delete mode 100644 pochak/pochak/UI/Profile/MyProfile/Setting/SignoutAPI/SignOutDataModel.swift create mode 100644 pochak/pochak/UI/Profile/MyProfile/Setting/SignoutAPI_fin/SignOutDataManager.swift create mode 100644 pochak/pochak/UI/Profile/MyProfile/Setting/SignoutAPI_fin/SignOutDataModel.swift diff --git a/pochak/pochak.xcodeproj/project.pbxproj b/pochak/pochak.xcodeproj/project.pbxproj index 90b8049f..dee48942 100644 --- a/pochak/pochak.xcodeproj/project.pbxproj +++ b/pochak/pochak.xcodeproj/project.pbxproj @@ -125,6 +125,11 @@ 374E46252CAABE08008AE361 /* ProfileUpdateResponse.swift in Sources */ = {isa = PBXBuildFile; fileRef = 374E46242CAABE07008AE361 /* ProfileUpdateResponse.swift */; }; 374E46292CAABE50008AE361 /* ProfileUpdateAPI.swift in Sources */ = {isa = PBXBuildFile; fileRef = 374E46282CAABE50008AE361 /* ProfileUpdateAPI.swift */; }; 374E462B2CAABF7B008AE361 /* ProfileUpdateRequest.swift in Sources */ = {isa = PBXBuildFile; fileRef = 374E462A2CAABF7A008AE361 /* ProfileUpdateRequest.swift */; }; + 374E462D2CAAC399008AE361 /* AuthenticationService.swift in Sources */ = {isa = PBXBuildFile; fileRef = 374E462C2CAAC399008AE361 /* AuthenticationService.swift */; }; + 374E46302CAAC3F6008AE361 /* SignOutResponse.swift in Sources */ = {isa = PBXBuildFile; fileRef = 374E462F2CAAC3F6008AE361 /* SignOutResponse.swift */; }; + 374E46352CAAC445008AE361 /* SignOutAPI.swift in Sources */ = {isa = PBXBuildFile; fileRef = 374E46342CAAC445008AE361 /* SignOutAPI.swift */; }; + 374E46372CAAC602008AE361 /* LogOutAPI.swift in Sources */ = {isa = PBXBuildFile; fileRef = 374E46362CAAC602008AE361 /* LogOutAPI.swift */; }; + 374E46392CAAC646008AE361 /* LogOutResponse.swift in Sources */ = {isa = PBXBuildFile; fileRef = 374E46382CAAC646008AE361 /* LogOutResponse.swift */; }; 3766F4022C3706DC001DD239 /* BlockedUserTableViewCell.xib in Resources */ = {isa = PBXBuildFile; fileRef = 3766F4012C3706DC001DD239 /* BlockedUserTableViewCell.xib */; }; 3766F4032C3706DC001DD239 /* BlockedUserTableViewCell.swift in Sources */ = {isa = PBXBuildFile; fileRef = 3766F4002C3706DC001DD239 /* BlockedUserTableViewCell.swift */; }; 3766F4062C370A7C001DD239 /* BlockedUserListDataManager.swift in Sources */ = {isa = PBXBuildFile; fileRef = 3766F4052C370A7C001DD239 /* BlockedUserListDataManager.swift */; }; @@ -371,6 +376,11 @@ 374E46242CAABE07008AE361 /* ProfileUpdateResponse.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = ProfileUpdateResponse.swift; sourceTree = ""; }; 374E46282CAABE50008AE361 /* ProfileUpdateAPI.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = ProfileUpdateAPI.swift; sourceTree = ""; }; 374E462A2CAABF7A008AE361 /* ProfileUpdateRequest.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = ProfileUpdateRequest.swift; sourceTree = ""; }; + 374E462C2CAAC399008AE361 /* AuthenticationService.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = AuthenticationService.swift; sourceTree = ""; }; + 374E462F2CAAC3F6008AE361 /* SignOutResponse.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = SignOutResponse.swift; sourceTree = ""; }; + 374E46342CAAC445008AE361 /* SignOutAPI.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = SignOutAPI.swift; sourceTree = ""; }; + 374E46362CAAC602008AE361 /* LogOutAPI.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = LogOutAPI.swift; sourceTree = ""; }; + 374E46382CAAC646008AE361 /* LogOutResponse.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = LogOutResponse.swift; sourceTree = ""; }; 3750669E2C3BB1660036E264 /* pochak.entitlements */ = {isa = PBXFileReference; lastKnownFileType = text.plist.entitlements; path = pochak.entitlements; sourceTree = ""; }; 3766F4002C3706DC001DD239 /* BlockedUserTableViewCell.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = BlockedUserTableViewCell.swift; sourceTree = ""; }; 3766F4012C3706DC001DD239 /* BlockedUserTableViewCell.xib */ = {isa = PBXFileReference; lastKnownFileType = file.xib; path = BlockedUserTableViewCell.xib; sourceTree = ""; }; @@ -887,8 +897,8 @@ children = ( 3747E9712BF3827500364BED /* SettingsViewController.swift */, 3766F4042C370A5D001DD239 /* BlockedUserList */, - 37D311D82B53131D00A1D7C1 /* LogoutAPI */, - 37D311DD2B566C3D00A1D7C1 /* SignoutAPI */, + 37D311D82B53131D00A1D7C1 /* LogoutAPI_fin */, + 37D311DD2B566C3D00A1D7C1 /* SignoutAPI_fin */, ); path = Setting; sourceTree = ""; @@ -931,6 +941,24 @@ path = CheckHandle; sourceTree = ""; }; + 374E462E2CAAC3CB008AE361 /* Authentication */ = { + isa = PBXGroup; + children = ( + 374E462F2CAAC3F6008AE361 /* SignOutResponse.swift */, + 374E46382CAAC646008AE361 /* LogOutResponse.swift */, + ); + path = Authentication; + sourceTree = ""; + }; + 374E46332CAAC437008AE361 /* Authentication */ = { + isa = PBXGroup; + children = ( + 374E46342CAAC445008AE361 /* SignOutAPI.swift */, + 374E46362CAAC602008AE361 /* LogOutAPI.swift */, + ); + path = Authentication; + sourceTree = ""; + }; 3766F3FF2C3706C7001DD239 /* cell */ = { isa = PBXGroup; children = ( @@ -1078,22 +1106,22 @@ path = ProfileUpdateAPI_fin; sourceTree = ""; }; - 37D311D82B53131D00A1D7C1 /* LogoutAPI */ = { + 37D311D82B53131D00A1D7C1 /* LogoutAPI_fin */ = { isa = PBXGroup; children = ( 37D311D92B53134200A1D7C1 /* LogoutDataManager.swift */, 37D311DB2B53135000A1D7C1 /* LogoutDataModel.swift */, ); - path = LogoutAPI; + path = LogoutAPI_fin; sourceTree = ""; }; - 37D311DD2B566C3D00A1D7C1 /* SignoutAPI */ = { + 37D311DD2B566C3D00A1D7C1 /* SignoutAPI_fin */ = { isa = PBXGroup; children = ( 37D311DE2B566C4D00A1D7C1 /* SignOutDataManager.swift */, 37D311E02B566C5900A1D7C1 /* SignOutDataModel.swift */, ); - path = SignoutAPI; + path = SignoutAPI_fin; sourceTree = ""; }; 37D311E72B567B3F00A1D7C1 /* OtherProfile */ = { @@ -1240,6 +1268,7 @@ EA7E146A2C8E9360001DA769 /* AlarmService.swift */, EA7E14602C858EC6001DA769 /* CameraService.swift */, 376EA12F2CAAAF6900FEFB63 /* ProfileService.swift */, + 374E462C2CAAC399008AE361 /* AuthenticationService.swift */, ); path = Services; sourceTree = ""; @@ -1247,6 +1276,7 @@ EA2CD6332C5F458900644EFE /* Models */ = { isa = PBXGroup; children = ( + 374E462E2CAAC3CB008AE361 /* Authentication */, 376EA12A2CAAAE3600FEFB63 /* Profile */, 0822A05A2CA1983C00F87E2C /* Post */, 0822A0552CA1983C00F87E2C /* Search */, @@ -1274,6 +1304,7 @@ EA2CD6352C5F45A100644EFE /* APIs */ = { isa = PBXGroup; children = ( + 374E46332CAAC437008AE361 /* Authentication */, 376EA1272CAAAD3500FEFB63 /* Profile */, 0822A04D2CA1980200F87E2C /* User */, 0822A04A2CA197F800F87E2C /* Search */, @@ -1708,6 +1739,7 @@ EA2CD63F2C5F585400644EFE /* HTTPHeaderType.swift in Sources */, 3769D6CE2B3C563A00294CD1 /* PostListViewController.swift in Sources */, 0822A0542CA1983100F87E2C /* ExploreResponse.swift in Sources */, + 374E46352CAAC445008AE361 /* SignOutAPI.swift in Sources */, 0822A0662CA1983C00F87E2C /* SearchRequest.swift in Sources */, 0822A0712CA1983C00F87E2C /* PostDetailResponse.swift in Sources */, 376EA12C2CAAAE5600FEFB63 /* ProfileRetrievalResponse.swift in Sources */, @@ -1721,6 +1753,7 @@ 3769D6C72B3C4F0900294CD1 /* FollowingCollectionViewCell.swift in Sources */, 08E8DCDC2C38118000EC78C2 /* UILabel+.swift in Sources */, 373235472B68F93E0042EF94 /* FollowListDataManager.swift in Sources */, + 374E462D2CAAC399008AE361 /* AuthenticationService.swift in Sources */, 08EB5D252C280CFE00E35C16 /* UIImage+.swift in Sources */, 08D98C4A2AFEE8D700E9A097 /* LikedUsersDataModel.swift in Sources */, EA2CD6462C5F5A1E00644EFE /* HomeResponse.swift in Sources */, @@ -1784,6 +1817,7 @@ 3742616E2C30916C00B67886 /* BlockDataManager.swift in Sources */, 379A6A3E2B5FA07D0087FAAC /* NavigationController.swift in Sources */, 0822A0462CA197E700F87E2C /* CommentPostAPI.swift in Sources */, + 374E46372CAAC602008AE361 /* LogOutAPI.swift in Sources */, 3766F4062C370A7C001DD239 /* BlockedUserListDataManager.swift in Sources */, 3769D6D52B3C59F900294CD1 /* ProfilePostCollectionViewCell.swift in Sources */, 376EA12E2CAAAE6800FEFB63 /* ProfileRetrievalRequest.swift in Sources */, @@ -1815,12 +1849,14 @@ 0822A06A2CA1983C00F87E2C /* PostLikeResponse.swift in Sources */, 0820B1902A63A18100604DA8 /* ReplyTableViewCell.swift in Sources */, 374261702C30917600B67886 /* BlockDataModel.swift in Sources */, + 374E46392CAAC646008AE361 /* LogOutResponse.swift in Sources */, 083249782C295E4000A77C03 /* CustomAlertViewController.swift in Sources */, 374E46252CAABE08008AE361 /* ProfileUpdateResponse.swift in Sources */, 37C3AF482B3CB2B300B4C79C /* MyProfilePochakedPostModel.swift in Sources */, 0822A04F2CA1980200F87E2C /* FollowAPI.swift in Sources */, EA2CD6392C5F45E300644EFE /* BaseAPI.swift in Sources */, 37D311E12B566C5A00A1D7C1 /* SignOutDataModel.swift in Sources */, + 374E46302CAAC3F6008AE361 /* SignOutResponse.swift in Sources */, 376F125B2A8B7440005F469B /* SocialLoginViewController.swift in Sources */, 37D311D72B53057700A1D7C1 /* ProfileUpdateDataModel.swift in Sources */, EA4EF8D82C2EC5F7009549FF /* UITextField+.swift in Sources */, diff --git a/pochak/pochak/Network/APIs/Authentication/LogOutAPI.swift b/pochak/pochak/Network/APIs/Authentication/LogOutAPI.swift new file mode 100644 index 00000000..bd5279c2 --- /dev/null +++ b/pochak/pochak/Network/APIs/Authentication/LogOutAPI.swift @@ -0,0 +1,29 @@ +// +// LogOutAPI.swift +// pochak +// +// Created by Seo Cindy on 9/30/24. +// + +import Foundation + +enum LogOutAPI { + case logOut() +} + +extension LogOutAPI: BaseAPI { + + typealias Response = SignOutResponse + + var method: HTTPMethod { + switch self { + case .logOut: return .get + } + } + + var path: String { + switch self { + case .logOut(): return "/v2/logout" + } + } +} diff --git a/pochak/pochak/Network/APIs/Authentication/SignOutAPI.swift b/pochak/pochak/Network/APIs/Authentication/SignOutAPI.swift new file mode 100644 index 00000000..c339ad46 --- /dev/null +++ b/pochak/pochak/Network/APIs/Authentication/SignOutAPI.swift @@ -0,0 +1,29 @@ +// +// SignOutAPI.swift +// pochak +// +// Created by Seo Cindy on 9/30/24. +// + +import Foundation + +enum SignOutAPI { + case signOut() +} + +extension SignOutAPI: BaseAPI { + + typealias Response = SignOutResponse + + var method: HTTPMethod { + switch self { + case .signOut: return .delete + } + } + + var path: String { + switch self { + case .signOut(): return "/v2/signout" + } + } +} diff --git a/pochak/pochak/Network/Models/Authentication/LogOutResponse.swift b/pochak/pochak/Network/Models/Authentication/LogOutResponse.swift new file mode 100644 index 00000000..c9f67d25 --- /dev/null +++ b/pochak/pochak/Network/Models/Authentication/LogOutResponse.swift @@ -0,0 +1,14 @@ +// +// LogOutResponse.swift +// pochak +// +// Created by Seo Cindy on 9/30/24. +// + +import Foundation + +struct LogOutResponse : Codable { + var isSuccess: Bool + var code: String + var message: String +} diff --git a/pochak/pochak/Network/Models/Authentication/SignOutResponse.swift b/pochak/pochak/Network/Models/Authentication/SignOutResponse.swift new file mode 100644 index 00000000..4ac56bc2 --- /dev/null +++ b/pochak/pochak/Network/Models/Authentication/SignOutResponse.swift @@ -0,0 +1,14 @@ +// +// SignOutResponse.swift +// pochak +// +// Created by Seo Cindy on 9/30/24. +// + +import Foundation + +struct SignOutResponse : Codable { + var isSuccess: Bool + var code: String + var message: String +} diff --git a/pochak/pochak/Network/Services/AuthenticationService.swift b/pochak/pochak/Network/Services/AuthenticationService.swift new file mode 100644 index 00000000..84218454 --- /dev/null +++ b/pochak/pochak/Network/Services/AuthenticationService.swift @@ -0,0 +1,40 @@ +// +// AuthenticationService.swift +// pochak +// +// Created by Seo Cindy on 9/30/24. +// + +import Foundation + +struct AuthenticationService { + /// - Parameters: + /// - completion: 통신 후 핸들러 (뷰컨트롤러에 있음) + static func signOut( + completion: @escaping (_ succeed: SignOutResponse?, _ failed: NetworkError?) -> Void) { + NetworkService.shared.request(SignOutAPI.signOut()) { response in + switch response { + case .success(let data): + completion(data, nil) + case .failure(let error): + print("=== signOut error ===") + print(error.localizedDescription) + completion(nil, error) + } + } + } + + static func logOut( + completion: @escaping (_ succeed: LogOutResponse?, _ failed: NetworkError?) -> Void) { + NetworkService.shared.request(LogOutAPI.logOut()) { response in + switch response { + case .success(let data): + completion(data, nil) + case .failure(let error): + print("=== logOut error ===") + print(error.localizedDescription) + completion(nil, error) + } + } + } +} diff --git a/pochak/pochak/Network/Services/ProfileService.swift b/pochak/pochak/Network/Services/ProfileService.swift index 3ec41304..1c53f3bd 100644 --- a/pochak/pochak/Network/Services/ProfileService.swift +++ b/pochak/pochak/Network/Services/ProfileService.swift @@ -16,32 +16,32 @@ struct ProfileService { request: ProfileRetrievalRequest, completion: @escaping (_ succeed: ProfileRetrievalResponse?, _ failed: NetworkError?) -> Void) { NetworkService.shared.request(ProfileRetrievalAPI.getProfile(handle: handle, request: request)) { response in - switch response { - case .success(let data): - completion(data, nil) - case .failure(let error): - print("=== getProfile error ===") - print(error.localizedDescription) - completion(nil, error) + switch response { + case .success(let data): + completion(data, nil) + case .failure(let error): + print("=== getProfile error ===") + print(error.localizedDescription) + completion(nil, error) + } } } - } static func getProfilePochakPosts( handle: String, request: PochakPostRetrievalRequest, completion: @escaping (_ succeed: PochakPostRetrievalResponse?, _ failed: NetworkError?) -> Void) { NetworkService.shared.request(PochakPostRetrievalAPI.getPochakPost(handle: handle, request: request)) { response in - switch response { - case .success(let data): - completion(data, nil) - case .failure(let error): - print("=== getProfilePochakPosts error ===") - print(error.localizedDescription) - completion(nil, error) + switch response { + case .success(let data): + completion(data, nil) + case .failure(let error): + print("=== getProfilePochakPosts error ===") + print(error.localizedDescription) + completion(nil, error) + } } } - } static func profileUpdate( handle: String, diff --git a/pochak/pochak/UI/Profile/MyProfile/Setting/LogoutAPI/LogoutDataManager.swift b/pochak/pochak/UI/Profile/MyProfile/Setting/LogoutAPI/LogoutDataManager.swift deleted file mode 100644 index cbac21bb..00000000 --- a/pochak/pochak/UI/Profile/MyProfile/Setting/LogoutAPI/LogoutDataManager.swift +++ /dev/null @@ -1,35 +0,0 @@ -// -// LogoutDataManager.swift -// pochak -// -// Created by Seo Cindy on 1/14/24. -// -import Alamofire - -class LogoutDataManager{ - - static let shared = LogoutDataManager() - - func logoutDataManager(_ completion: @escaping (LogoutDataModel) -> Void) { - let url = "\(APIConstants.baseURL)/api/v2/logout" - - AF.request(url, - method: .get, - encoding: URLEncoding.default, - interceptor: RequestInterceptor.getRequestInterceptor()) - .validate() - .responseDecodable(of: LogoutDataModel.self) { response in - switch response.result { - case .success(let result): - print("logout success!") - let resultData = result - completion(resultData) - case .failure(let error): - print("Request Fail : logoutDataManager") - if let data = response.data, let errorMessage = String(data: data, encoding: .utf8) { - print("Failure Data: \(errorMessage)") - } - } - } - } -} diff --git a/pochak/pochak/UI/Profile/MyProfile/Setting/LogoutAPI/LogoutDataModel.swift b/pochak/pochak/UI/Profile/MyProfile/Setting/LogoutAPI/LogoutDataModel.swift deleted file mode 100644 index 70591c7e..00000000 --- a/pochak/pochak/UI/Profile/MyProfile/Setting/LogoutAPI/LogoutDataModel.swift +++ /dev/null @@ -1,12 +0,0 @@ -// -// LogoutDataModel.swift -// pochak -// -// Created by Seo Cindy on 1/14/24. -// - -struct LogoutDataModel : Codable { - var isSuccess: Bool - var code: String - var message: String -} diff --git a/pochak/pochak/UI/Profile/MyProfile/Setting/LogoutAPI_fin/LogoutDataManager.swift b/pochak/pochak/UI/Profile/MyProfile/Setting/LogoutAPI_fin/LogoutDataManager.swift new file mode 100644 index 00000000..e53dab3f --- /dev/null +++ b/pochak/pochak/UI/Profile/MyProfile/Setting/LogoutAPI_fin/LogoutDataManager.swift @@ -0,0 +1,35 @@ +//// +//// LogoutDataManager.swift +//// pochak +//// +//// Created by Seo Cindy on 1/14/24. +//// +//import Alamofire +// +//class LogoutDataManager{ +// +// static let shared = LogoutDataManager() +// +// func logoutDataManager(_ completion: @escaping (LogoutDataModel) -> Void) { +// let url = "\(APIConstants.baseURL)/api/v2/logout" +// +// AF.request(url, +// method: .get, +// encoding: URLEncoding.default, +// interceptor: RequestInterceptor.getRequestInterceptor()) +// .validate() +// .responseDecodable(of: LogoutDataModel.self) { response in +// switch response.result { +// case .success(let result): +// print("logout success!") +// let resultData = result +// completion(resultData) +// case .failure(let error): +// print("Request Fail : logoutDataManager") +// if let data = response.data, let errorMessage = String(data: data, encoding: .utf8) { +// print("Failure Data: \(errorMessage)") +// } +// } +// } +// } +//} diff --git a/pochak/pochak/UI/Profile/MyProfile/Setting/LogoutAPI_fin/LogoutDataModel.swift b/pochak/pochak/UI/Profile/MyProfile/Setting/LogoutAPI_fin/LogoutDataModel.swift new file mode 100644 index 00000000..5584efbe --- /dev/null +++ b/pochak/pochak/UI/Profile/MyProfile/Setting/LogoutAPI_fin/LogoutDataModel.swift @@ -0,0 +1,12 @@ +//// +//// LogoutDataModel.swift +//// pochak +//// +//// Created by Seo Cindy on 1/14/24. +//// +// +//struct LogoutDataModel : Codable { +// var isSuccess: Bool +// var code: String +// var message: String +//} diff --git a/pochak/pochak/UI/Profile/MyProfile/Setting/SettingsViewController.swift b/pochak/pochak/UI/Profile/MyProfile/Setting/SettingsViewController.swift index 13326050..82c0d8a4 100644 --- a/pochak/pochak/UI/Profile/MyProfile/Setting/SettingsViewController.swift +++ b/pochak/pochak/UI/Profile/MyProfile/Setting/SettingsViewController.swift @@ -151,21 +151,29 @@ extension SettingsViewController: CustomAlertDelegate { func confirmAction() { if selectedBtn == 0 { - LogoutDataManager.shared.logoutDataManager( - { resultData in - let message = resultData.message - print(message) - }) - + AuthenticationService.logOut { [weak self] data, failed in + let message = data.message + print(message) + } +// LogoutDataManager.shared.logoutDataManager( +// { resultData in +// let message = resultData.message +// print(message) +// }) +// deleteUserData() moveToMainPage() } else if selectedBtn == 1 { - SignOutDataManager.shared.signOutDataManager( - { resultData in - let message = resultData.message - print(message) - }) + AuthenticationService.signOut { [weak self] data, failed in + let message = data.message + print(message) + } +// SignOutDataManager.shared.signOutDataManager( +// { resultData in +// let message = resultData.message +// print(message) +// }) deleteUserData() moveToMainPage() diff --git a/pochak/pochak/UI/Profile/MyProfile/Setting/SignoutAPI/SignOutDataManager.swift b/pochak/pochak/UI/Profile/MyProfile/Setting/SignoutAPI/SignOutDataManager.swift deleted file mode 100644 index e405d512..00000000 --- a/pochak/pochak/UI/Profile/MyProfile/Setting/SignoutAPI/SignOutDataManager.swift +++ /dev/null @@ -1,35 +0,0 @@ -// -// DeleteAccountDataManager.swift -// pochak -// -// Created by Seo Cindy on 1/16/24. -// - -import Alamofire - -class SignOutDataManager{ - - static let shared = SignOutDataManager() - - func signOutDataManager(_ completion: @escaping (SignOutDataModel) -> Void) { - - let url = "\(APIConstants.baseURL)/api/v2/signout" - - AF.request(url, - method: .delete, - encoding: URLEncoding.default, - interceptor: RequestInterceptor.getRequestInterceptor()) - .validate() - .responseDecodable(of: SignOutDataModel.self) { response in - switch response.result { - case .success(let result): - print("signout success!!!!!!!!!") - let resultData = result - completion(resultData) - case .failure(let error): - print("Request Fail : deleteAccountDataManager") - print(error) - } - } - } -} diff --git a/pochak/pochak/UI/Profile/MyProfile/Setting/SignoutAPI/SignOutDataModel.swift b/pochak/pochak/UI/Profile/MyProfile/Setting/SignoutAPI/SignOutDataModel.swift deleted file mode 100644 index 18fa9b0b..00000000 --- a/pochak/pochak/UI/Profile/MyProfile/Setting/SignoutAPI/SignOutDataModel.swift +++ /dev/null @@ -1,12 +0,0 @@ -// -// DeleteAccountDataModel.swift -// pochak -// -// Created by Seo Cindy on 1/16/24. -// - -struct SignOutDataModel : Codable { - var isSuccess: Bool - var code: String - var message: String -} diff --git a/pochak/pochak/UI/Profile/MyProfile/Setting/SignoutAPI_fin/SignOutDataManager.swift b/pochak/pochak/UI/Profile/MyProfile/Setting/SignoutAPI_fin/SignOutDataManager.swift new file mode 100644 index 00000000..3c9fdca0 --- /dev/null +++ b/pochak/pochak/UI/Profile/MyProfile/Setting/SignoutAPI_fin/SignOutDataManager.swift @@ -0,0 +1,35 @@ +//// +//// DeleteAccountDataManager.swift +//// pochak +//// +//// Created by Seo Cindy on 1/16/24. +//// +// +//import Alamofire +// +//class SignOutDataManager{ +// +// static let shared = SignOutDataManager() +// +// func signOutDataManager(_ completion: @escaping (SignOutDataModel) -> Void) { +// +// let url = "\(APIConstants.baseURL)/api/v2/signout" +// +// AF.request(url, +// method: .delete, +// encoding: URLEncoding.default, +// interceptor: RequestInterceptor.getRequestInterceptor()) +// .validate() +// .responseDecodable(of: SignOutDataModel.self) { response in +// switch response.result { +// case .success(let result): +// print("signout success!!!!!!!!!") +// let resultData = result +// completion(resultData) +// case .failure(let error): +// print("Request Fail : deleteAccountDataManager") +// print(error) +// } +// } +// } +//} diff --git a/pochak/pochak/UI/Profile/MyProfile/Setting/SignoutAPI_fin/SignOutDataModel.swift b/pochak/pochak/UI/Profile/MyProfile/Setting/SignoutAPI_fin/SignOutDataModel.swift new file mode 100644 index 00000000..b0921c6d --- /dev/null +++ b/pochak/pochak/UI/Profile/MyProfile/Setting/SignoutAPI_fin/SignOutDataModel.swift @@ -0,0 +1,12 @@ +//// +//// DeleteAccountDataModel.swift +//// pochak +//// +//// Created by Seo Cindy on 1/16/24. +//// +// +//struct SignOutDataModel : Codable { +// var isSuccess: Bool +// var code: String +// var message: String +//} From f45449e5d8b6a8ebd2a755a91efcba1588aa2f30 Mon Sep 17 00:00:00 2001 From: Jungyeon Seo Date: Mon, 30 Sep 2024 21:03:40 +0900 Subject: [PATCH 05/54] Refactor : user block/unblock api --- pochak/pochak.xcodeproj/project.pbxproj | 26 +++++++++++-- .../APIs/Authentication/LogOutAPI.swift | 3 +- .../APIs/Authentication/SignOutAPI.swift | 1 + .../APIs/Profile/PochakPostRetrievalAPI.swift | 1 + .../APIs/Profile/ProfileRetrievalAPI.swift | 1 + .../APIs/Profile/ProfileUpdateAPI.swift | 1 + .../pochak/Network/APIs/User/BlockAPI.swift | 30 ++++++++++++++ .../pochak/Network/APIs/User/UnblockAPI.swift | 36 +++++++++++++++++ .../Network/Models/User/BlockResponse.swift | 14 +++++++ .../Network/Models/User/UnblockRequest.swift | 12 ++++++ .../Network/Models/User/UnblockResponse.swift | 14 +++++++ .../pochak/Network/Services/UserService.swift | 39 +++++++++++++++++++ .../BlockedUserViewController.swift | 25 +++++++++++- .../BlockDataManager.swift | 0 .../BlockDataModel.swift | 0 .../UnblockDataManager.swift | 0 .../UnblockDataModel.swift | 0 .../ProfileMenuViewController.swift | 27 +++++++++++-- 18 files changed, 221 insertions(+), 9 deletions(-) create mode 100644 pochak/pochak/Network/APIs/User/BlockAPI.swift create mode 100644 pochak/pochak/Network/APIs/User/UnblockAPI.swift create mode 100644 pochak/pochak/Network/Models/User/BlockResponse.swift create mode 100644 pochak/pochak/Network/Models/User/UnblockRequest.swift create mode 100644 pochak/pochak/Network/Models/User/UnblockResponse.swift rename pochak/pochak/UI/Profile/OtherProfile/ProfileMenu/{BlockAPI => BlockAPI_fin}/BlockDataManager.swift (100%) rename pochak/pochak/UI/Profile/OtherProfile/ProfileMenu/{BlockAPI => BlockAPI_fin}/BlockDataModel.swift (100%) rename pochak/pochak/UI/Profile/OtherProfile/ProfileMenu/{BlockAPI => BlockAPI_fin}/UnblockDataManager.swift (100%) rename pochak/pochak/UI/Profile/OtherProfile/ProfileMenu/{BlockAPI => BlockAPI_fin}/UnblockDataModel.swift (100%) diff --git a/pochak/pochak.xcodeproj/project.pbxproj b/pochak/pochak.xcodeproj/project.pbxproj index dee48942..6d1a808c 100644 --- a/pochak/pochak.xcodeproj/project.pbxproj +++ b/pochak/pochak.xcodeproj/project.pbxproj @@ -130,6 +130,11 @@ 374E46352CAAC445008AE361 /* SignOutAPI.swift in Sources */ = {isa = PBXBuildFile; fileRef = 374E46342CAAC445008AE361 /* SignOutAPI.swift */; }; 374E46372CAAC602008AE361 /* LogOutAPI.swift in Sources */ = {isa = PBXBuildFile; fileRef = 374E46362CAAC602008AE361 /* LogOutAPI.swift */; }; 374E46392CAAC646008AE361 /* LogOutResponse.swift in Sources */ = {isa = PBXBuildFile; fileRef = 374E46382CAAC646008AE361 /* LogOutResponse.swift */; }; + 374E463B2CAAC762008AE361 /* BlockAPI.swift in Sources */ = {isa = PBXBuildFile; fileRef = 374E463A2CAAC762008AE361 /* BlockAPI.swift */; }; + 374E463D2CAAC82E008AE361 /* BlockResponse.swift in Sources */ = {isa = PBXBuildFile; fileRef = 374E463C2CAAC82E008AE361 /* BlockResponse.swift */; }; + 374E463F2CAAC931008AE361 /* UnblockAPI.swift in Sources */ = {isa = PBXBuildFile; fileRef = 374E463E2CAAC931008AE361 /* UnblockAPI.swift */; }; + 374E46412CAAC9AE008AE361 /* UnblockRequest.swift in Sources */ = {isa = PBXBuildFile; fileRef = 374E46402CAAC9AE008AE361 /* UnblockRequest.swift */; }; + 374E46432CAAC9B5008AE361 /* UnblockResponse.swift in Sources */ = {isa = PBXBuildFile; fileRef = 374E46422CAAC9B5008AE361 /* UnblockResponse.swift */; }; 3766F4022C3706DC001DD239 /* BlockedUserTableViewCell.xib in Resources */ = {isa = PBXBuildFile; fileRef = 3766F4012C3706DC001DD239 /* BlockedUserTableViewCell.xib */; }; 3766F4032C3706DC001DD239 /* BlockedUserTableViewCell.swift in Sources */ = {isa = PBXBuildFile; fileRef = 3766F4002C3706DC001DD239 /* BlockedUserTableViewCell.swift */; }; 3766F4062C370A7C001DD239 /* BlockedUserListDataManager.swift in Sources */ = {isa = PBXBuildFile; fileRef = 3766F4052C370A7C001DD239 /* BlockedUserListDataManager.swift */; }; @@ -381,6 +386,11 @@ 374E46342CAAC445008AE361 /* SignOutAPI.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = SignOutAPI.swift; sourceTree = ""; }; 374E46362CAAC602008AE361 /* LogOutAPI.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = LogOutAPI.swift; sourceTree = ""; }; 374E46382CAAC646008AE361 /* LogOutResponse.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = LogOutResponse.swift; sourceTree = ""; }; + 374E463A2CAAC762008AE361 /* BlockAPI.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = BlockAPI.swift; sourceTree = ""; }; + 374E463C2CAAC82E008AE361 /* BlockResponse.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = BlockResponse.swift; sourceTree = ""; }; + 374E463E2CAAC931008AE361 /* UnblockAPI.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = UnblockAPI.swift; sourceTree = ""; }; + 374E46402CAAC9AE008AE361 /* UnblockRequest.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = UnblockRequest.swift; sourceTree = ""; }; + 374E46422CAAC9B5008AE361 /* UnblockResponse.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = UnblockResponse.swift; sourceTree = ""; }; 3750669E2C3BB1660036E264 /* pochak.entitlements */ = {isa = PBXFileReference; lastKnownFileType = text.plist.entitlements; path = pochak.entitlements; sourceTree = ""; }; 3766F4002C3706DC001DD239 /* BlockedUserTableViewCell.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = BlockedUserTableViewCell.swift; sourceTree = ""; }; 3766F4012C3706DC001DD239 /* BlockedUserTableViewCell.xib */ = {isa = PBXFileReference; lastKnownFileType = file.xib; path = BlockedUserTableViewCell.xib; sourceTree = ""; }; @@ -604,6 +614,8 @@ isa = PBXGroup; children = ( 0822A04E2CA1980200F87E2C /* FollowAPI.swift */, + 374E463A2CAAC762008AE361 /* BlockAPI.swift */, + 374E463E2CAAC931008AE361 /* UnblockAPI.swift */, ); path = User; sourceTree = ""; @@ -630,6 +642,9 @@ isa = PBXGroup; children = ( 0822A0592CA1983C00F87E2C /* FollowResponse.swift */, + 374E463C2CAAC82E008AE361 /* BlockResponse.swift */, + 374E46402CAAC9AE008AE361 /* UnblockRequest.swift */, + 374E46422CAAC9B5008AE361 /* UnblockResponse.swift */, ); path = User; sourceTree = ""; @@ -907,12 +922,12 @@ isa = PBXGroup; children = ( 374261632C2FEF5F00B67886 /* ProfileMenuViewController.swift */, - 3742616C2C30914100B67886 /* BlockAPI */, + 3742616C2C30914100B67886 /* BlockAPI_fin */, ); path = ProfileMenu; sourceTree = ""; }; - 3742616C2C30914100B67886 /* BlockAPI */ = { + 3742616C2C30914100B67886 /* BlockAPI_fin */ = { isa = PBXGroup; children = ( 3742616D2C30916C00B67886 /* BlockDataManager.swift */, @@ -920,7 +935,7 @@ 374261712C3092B100B67886 /* UnblockDataManager.swift */, 374261732C3092B900B67886 /* UnblockDataModel.swift */, ); - path = BlockAPI; + path = BlockAPI_fin; sourceTree = ""; }; 374261762C31C6CD00B67886 /* AppleLogin */ = { @@ -1755,6 +1770,7 @@ 373235472B68F93E0042EF94 /* FollowListDataManager.swift in Sources */, 374E462D2CAAC399008AE361 /* AuthenticationService.swift in Sources */, 08EB5D252C280CFE00E35C16 /* UIImage+.swift in Sources */, + 374E463B2CAAC762008AE361 /* BlockAPI.swift in Sources */, 08D98C4A2AFEE8D700E9A097 /* LikedUsersDataModel.swift in Sources */, EA2CD6462C5F5A1E00644EFE /* HomeResponse.swift in Sources */, EA7E14632C858EEE001DA769 /* CameraUploadResponse.swift in Sources */, @@ -1788,6 +1804,7 @@ 0822A0422CA197E700F87E2C /* PostReportAPI.swift in Sources */, 374E46292CAABE50008AE361 /* ProfileUpdateAPI.swift in Sources */, 0844D7EF2BF219F6001154AC /* DeleteViewCell.swift in Sources */, + 374E463D2CAAC82E008AE361 /* BlockResponse.swift in Sources */, 374261742C3092B900B67886 /* UnblockDataModel.swift in Sources */, EA2CD63B2C5F463700644EFE /* NetworkService.swift in Sources */, 373235542B692C6D0042EF94 /* DeleteFollowerDataManager.swift in Sources */, @@ -1805,10 +1822,12 @@ 3766F4132C3A69E5001DD239 /* TermsOfAgreeViewController.swift in Sources */, 0822A0472CA197E700F87E2C /* PostLikeAPI.swift in Sources */, 37D311DC2B53135000A1D7C1 /* LogoutDataModel.swift in Sources */, + 374E46432CAAC9B5008AE361 /* UnblockResponse.swift in Sources */, 37A284C12B52FC910023EB9D /* UpdateProfileViewController.swift in Sources */, 3738151A2A8A09DA0032066A /* MakeProfileViewController.swift in Sources */, 0822A0442CA197E700F87E2C /* CommentDeleteAPI.swift in Sources */, EA17182B2A5912A7009168E6 /* CameraViewController.swift in Sources */, + 374E46412CAAC9AE008AE361 /* UnblockRequest.swift in Sources */, 080FEF012C551C3200951460 /* ReportType.swift in Sources */, 0822A0782CA1986000F87E2C /* UserService.swift in Sources */, EA7E14712C8EA26D001DA769 /* AlarmListRequest.swift in Sources */, @@ -1882,6 +1901,7 @@ 0822A07A2CA1986000F87E2C /* ExploreService.swift in Sources */, 08FD3A392B357E6400574880 /* LikedUsersDataService.swift in Sources */, 081228CA2A699B5A00DFA094 /* LikedPeopleListTableViewCell.swift in Sources */, + 374E463F2CAAC931008AE361 /* UnblockAPI.swift in Sources */, 0822A06C2CA1983C00F87E2C /* CommentGetResponse.swift in Sources */, 3769D6D02B3C569C00294CD1 /* PochakedPostTabmanViewController.swift in Sources */, 374261642C2FEF5F00B67886 /* ProfileMenuViewController.swift in Sources */, diff --git a/pochak/pochak/Network/APIs/Authentication/LogOutAPI.swift b/pochak/pochak/Network/APIs/Authentication/LogOutAPI.swift index bd5279c2..d149050c 100644 --- a/pochak/pochak/Network/APIs/Authentication/LogOutAPI.swift +++ b/pochak/pochak/Network/APIs/Authentication/LogOutAPI.swift @@ -6,6 +6,7 @@ // import Foundation +import Alamofire enum LogOutAPI { case logOut() @@ -13,7 +14,7 @@ enum LogOutAPI { extension LogOutAPI: BaseAPI { - typealias Response = SignOutResponse + typealias Response = LogOutResponse var method: HTTPMethod { switch self { diff --git a/pochak/pochak/Network/APIs/Authentication/SignOutAPI.swift b/pochak/pochak/Network/APIs/Authentication/SignOutAPI.swift index c339ad46..bb48d0c1 100644 --- a/pochak/pochak/Network/APIs/Authentication/SignOutAPI.swift +++ b/pochak/pochak/Network/APIs/Authentication/SignOutAPI.swift @@ -6,6 +6,7 @@ // import Foundation +import Alamofire enum SignOutAPI { case signOut() diff --git a/pochak/pochak/Network/APIs/Profile/PochakPostRetrievalAPI.swift b/pochak/pochak/Network/APIs/Profile/PochakPostRetrievalAPI.swift index 81058e77..73b7cf3f 100644 --- a/pochak/pochak/Network/APIs/Profile/PochakPostRetrievalAPI.swift +++ b/pochak/pochak/Network/APIs/Profile/PochakPostRetrievalAPI.swift @@ -6,6 +6,7 @@ // import Foundation +import Alamofire enum PochakPostRetrievalAPI { diff --git a/pochak/pochak/Network/APIs/Profile/ProfileRetrievalAPI.swift b/pochak/pochak/Network/APIs/Profile/ProfileRetrievalAPI.swift index 91df703d..d473431d 100644 --- a/pochak/pochak/Network/APIs/Profile/ProfileRetrievalAPI.swift +++ b/pochak/pochak/Network/APIs/Profile/ProfileRetrievalAPI.swift @@ -6,6 +6,7 @@ // import Foundation +import Alamofire enum ProfileRetrievalAPI { case getProfile(handle: String, request: ProfileRetrievalRequest) diff --git a/pochak/pochak/Network/APIs/Profile/ProfileUpdateAPI.swift b/pochak/pochak/Network/APIs/Profile/ProfileUpdateAPI.swift index 8a51931e..267ec985 100644 --- a/pochak/pochak/Network/APIs/Profile/ProfileUpdateAPI.swift +++ b/pochak/pochak/Network/APIs/Profile/ProfileUpdateAPI.swift @@ -6,6 +6,7 @@ // import Foundation +import Alamofire enum ProfileUpdateAPI { diff --git a/pochak/pochak/Network/APIs/User/BlockAPI.swift b/pochak/pochak/Network/APIs/User/BlockAPI.swift new file mode 100644 index 00000000..81d1b5ac --- /dev/null +++ b/pochak/pochak/Network/APIs/User/BlockAPI.swift @@ -0,0 +1,30 @@ +// +// BlockAPI.swift +// pochak +// +// Created by Seo Cindy on 9/30/24. +// + +import Foundation +import Alamofire + +enum BlockAPI { + case blockUser(String) +} + +extension BlockAPI: BaseAPI { + + typealias Response = BlockResponse + + var method: HTTPMethod { + switch self { + case .blockUser: return .post + } + } + + var path: String { + switch self { + case .blockUser(let handle): return "/v2/members/\(handle)/block" + } + } +} diff --git a/pochak/pochak/Network/APIs/User/UnblockAPI.swift b/pochak/pochak/Network/APIs/User/UnblockAPI.swift new file mode 100644 index 00000000..c39966cf --- /dev/null +++ b/pochak/pochak/Network/APIs/User/UnblockAPI.swift @@ -0,0 +1,36 @@ +// +// UnblockAPI.swift +// pochak +// +// Created by Seo Cindy on 9/30/24. +// + +import Foundation +import Alamofire + +enum UnblockAPI { + case unblockUser(handle: String, request: ProfileRetrievalRequest) +} + +extension UnblockAPI: BaseAPI { + + typealias Response = BlockResponse + + var method: HTTPMethod { + switch self { + case .unblockUser: return .delete + } + } + + var path: String { + switch self { + case .unblockUser(let handle, _): return "/v2/members/\(handle)/block" + } + } + + var parameters: RequestParams? { + switch self { + case .unblockUser(_, let request): return .query(request) + } + } +} diff --git a/pochak/pochak/Network/Models/User/BlockResponse.swift b/pochak/pochak/Network/Models/User/BlockResponse.swift new file mode 100644 index 00000000..aedc94d4 --- /dev/null +++ b/pochak/pochak/Network/Models/User/BlockResponse.swift @@ -0,0 +1,14 @@ +// +// BlockResponse.swift +// pochak +// +// Created by Seo Cindy on 9/30/24. +// + +import Foundation + +struct BlockResponse: Codable { + let isSuccess: Bool + let code: String + let message: String +} diff --git a/pochak/pochak/Network/Models/User/UnblockRequest.swift b/pochak/pochak/Network/Models/User/UnblockRequest.swift new file mode 100644 index 00000000..1330549d --- /dev/null +++ b/pochak/pochak/Network/Models/User/UnblockRequest.swift @@ -0,0 +1,12 @@ +// +// UnblockRequest.swift +// pochak +// +// Created by Seo Cindy on 9/30/24. +// + +import Foundation + +struct UnblockRequest: Encodable { + let blockedMemberHandle: String +} diff --git a/pochak/pochak/Network/Models/User/UnblockResponse.swift b/pochak/pochak/Network/Models/User/UnblockResponse.swift new file mode 100644 index 00000000..45bae087 --- /dev/null +++ b/pochak/pochak/Network/Models/User/UnblockResponse.swift @@ -0,0 +1,14 @@ +// +// UnblockResponse.swift +// pochak +// +// Created by Seo Cindy on 9/30/24. +// + +import Foundation + +struct UnblockResponse: Codable { + let isSuccess: Bool + let code: String + let message: String +} diff --git a/pochak/pochak/Network/Services/UserService.swift b/pochak/pochak/Network/Services/UserService.swift index 6563dcf6..a276ee32 100644 --- a/pochak/pochak/Network/Services/UserService.swift +++ b/pochak/pochak/Network/Services/UserService.swift @@ -27,4 +27,43 @@ struct UserService { } } } + + /// 팔로우 요청 혹은 취소하기 + /// - Parameters: + /// - handle: 팔로우 요청 혹은 취소하려는 사용자의 핸들 (아이디) + /// - completion: 통신 후 핸들러 (뷰컨트롤러) + static func blockUser( + handle: String, + completion: @escaping (_ succeed: BlockResponse?, _ failed: NetworkError?) -> Void) { + NetworkService.shared.request(BlockAPI.blockUser(handle)) { response in + switch response { + case .success(let data): + completion(data, nil) + case .failure(let error): + print("=== blockUser service error ===") + print(error.localizedDescription) + completion(nil, error) + } + } + } + + /// 팔로우 요청 혹은 취소하기 + /// - Parameters: + /// - handle: 팔로우 요청 혹은 취소하려는 사용자의 핸들 (아이디) + /// - completion: 통신 후 핸들러 (뷰컨트롤러) + static func unblockUser( + handle: String, + request: UnblockRequest, + completion: @escaping (_ succeed: UnblockResponse?, _ failed: NetworkError?) -> Void) { + NetworkService.shared.request(UnblockAPI.unblockUser(handle: handle, request: request)) { response in + switch response { + case .success(let data): + completion(data, nil) + case .failure(let error): + print("=== unblockUser service error ===") + print(error.localizedDescription) + completion(nil, error) + } + } + } } diff --git a/pochak/pochak/UI/Profile/MyProfile/Setting/BlockedUserList/BlockedUserViewController.swift b/pochak/pochak/UI/Profile/MyProfile/Setting/BlockedUserList/BlockedUserViewController.swift index 8ec0efbc..176011d2 100644 --- a/pochak/pochak/UI/Profile/MyProfile/Setting/BlockedUserList/BlockedUserViewController.swift +++ b/pochak/pochak/UI/Profile/MyProfile/Setting/BlockedUserList/BlockedUserViewController.swift @@ -133,10 +133,31 @@ extension BlockedUserViewController: CustomAlertDelegate { func confirmAction() { let userHandle = UserDefaultsManager.getData(type: String.self, forKey: .handle) - UnBlockDataManager.shared.unBlockDataManager(userHandle ?? "" , cellHandle ?? "", { resultData in + let request = UnblockRequest(blockedMemberHandle: cellHandle) + UserService.unblockUser(handle: userHandle, request: request) { [weak self] data, failed in + guard let data = data else { + // 에러가 난 경우, alert 창 present + switch failed { + case .disconnected: + self?.present(UIAlertController.networkErrorAlert(title: failed!.localizedDescription), animated: true) + case .serverError: + self?.present(UIAlertController.networkErrorAlert(title: failed!.localizedDescription), animated: true) + case .unknownError: + self?.present(UIAlertController.networkErrorAlert(title: failed!.localizedDescription), animated: true) + default: + self?.present(UIAlertController.networkErrorAlert(title: "요청에 실패하였습니다."), animated: true) + } + return + } + self.blockedUserList.remove(at: self.cellIndexPath!.row) self.tableView.reloadData() - }) + + } +// UnBlockDataManager.shared.unBlockDataManager(userHandle ?? "" , cellHandle ?? "", { resultData in +// self.blockedUserList.remove(at: self.cellIndexPath!.row) +// self.tableView.reloadData() +// }) } func cancel() { diff --git a/pochak/pochak/UI/Profile/OtherProfile/ProfileMenu/BlockAPI/BlockDataManager.swift b/pochak/pochak/UI/Profile/OtherProfile/ProfileMenu/BlockAPI_fin/BlockDataManager.swift similarity index 100% rename from pochak/pochak/UI/Profile/OtherProfile/ProfileMenu/BlockAPI/BlockDataManager.swift rename to pochak/pochak/UI/Profile/OtherProfile/ProfileMenu/BlockAPI_fin/BlockDataManager.swift diff --git a/pochak/pochak/UI/Profile/OtherProfile/ProfileMenu/BlockAPI/BlockDataModel.swift b/pochak/pochak/UI/Profile/OtherProfile/ProfileMenu/BlockAPI_fin/BlockDataModel.swift similarity index 100% rename from pochak/pochak/UI/Profile/OtherProfile/ProfileMenu/BlockAPI/BlockDataModel.swift rename to pochak/pochak/UI/Profile/OtherProfile/ProfileMenu/BlockAPI_fin/BlockDataModel.swift diff --git a/pochak/pochak/UI/Profile/OtherProfile/ProfileMenu/BlockAPI/UnblockDataManager.swift b/pochak/pochak/UI/Profile/OtherProfile/ProfileMenu/BlockAPI_fin/UnblockDataManager.swift similarity index 100% rename from pochak/pochak/UI/Profile/OtherProfile/ProfileMenu/BlockAPI/UnblockDataManager.swift rename to pochak/pochak/UI/Profile/OtherProfile/ProfileMenu/BlockAPI_fin/UnblockDataManager.swift diff --git a/pochak/pochak/UI/Profile/OtherProfile/ProfileMenu/BlockAPI/UnblockDataModel.swift b/pochak/pochak/UI/Profile/OtherProfile/ProfileMenu/BlockAPI_fin/UnblockDataModel.swift similarity index 100% rename from pochak/pochak/UI/Profile/OtherProfile/ProfileMenu/BlockAPI/UnblockDataModel.swift rename to pochak/pochak/UI/Profile/OtherProfile/ProfileMenu/BlockAPI_fin/UnblockDataModel.swift diff --git a/pochak/pochak/UI/Profile/OtherProfile/ProfileMenu/ProfileMenuViewController.swift b/pochak/pochak/UI/Profile/OtherProfile/ProfileMenu/ProfileMenuViewController.swift index 20aba28d..903ff943 100644 --- a/pochak/pochak/UI/Profile/OtherProfile/ProfileMenu/ProfileMenuViewController.swift +++ b/pochak/pochak/UI/Profile/OtherProfile/ProfileMenu/ProfileMenuViewController.swift @@ -47,12 +47,33 @@ class ProfileMenuViewController: UIViewController { extension ProfileMenuViewController: CustomAlertDelegate { func confirmAction() { - BlockDataManager.shared.blockDataManager(receivedHandle ?? "", { resultData in - print(resultData.message) + UserService.blockUser(handle: receivedHandle) { [weak self] data, failed in + guard let data = data else { + // 에러가 난 경우, alert 창 present + switch failed { + case .disconnected: + self?.present(UIAlertController.networkErrorAlert(title: failed!.localizedDescription), animated: true) + case .serverError: + self?.present(UIAlertController.networkErrorAlert(title: failed!.localizedDescription), animated: true) + case .unknownError: + self?.present(UIAlertController.networkErrorAlert(title: failed!.localizedDescription), animated: true) + default: + self?.present(UIAlertController.networkErrorAlert(title: "요청에 실패하였습니다."), animated: true) + } + return + } + + print(data.message) self.userBlockBtn.setTitle("차단취소", for: .normal) self.delegate?.dismissSecondViewController() self.dismiss(animated: true, completion: nil) - }) + } + // BlockDataManager.shared.blockDataManager(receivedHandle ?? "", { resultData in + // print(resultData.message) + // self.userBlockBtn.setTitle("차단취소", for: .normal) + // self.delegate?.dismissSecondViewController() + // self.dismiss(animated: true, completion: nil) + // }) } func cancel() { From a03e7e324ea17233c4aa9e4f74dc15e3e2d9ccb3 Mon Sep 17 00:00:00 2001 From: Jungyeon Seo Date: Mon, 30 Sep 2024 21:25:50 +0900 Subject: [PATCH 06/54] Refactor : block user list api --- pochak/pochak.xcodeproj/project.pbxproj | 18 ++++++-- .../Network/APIs/User/BlockListAPI.swift | 36 +++++++++++++++ .../Models/User/BlockListRequest.swift | 12 +++++ .../Models/User/BlockListResponse.swift | 33 ++++++++++++++ .../pochak/Network/Services/UserService.swift | 21 +++++++++ .../BlockedUserListDataManager.swift | 0 .../BlockedUserListDataModel.swift | 0 .../BlockedUserViewController.swift | 45 ++++++++++++++++--- .../cell/BlockedUserTableViewCell.swift | 25 ++++++----- 9 files changed, 172 insertions(+), 18 deletions(-) create mode 100644 pochak/pochak/Network/APIs/User/BlockListAPI.swift create mode 100644 pochak/pochak/Network/Models/User/BlockListRequest.swift create mode 100644 pochak/pochak/Network/Models/User/BlockListResponse.swift rename pochak/pochak/UI/Profile/MyProfile/Setting/BlockedUserList/{BlockListAPI => BlockListAPI_fin}/BlockedUserListDataManager.swift (100%) rename pochak/pochak/UI/Profile/MyProfile/Setting/BlockedUserList/{BlockListAPI => BlockListAPI_fin}/BlockedUserListDataModel.swift (100%) diff --git a/pochak/pochak.xcodeproj/project.pbxproj b/pochak/pochak.xcodeproj/project.pbxproj index 6d1a808c..744c37ef 100644 --- a/pochak/pochak.xcodeproj/project.pbxproj +++ b/pochak/pochak.xcodeproj/project.pbxproj @@ -135,6 +135,9 @@ 374E463F2CAAC931008AE361 /* UnblockAPI.swift in Sources */ = {isa = PBXBuildFile; fileRef = 374E463E2CAAC931008AE361 /* UnblockAPI.swift */; }; 374E46412CAAC9AE008AE361 /* UnblockRequest.swift in Sources */ = {isa = PBXBuildFile; fileRef = 374E46402CAAC9AE008AE361 /* UnblockRequest.swift */; }; 374E46432CAAC9B5008AE361 /* UnblockResponse.swift in Sources */ = {isa = PBXBuildFile; fileRef = 374E46422CAAC9B5008AE361 /* UnblockResponse.swift */; }; + 374E46452CAACD33008AE361 /* BlockListAPI.swift in Sources */ = {isa = PBXBuildFile; fileRef = 374E46442CAACD33008AE361 /* BlockListAPI.swift */; }; + 374E46472CAACE4C008AE361 /* BlockListRequest.swift in Sources */ = {isa = PBXBuildFile; fileRef = 374E46462CAACE4C008AE361 /* BlockListRequest.swift */; }; + 374E46492CAACE53008AE361 /* BlockListResponse.swift in Sources */ = {isa = PBXBuildFile; fileRef = 374E46482CAACE53008AE361 /* BlockListResponse.swift */; }; 3766F4022C3706DC001DD239 /* BlockedUserTableViewCell.xib in Resources */ = {isa = PBXBuildFile; fileRef = 3766F4012C3706DC001DD239 /* BlockedUserTableViewCell.xib */; }; 3766F4032C3706DC001DD239 /* BlockedUserTableViewCell.swift in Sources */ = {isa = PBXBuildFile; fileRef = 3766F4002C3706DC001DD239 /* BlockedUserTableViewCell.swift */; }; 3766F4062C370A7C001DD239 /* BlockedUserListDataManager.swift in Sources */ = {isa = PBXBuildFile; fileRef = 3766F4052C370A7C001DD239 /* BlockedUserListDataManager.swift */; }; @@ -391,6 +394,9 @@ 374E463E2CAAC931008AE361 /* UnblockAPI.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = UnblockAPI.swift; sourceTree = ""; }; 374E46402CAAC9AE008AE361 /* UnblockRequest.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = UnblockRequest.swift; sourceTree = ""; }; 374E46422CAAC9B5008AE361 /* UnblockResponse.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = UnblockResponse.swift; sourceTree = ""; }; + 374E46442CAACD33008AE361 /* BlockListAPI.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = BlockListAPI.swift; sourceTree = ""; }; + 374E46462CAACE4C008AE361 /* BlockListRequest.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = BlockListRequest.swift; sourceTree = ""; }; + 374E46482CAACE53008AE361 /* BlockListResponse.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = BlockListResponse.swift; sourceTree = ""; }; 3750669E2C3BB1660036E264 /* pochak.entitlements */ = {isa = PBXFileReference; lastKnownFileType = text.plist.entitlements; path = pochak.entitlements; sourceTree = ""; }; 3766F4002C3706DC001DD239 /* BlockedUserTableViewCell.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = BlockedUserTableViewCell.swift; sourceTree = ""; }; 3766F4012C3706DC001DD239 /* BlockedUserTableViewCell.xib */ = {isa = PBXFileReference; lastKnownFileType = file.xib; path = BlockedUserTableViewCell.xib; sourceTree = ""; }; @@ -616,6 +622,7 @@ 0822A04E2CA1980200F87E2C /* FollowAPI.swift */, 374E463A2CAAC762008AE361 /* BlockAPI.swift */, 374E463E2CAAC931008AE361 /* UnblockAPI.swift */, + 374E46442CAACD33008AE361 /* BlockListAPI.swift */, ); path = User; sourceTree = ""; @@ -645,6 +652,8 @@ 374E463C2CAAC82E008AE361 /* BlockResponse.swift */, 374E46402CAAC9AE008AE361 /* UnblockRequest.swift */, 374E46422CAAC9B5008AE361 /* UnblockResponse.swift */, + 374E46462CAACE4C008AE361 /* BlockListRequest.swift */, + 374E46482CAACE53008AE361 /* BlockListResponse.swift */, ); path = User; sourceTree = ""; @@ -987,19 +996,19 @@ isa = PBXGroup; children = ( 3766F4092C370CF5001DD239 /* BlockedUserViewController.swift */, - 3766F40D2C373CFF001DD239 /* BlockListAPI */, + 3766F40D2C373CFF001DD239 /* BlockListAPI_fin */, 3766F3FF2C3706C7001DD239 /* cell */, ); path = BlockedUserList; sourceTree = ""; }; - 3766F40D2C373CFF001DD239 /* BlockListAPI */ = { + 3766F40D2C373CFF001DD239 /* BlockListAPI_fin */ = { isa = PBXGroup; children = ( 3766F4072C370A82001DD239 /* BlockedUserListDataModel.swift */, 3766F4052C370A7C001DD239 /* BlockedUserListDataManager.swift */, ); - path = BlockListAPI; + path = BlockListAPI_fin; sourceTree = ""; }; 3769D6AC2B3C2F9900294CD1 /* SignUp */ = { @@ -1754,6 +1763,7 @@ EA2CD63F2C5F585400644EFE /* HTTPHeaderType.swift in Sources */, 3769D6CE2B3C563A00294CD1 /* PostListViewController.swift in Sources */, 0822A0542CA1983100F87E2C /* ExploreResponse.swift in Sources */, + 374E46492CAACE53008AE361 /* BlockListResponse.swift in Sources */, 374E46352CAAC445008AE361 /* SignOutAPI.swift in Sources */, 0822A0662CA1983C00F87E2C /* SearchRequest.swift in Sources */, 0822A0712CA1983C00F87E2C /* PostDetailResponse.swift in Sources */, @@ -1816,6 +1826,7 @@ 3766F40A2C370CF5001DD239 /* BlockedUserViewController.swift in Sources */, 374261782C31C6ED00B67886 /* AppleLoginDataManager.swift in Sources */, 0844D7EB2BF218A5001154AC /* ReportViewCell.swift in Sources */, + 374E46472CAACE4C008AE361 /* BlockListRequest.swift in Sources */, 379A6A342B569DFA0087FAAC /* AuthenticationCredential.swift in Sources */, 0844649C2BF0F25900949850 /* PostMenuViewController.swift in Sources */, 0822A0702CA1983C00F87E2C /* PostReportResponse.swift in Sources */, @@ -1894,6 +1905,7 @@ 0844D7F32BF21A80001154AC /* CancelViewCell.swift in Sources */, 3766F4032C3706DC001DD239 /* BlockedUserTableViewCell.swift in Sources */, 37D311D52B53056700A1D7C1 /* ProfileUpdateDataManager.swift in Sources */, + 374E46452CAACD33008AE361 /* BlockListAPI.swift in Sources */, 3769D6B92B3C345800294CD1 /* MyProfileTabViewController.swift in Sources */, 0822A0682CA1983C00F87E2C /* FollowResponse.swift in Sources */, EA2CD63D2C5F4C2B00644EFE /* NetworkError.swift in Sources */, diff --git a/pochak/pochak/Network/APIs/User/BlockListAPI.swift b/pochak/pochak/Network/APIs/User/BlockListAPI.swift new file mode 100644 index 00000000..95226afa --- /dev/null +++ b/pochak/pochak/Network/APIs/User/BlockListAPI.swift @@ -0,0 +1,36 @@ +// +// BlockListAPI.swift +// pochak +// +// Created by Seo Cindy on 9/30/24. +// + +import Foundation +import Alamofire + +enum BlockListAPI { + case getBlockUserList(handle: String, request: BlockListRequest) +} + +extension BlockListAPI: BaseAPI { + + typealias Response = BlockListResponse + + var method: HTTPMethod { + switch self { + case .getBlockUserList: return .get + } + } + + var path: String { + switch self { + case .getBlockUserList(let handle, _): return "/v2/members/\(handle)/block" + } + } + + var parameters: RequestParams? { + switch self { + case .getBlockUserList(_, let request): return .query(request) + } + } +} diff --git a/pochak/pochak/Network/Models/User/BlockListRequest.swift b/pochak/pochak/Network/Models/User/BlockListRequest.swift new file mode 100644 index 00000000..52a688b7 --- /dev/null +++ b/pochak/pochak/Network/Models/User/BlockListRequest.swift @@ -0,0 +1,12 @@ +// +// BlockListRequest.swift +// pochak +// +// Created by Seo Cindy on 9/30/24. +// + +import Foundation + +struct BlockListRequest: Encodable { + let page: Int +} diff --git a/pochak/pochak/Network/Models/User/BlockListResponse.swift b/pochak/pochak/Network/Models/User/BlockListResponse.swift new file mode 100644 index 00000000..38a0f849 --- /dev/null +++ b/pochak/pochak/Network/Models/User/BlockListResponse.swift @@ -0,0 +1,33 @@ +// +// BlockListResponse.swift +// pochak +// +// Created by Seo Cindy on 9/30/24. +// + +import Foundation + +struct BlockListResponse : Codable { + var isSuccess: Bool + var code: String + var message: String + var result : BlockListResult +} + +struct BlockListResult : Codable { + var pageInfo: BlockListPageInfo + var blockList: [BlockList] +} + +struct BlockListPageInfo : Codable { + var lastPage : Bool + var totalPages: Int + var totalElements: Int + var size: Int +} + +struct BlockList : Codable { + var profileImage: String + var handle: String + var name: String +} diff --git a/pochak/pochak/Network/Services/UserService.swift b/pochak/pochak/Network/Services/UserService.swift index a276ee32..674c7875 100644 --- a/pochak/pochak/Network/Services/UserService.swift +++ b/pochak/pochak/Network/Services/UserService.swift @@ -66,4 +66,25 @@ struct UserService { } } } + + + /// 팔로우 요청 혹은 취소하기 + /// - Parameters: + /// - handle: 팔로우 요청 혹은 취소하려는 사용자의 핸들 (아이디) + /// - completion: 통신 후 핸들러 (뷰컨트롤러) + static func getBlockUserList( + handle: String, + request: BlockListRequest, + completion: @escaping (_ succeed: BlockListResponse?, _ failed: NetworkError?) -> Void) { + NetworkService.shared.request(BlockListAPI.getBlockUserList(handle: handle, request: request)) { response in + switch response { + case .success(let data): + completion(data, nil) + case .failure(let error): + print("=== getBlockUserList service error ===") + print(error.localizedDescription) + completion(nil, error) + } + } + } } diff --git a/pochak/pochak/UI/Profile/MyProfile/Setting/BlockedUserList/BlockListAPI/BlockedUserListDataManager.swift b/pochak/pochak/UI/Profile/MyProfile/Setting/BlockedUserList/BlockListAPI_fin/BlockedUserListDataManager.swift similarity index 100% rename from pochak/pochak/UI/Profile/MyProfile/Setting/BlockedUserList/BlockListAPI/BlockedUserListDataManager.swift rename to pochak/pochak/UI/Profile/MyProfile/Setting/BlockedUserList/BlockListAPI_fin/BlockedUserListDataManager.swift diff --git a/pochak/pochak/UI/Profile/MyProfile/Setting/BlockedUserList/BlockListAPI/BlockedUserListDataModel.swift b/pochak/pochak/UI/Profile/MyProfile/Setting/BlockedUserList/BlockListAPI_fin/BlockedUserListDataModel.swift similarity index 100% rename from pochak/pochak/UI/Profile/MyProfile/Setting/BlockedUserList/BlockListAPI/BlockedUserListDataModel.swift rename to pochak/pochak/UI/Profile/MyProfile/Setting/BlockedUserList/BlockListAPI_fin/BlockedUserListDataModel.swift diff --git a/pochak/pochak/UI/Profile/MyProfile/Setting/BlockedUserList/BlockedUserViewController.swift b/pochak/pochak/UI/Profile/MyProfile/Setting/BlockedUserList/BlockedUserViewController.swift index 176011d2..0721dd31 100644 --- a/pochak/pochak/UI/Profile/MyProfile/Setting/BlockedUserList/BlockedUserViewController.swift +++ b/pochak/pochak/UI/Profile/MyProfile/Setting/BlockedUserList/BlockedUserViewController.swift @@ -72,13 +72,29 @@ class BlockedUserViewController: UIViewController { private func setUpData() { let handle = UserDefaultsManager.getData(type: String.self, forKey: .handle) ?? "handle not found" isCurrentlyFetching = true - BlockedUserListDataManager.shared.blockedUserListDataManager(handle, currentFetchingPage, { resultData in - let newBlockedUsers = resultData.blockList - let startIndex = resultData.blockList.count + let request = BlockListRequest(page: currentFetchingPage) + UserService.getBlockUserList(handle: handle, request: request) { [weak self] data, failed in + guard let data = data else { + // 에러가 난 경우, alert 창 present + switch failed { + case .disconnected: + self?.present(UIAlertController.networkErrorAlert(title: failed!.localizedDescription), animated: true) + case .serverError: + self?.present(UIAlertController.networkErrorAlert(title: failed!.localizedDescription), animated: true) + case .unknownError: + self?.present(UIAlertController.networkErrorAlert(title: failed!.localizedDescription), animated: true) + default: + self?.present(UIAlertController.networkErrorAlert(title: "요청에 실패하였습니다."), animated: true) + } + return + } + + let newBlockedUsers = data.result.blockList + let startIndex = data.result.blockList.count let endIndex = startIndex + newBlockedUsers.count let newIndexPaths = (startIndex.. Date: Tue, 1 Oct 2024 01:19:17 +0900 Subject: [PATCH 07/54] =?UTF-8?q?Refactor=20:=20=ED=94=84=EB=A1=9C?= =?UTF-8?q?=ED=95=84=20API=20=EB=84=A4=ED=8A=B8=EC=9B=8C=ED=81=AC=20?= =?UTF-8?q?=EB=A0=88=EC=9D=B4=EC=96=B4=20=EC=A0=81=EC=9A=A9?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- pochak/Pods/Pods.xcodeproj/project.pbxproj | 581 +++++++++--------- pochak/pochak.xcodeproj/project.pbxproj | 40 +- .../APIs/Authentication/LogOutAPI.swift | 4 +- .../APIs/Authentication/SignOutAPI.swift | 4 +- .../APIs/Profile/ProfileUpdateAPI.swift | 2 +- .../APIs/User/FollowerRetrievalAPI.swift | 36 ++ .../APIs/User/FollowingRetrievalAPI.swift | 36 ++ .../pochak/Network/APIs/User/UnblockAPI.swift | 4 +- .../Network/APIs/User/UnfollowAPI.swift | 36 ++ .../Models/User/FollowListRequest.swift | 13 + .../Models/User/FollowListResponse.swift | 35 ++ .../Network/Models/User/UnfollowRequest.swift | 12 + .../Models/User/UnfollowResponse.swift | 14 + .../Services/AuthenticationService.swift | 4 +- .../Network/Services/ProfileService.swift | 2 +- .../pochak/Network/Services/UserService.swift | 56 ++ .../FollowAPI/DeleteFollowerDataManager.swift | 34 - .../FollowAPI/DeleteFollowerDataModel.swift | 12 - .../FollowAPI/FollowListDataManager.swift | 67 -- .../FollowAPI/FollowListDataModel.swift | 26 - .../FollowAPI/FollowToggleDataManager.swift | 34 - .../FollowAPI/FollowToggleDataModel.swift | 12 - .../DeleteFollowerDataManager.swift | 34 + .../DeleteFollowerDataModel.swift | 12 + .../FollowAPI_fin/FollowListDataManager.swift | 67 ++ .../FollowAPI_fin/FollowListDataModel.swift | 26 + .../FollowToggleDataManager.swift | 34 + .../FollowAPI_fin/FollowToggleDataModel.swift | 12 + .../FollowerListTabmanViewController.swift | 101 ++- .../FollowingListTabmanViewController.swift | 64 +- .../cell/FollowerCollectionViewCell.swift | 27 +- .../cell/FollowingCollectionViewCell.swift | 26 +- .../MyProfileTabViewController.swift | 15 +- .../PochakPostTabmanViewController.swift | 18 +- .../PochakedPostTabmanViewController.swift | 81 +-- .../cell/ProfilePostCollectionViewCell.swift | 2 +- .../BlockedUserListDataManager.swift | 72 +-- .../BlockedUserListDataModel.swift | 60 +- .../BlockedUserViewController.swift | 22 +- .../cell/BlockedUserTableViewCell.swift | 2 +- .../Setting/SettingsViewController.swift | 12 +- .../UpdateProfileViewController.swift | 5 +- .../OtherUserProfileViewController.swift | 175 ++++-- .../ProfileMenuViewController.swift | 8 +- 44 files changed, 1188 insertions(+), 751 deletions(-) create mode 100644 pochak/pochak/Network/APIs/User/FollowerRetrievalAPI.swift create mode 100644 pochak/pochak/Network/APIs/User/FollowingRetrievalAPI.swift create mode 100644 pochak/pochak/Network/APIs/User/UnfollowAPI.swift create mode 100644 pochak/pochak/Network/Models/User/FollowListRequest.swift create mode 100644 pochak/pochak/Network/Models/User/FollowListResponse.swift create mode 100644 pochak/pochak/Network/Models/User/UnfollowRequest.swift create mode 100644 pochak/pochak/Network/Models/User/UnfollowResponse.swift delete mode 100644 pochak/pochak/UI/Profile/MyProfile/FollowListTabman/FollowAPI/DeleteFollowerDataManager.swift delete mode 100644 pochak/pochak/UI/Profile/MyProfile/FollowListTabman/FollowAPI/DeleteFollowerDataModel.swift delete mode 100644 pochak/pochak/UI/Profile/MyProfile/FollowListTabman/FollowAPI/FollowListDataManager.swift delete mode 100644 pochak/pochak/UI/Profile/MyProfile/FollowListTabman/FollowAPI/FollowListDataModel.swift delete mode 100644 pochak/pochak/UI/Profile/MyProfile/FollowListTabman/FollowAPI/FollowToggleDataManager.swift delete mode 100644 pochak/pochak/UI/Profile/MyProfile/FollowListTabman/FollowAPI/FollowToggleDataModel.swift create mode 100644 pochak/pochak/UI/Profile/MyProfile/FollowListTabman/FollowAPI_fin/DeleteFollowerDataManager.swift create mode 100644 pochak/pochak/UI/Profile/MyProfile/FollowListTabman/FollowAPI_fin/DeleteFollowerDataModel.swift create mode 100644 pochak/pochak/UI/Profile/MyProfile/FollowListTabman/FollowAPI_fin/FollowListDataManager.swift create mode 100644 pochak/pochak/UI/Profile/MyProfile/FollowListTabman/FollowAPI_fin/FollowListDataModel.swift create mode 100644 pochak/pochak/UI/Profile/MyProfile/FollowListTabman/FollowAPI_fin/FollowToggleDataManager.swift create mode 100644 pochak/pochak/UI/Profile/MyProfile/FollowListTabman/FollowAPI_fin/FollowToggleDataModel.swift diff --git a/pochak/Pods/Pods.xcodeproj/project.pbxproj b/pochak/Pods/Pods.xcodeproj/project.pbxproj index d4571307..eea462fb 100644 --- a/pochak/Pods/Pods.xcodeproj/project.pbxproj +++ b/pochak/Pods/Pods.xcodeproj/project.pbxproj @@ -18,6 +18,7 @@ 9DFD6F09B234E99CA712FF4678C9E565 /* PBXTargetDependency */, ); name = GoogleAppMeasurement; + productName = GoogleAppMeasurement; }; C49E7A4D59E5C8BE8DE9FB1EFB150185 /* FirebaseAnalytics */ = { isa = PBXAggregateTarget; @@ -33,13 +34,14 @@ F0972049DCF071815E81D0280606E0BB /* PBXTargetDependency */, ); name = FirebaseAnalytics; + productName = FirebaseAnalytics; }; /* End PBXAggregateTarget section */ /* Begin PBXBuildFile section */ 000CD368770CB1CC6B405E528F076446 /* GULReachabilityChecker+Internal.h in Headers */ = {isa = PBXBuildFile; fileRef = C5D7D5C40F1415654B0B19153BFA11A0 /* GULReachabilityChecker+Internal.h */; settings = {ATTRIBUTES = (Project, ); }; }; 00133907C9BC51C9D72F5D6001A1BF4F /* GDTCOREndpoints.h in Headers */ = {isa = PBXBuildFile; fileRef = B1F51D963B698B6CEDB1752D7D2CA445 /* GDTCOREndpoints.h */; settings = {ATTRIBUTES = (Public, ); }; }; - 002C4B90D97BC502D2EDFB977EBECBF2 /* nanopb-nanopb_Privacy in Resources */ = {isa = PBXBuildFile; fileRef = 3227F3FC45681D7CEE5D1355A532398A /* nanopb-nanopb_Privacy */; }; + 002C4B90D97BC502D2EDFB977EBECBF2 /* nanopb_Privacy.bundle in Resources */ = {isa = PBXBuildFile; fileRef = 3227F3FC45681D7CEE5D1355A532398A /* nanopb_Privacy.bundle */; }; 005205A8EA2E651091EB8AC8FFD49233 /* FIRInstallationsHTTPError.h in Headers */ = {isa = PBXBuildFile; fileRef = 969ACC788029D980A79628909DFA09F0 /* FIRInstallationsHTTPError.h */; settings = {ATTRIBUTES = (Project, ); }; }; 00B15FCCA7CC12C15A13010614F01854 /* OIDURLQueryComponent.m in Sources */ = {isa = PBXBuildFile; fileRef = 0C7DD9D368856AF605AF3F1F52F3BC01 /* OIDURLQueryComponent.m */; }; 00BEA6029C428FEE644AC3D42AD83282 /* ImagePrefetcher.swift in Sources */ = {isa = PBXBuildFile; fileRef = 720D47635AD40EF087555DE4AC9E058F /* ImagePrefetcher.swift */; }; @@ -353,7 +355,7 @@ 3D939CC1B7D7F61C3D8E969E0F09E5C1 /* Promise+Recover.swift in Sources */ = {isa = PBXBuildFile; fileRef = 6C4B72881CD091C837F701DDC605E4F3 /* Promise+Recover.swift */; }; 3E036CAA97F279B0C6ABD859726A047A /* CustomPersistable.swift in Sources */ = {isa = PBXBuildFile; fileRef = 46233D108EE59BBB1EA8F8B79838D4C6 /* CustomPersistable.swift */; }; 3E1B5386B32268FA87A5B13C81242612 /* Sync.swift in Sources */ = {isa = PBXBuildFile; fileRef = 25403AF4206BBB6DB0F0953B1975624C /* Sync.swift */; }; - 3E7C9F2E9D8989060B94B397BAC576C7 /* FirebaseCrashlytics-FirebaseCrashlytics_Privacy in Resources */ = {isa = PBXBuildFile; fileRef = 859AE0302B28BD8AE67A780BFCAEE082 /* FirebaseCrashlytics-FirebaseCrashlytics_Privacy */; }; + 3E7C9F2E9D8989060B94B397BAC576C7 /* FirebaseCrashlytics_Privacy.bundle in Resources */ = {isa = PBXBuildFile; fileRef = 859AE0302B28BD8AE67A780BFCAEE082 /* FirebaseCrashlytics_Privacy.bundle */; }; 3EB8055D92AA4B3279E51700D6AFCF7A /* FBLPromise+Do.m in Sources */ = {isa = PBXBuildFile; fileRef = 0C70ECD23D9F5BFEA49EFE694C19DB1C /* FBLPromise+Do.m */; }; 3EE594CC426951434B0174F9289AB732 /* RLMRealm.mm in Sources */ = {isa = PBXBuildFile; fileRef = 262A73415B6FC8DC98400A585E4273D9 /* RLMRealm.mm */; settings = {COMPILER_FLAGS = "-DREALM_HAVE_CONFIG -DREALM_COCOA_VERSION='@\"10.45.3\"' -D__ASSERTMACROS__ -DREALM_ENABLE_SYNC"; }; }; 3EEB0BAB4684DBA87988BEBEE5A42AD7 /* RLMBSON.h in Headers */ = {isa = PBXBuildFile; fileRef = 7EED3E4A31035D3305D0142B1221E287 /* RLMBSON.h */; }; @@ -368,7 +370,7 @@ 40615F3448D42E522F19EED579158F42 /* EncodedRolloutAssignment.swift in Sources */ = {isa = PBXBuildFile; fileRef = 165C90420511686B3C0CF9E8DC858C63 /* EncodedRolloutAssignment.swift */; }; 409221ABB1CE39C1A87EE5E10B03225E /* RLMConstants.h in Copy . Public Headers */ = {isa = PBXBuildFile; fileRef = 17D15EB0E4D70EA0D09CABF619874F21 /* RLMConstants.h */; }; 412DDFCE41F82C3C7947903A74A76034 /* RLMSyncSession.h in Headers */ = {isa = PBXBuildFile; fileRef = 8AACFA8D4D94CC02289FF03AE3AB702A /* RLMSyncSession.h */; }; - 41969B630F7BB8483850BE6CE61EB1A7 /* FirebaseCoreExtension-FirebaseCoreExtension_Privacy in Resources */ = {isa = PBXBuildFile; fileRef = ECAC028550A03412C51913B85686D98B /* FirebaseCoreExtension-FirebaseCoreExtension_Privacy */; }; + 41969B630F7BB8483850BE6CE61EB1A7 /* FirebaseCoreExtension_Privacy.bundle in Resources */ = {isa = PBXBuildFile; fileRef = ECAC028550A03412C51913B85686D98B /* FirebaseCoreExtension_Privacy.bundle */; }; 420C200A05BB29E1D299D1BADE9139D2 /* CFNetwork.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = 2223B6B1623F64AEB3891B8D2230A4E7 /* CFNetwork.framework */; }; 423B029F08D7EF948DE1032C946E91E1 /* NanoPB+CustomStringConvertible.swift in Sources */ = {isa = PBXBuildFile; fileRef = 6508D754C3FFC4C9A87F978304A40285 /* NanoPB+CustomStringConvertible.swift */; }; 42606A9EC6B47ACFFCD3795165998394 /* RLMResults.h in Copy . Public Headers */ = {isa = PBXBuildFile; fileRef = 44076AB70C350A3C5172E11E41BA6B13 /* RLMResults.h */; }; @@ -400,7 +402,7 @@ 46F750A94940C329E40EEA07AB873DD5 /* Page.swift in Sources */ = {isa = PBXBuildFile; fileRef = 60BF0D0CF268D6CEA952DF7F1C1AA04E /* Page.swift */; }; 4724AB5CD1E16BBFF664FC2BA7556DBF /* RLMObjectId.h in Headers */ = {isa = PBXBuildFile; fileRef = A4CD2668AB59B172D40CD5C4A769F752 /* RLMObjectId.h */; }; 473B1E734EF7B18631E38BEEA2D2EA20 /* PrivacyInfo.xcprivacy in Resources */ = {isa = PBXBuildFile; fileRef = 6E4EDE882B52CAC2ACEDE13ACA36EC47 /* PrivacyInfo.xcprivacy */; }; - 47BC67E1B06D23BFE3B37EAD72CB15EB /* FirebaseCoreInternal-FirebaseCoreInternal_Privacy in Resources */ = {isa = PBXBuildFile; fileRef = 4DB03FD262B678178A44272143846563 /* FirebaseCoreInternal-FirebaseCoreInternal_Privacy */; }; + 47BC67E1B06D23BFE3B37EAD72CB15EB /* FirebaseCoreInternal_Privacy.bundle in Resources */ = {isa = PBXBuildFile; fileRef = 4DB03FD262B678178A44272143846563 /* FirebaseCoreInternal_Privacy.bundle */; }; 47D4A0C3E2AA44B81CA808C6D939E9B3 /* RLMRealm_Dynamic.h in Headers */ = {isa = PBXBuildFile; fileRef = 6C1BC911F827B33F33FEDE7517F05153 /* RLMRealm_Dynamic.h */; }; 4816ED359D1CCB98A1C010564EE02C2F /* SafariServices.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = 898EB913FAE293932FA2B232C36DED41 /* SafariServices.framework */; }; 482B74C0548970BB9C095E2D8530E421 /* ParameterEncoding.swift in Sources */ = {isa = PBXBuildFile; fileRef = 83B2148C1820CCC0B4B7A9DE082BD609 /* ParameterEncoding.swift */; }; @@ -723,7 +725,7 @@ 7FB6F7EB4B4ABDB95B60010E482F1122 /* FIRInstallationsIIDTokenStore.h in Headers */ = {isa = PBXBuildFile; fileRef = CB244C4B17FB82973A42D417A2382BCA /* FIRInstallationsIIDTokenStore.h */; settings = {ATTRIBUTES = (Project, ); }; }; 7FC3CB1D183769A6333D0D1DEF28CAFD /* FIRCLSUUID.h in Headers */ = {isa = PBXBuildFile; fileRef = C2BE1D39CEC08FF26105D013517D05C0 /* FIRCLSUUID.h */; settings = {ATTRIBUTES = (Project, ); }; }; 7FFE4021A4F14124342AD41CE1117B3E /* KFAnimatedImage.swift in Sources */ = {isa = PBXBuildFile; fileRef = 7DFEBAC9354AC1CED59229DBAC7DB48C /* KFAnimatedImage.swift */; }; - 800DF30A0C95155BEED83637391A907E /* GoogleDataTransport-GoogleDataTransport_Privacy in Resources */ = {isa = PBXBuildFile; fileRef = F73AA961F4AEFF2B46B00AE435DF6BE3 /* GoogleDataTransport-GoogleDataTransport_Privacy */; }; + 800DF30A0C95155BEED83637391A907E /* GoogleDataTransport_Privacy.bundle in Resources */ = {isa = PBXBuildFile; fileRef = F73AA961F4AEFF2B46B00AE435DF6BE3 /* GoogleDataTransport_Privacy.bundle */; }; 802C8700DC0809CF4002A2CFA2BED876 /* RLMThreadSafeReference.h in Copy . Public Headers */ = {isa = PBXBuildFile; fileRef = 54ADF85CB078A6EA82225A98A168B2C9 /* RLMThreadSafeReference.h */; }; 804AFB896214805001FA0E1371EE4533 /* FBLPromiseError.m in Sources */ = {isa = PBXBuildFile; fileRef = 1773970A093519EA394FE0033C71CC6E /* FBLPromiseError.m */; }; 805DA707392EAFCECC606AA295C8DF16 /* GDTCORUploadBatch.h in Headers */ = {isa = PBXBuildFile; fileRef = 4D743B54C59EA4F69E4E94676EB620E2 /* GDTCORUploadBatch.h */; settings = {ATTRIBUTES = (Project, ); }; }; @@ -765,7 +767,7 @@ 87740A39921FDB7DEAB427323702E072 /* FBLPromise+Timeout.m in Sources */ = {isa = PBXBuildFile; fileRef = C76406AAEA68AA2ECBC31467A4E59BCA /* FBLPromise+Timeout.m */; }; 881A35B28D93C56E46E305F6138B1A76 /* ImageDownloaderDelegate.swift in Sources */ = {isa = PBXBuildFile; fileRef = 6BAC07A96784316DE633D2D7017B93E8 /* ImageDownloaderDelegate.swift */; }; 881E934DEC2997D86540D678D7A0DBF6 /* fr.lproj in Resources */ = {isa = PBXBuildFile; fileRef = 2DCB4DBCA1BBF29F4BDA7B2B0A18E870 /* fr.lproj */; }; - 8856A14B17D6F639AA63120DE3F4B6CB /* PromisesSwift-Promises_Privacy in Resources */ = {isa = PBXBuildFile; fileRef = 067CED0F0662BBE6DC889AEC6DAB3049 /* PromisesSwift-Promises_Privacy */; }; + 8856A14B17D6F639AA63120DE3F4B6CB /* Promises_Privacy.bundle in Resources */ = {isa = PBXBuildFile; fileRef = 067CED0F0662BBE6DC889AEC6DAB3049 /* Promises_Privacy.bundle */; }; 88650DF0D570DDE1BB1D864D8D23A09F /* FIRInstallationsAPIService.h in Headers */ = {isa = PBXBuildFile; fileRef = C2269879581C488F140BD9874D110A98 /* FIRInstallationsAPIService.h */; settings = {ATTRIBUTES = (Project, ); }; }; 887AE02C3F5F60E0C16A972D29245A26 /* FIRCLSOnDemandModel.m in Sources */ = {isa = PBXBuildFile; fileRef = D17160D1F529D31BE3E7DD8D1CD71662 /* FIRCLSOnDemandModel.m */; }; 887BA44717C78C68484FF9CD595C5E68 /* FIRInteropEventNames.h in Headers */ = {isa = PBXBuildFile; fileRef = 9E909A2F7E6527CA96C7420EE9D35640 /* FIRInteropEventNames.h */; settings = {ATTRIBUTES = (Project, ); }; }; @@ -1041,7 +1043,7 @@ C23FE30730354F85E4655C789686C28F /* SettingsDownloadClient.swift in Sources */ = {isa = PBXBuildFile; fileRef = 07835FCE49B13ECBA587E83F3C8DBD00 /* SettingsDownloadClient.swift */; }; C2636D19CCE19A2042D35425D3CCC620 /* AppAuth-dummy.m in Sources */ = {isa = PBXBuildFile; fileRef = 9C03BA4874354369BADC12262C198BE9 /* AppAuth-dummy.m */; }; C266072BDF15A9DE317F4C5C3AA71448 /* GIDAuthentication.m in Sources */ = {isa = PBXBuildFile; fileRef = EB8BB125962C0CD314CBA8980CCF2B87 /* GIDAuthentication.m */; }; - C2A199DC8F50EB4A931BAF930A197460 /* FirebaseInstallations-FirebaseInstallations_Privacy in Resources */ = {isa = PBXBuildFile; fileRef = 47C581450CDB4A6111CB97EEE0711A8C /* FirebaseInstallations-FirebaseInstallations_Privacy */; }; + C2A199DC8F50EB4A931BAF930A197460 /* FirebaseInstallations_Privacy.bundle in Resources */ = {isa = PBXBuildFile; fileRef = 47C581450CDB4A6111CB97EEE0711A8C /* FirebaseInstallations_Privacy.bundle */; }; C2B2A155807F48E3C92AA961AE477181 /* FBLPromise+Always.m in Sources */ = {isa = PBXBuildFile; fileRef = FD3F1D1EDE5E352D9FAFC6F87EBCF7B4 /* FBLPromise+Always.m */; }; C35827B812D03A8897A9D805702D1687 /* FBLPromise+Async.m in Sources */ = {isa = PBXBuildFile; fileRef = 23E7711D6B4B146DABA29507BD78994A /* FBLPromise+Async.m */; }; C38FB2843D0B74D204AE1EA135F47583 /* FIRFirebaseUserAgent.h in Headers */ = {isa = PBXBuildFile; fileRef = D1609C0A40DAF766A72CE0DF89DB6653 /* FIRFirebaseUserAgent.h */; settings = {ATTRIBUTES = (Project, ); }; }; @@ -1064,10 +1066,10 @@ C736D640763E1E8D1DEE2E2876354E08 /* PageboyViewControllerDataSource.swift in Sources */ = {isa = PBXBuildFile; fileRef = 89051E828DA018AE503C7C8AD6DDA719 /* PageboyViewControllerDataSource.swift */; }; C73DB224800E4FE946D4411DD3232616 /* FIRCLSSymbolicationOperation.m in Sources */ = {isa = PBXBuildFile; fileRef = 1EB7C3B2BA74BEDB571BFFC5083E8499 /* FIRCLSSymbolicationOperation.m */; }; C784E37EA6C655C02DC577CE92898A41 /* FBLPromise+Recover.m in Sources */ = {isa = PBXBuildFile; fileRef = C83DD2FF62BCAF3E9BE815B74F1F4E51 /* FBLPromise+Recover.m */; }; - C79EECCFFA6D323EBC9109D0EB2D99B3 /* PromisesObjC-FBLPromises_Privacy in Resources */ = {isa = PBXBuildFile; fileRef = 3F238BB22C5201CE689CAF2F766AED95 /* PromisesObjC-FBLPromises_Privacy */; }; + C79EECCFFA6D323EBC9109D0EB2D99B3 /* FBLPromises_Privacy.bundle in Resources */ = {isa = PBXBuildFile; fileRef = 3F238BB22C5201CE689CAF2F766AED95 /* FBLPromises_Privacy.bundle */; }; C7EABB9D07353206EC77390B42EC50A6 /* GULNetworkInfo.h in Headers */ = {isa = PBXBuildFile; fileRef = B7CD2395D35B43F051B77C481B834E88 /* GULNetworkInfo.h */; settings = {ATTRIBUTES = (Public, ); }; }; C7EF535EE3F46127DF86FA5C5848D5AD /* FIRLogger.h in Headers */ = {isa = PBXBuildFile; fileRef = 96E4CDCB9A7E9C3F5297CC9BB7685189 /* FIRLogger.h */; settings = {ATTRIBUTES = (Public, ); }; }; - C80E6A729D4A289850B7EFF27521998D /* GoogleSignIn-GoogleSignIn in Resources */ = {isa = PBXBuildFile; fileRef = E5BA41B7F2E1FE47F9ABCAC27C9E4281 /* GoogleSignIn-GoogleSignIn */; }; + C80E6A729D4A289850B7EFF27521998D /* GoogleSignIn.bundle in Resources */ = {isa = PBXBuildFile; fileRef = E5BA41B7F2E1FE47F9ABCAC27C9E4281 /* GoogleSignIn.bundle */; }; C8269B42DED12AB1F275648D0BD32E45 /* URLEncodedFormEncoder.swift in Sources */ = {isa = PBXBuildFile; fileRef = E90FCD9D565F018F83C973216B970E0B /* URLEncodedFormEncoder.swift */; }; C8976FBA6C401ACD821CC8008118D275 /* OIDIDToken.m in Sources */ = {isa = PBXBuildFile; fileRef = 5466A4E7831FD6178A5EB92C1944256E /* OIDIDToken.m */; }; C8EDA4A1835702F415A7E5720D2FE239 /* TMBarViewScrollHandler.swift in Sources */ = {isa = PBXBuildFile; fileRef = 944FD6BA4AA4BF8FD0AF48D5C4B6D5BC /* TMBarViewScrollHandler.swift */; }; @@ -1164,7 +1166,7 @@ D9D8EA266CD7C5885464952BC9B2678D /* ObjcBridgeable.swift in Sources */ = {isa = PBXBuildFile; fileRef = 0B1E2CE3A0A61199868FEBD70A707920 /* ObjcBridgeable.swift */; }; DA542ADC1E4023B95E37D468F6CD5AB7 /* FIRCLSLaunchMarkerModel.m in Sources */ = {isa = PBXBuildFile; fileRef = B97E74A7219204FD10912A58C38DBD76 /* FIRCLSLaunchMarkerModel.m */; }; DA97385ED3B4B56D6643BA7D32448F13 /* SystemConfiguration.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = 0E14CA7EC3C7D22157AEED953C6B3CFF /* SystemConfiguration.framework */; }; - DAF62FE91CBC43EBB75F089ED76161A4 /* FirebaseCore-FirebaseCore_Privacy in Resources */ = {isa = PBXBuildFile; fileRef = 8BB937B1C0DFFCF92F41861C2BC54DDA /* FirebaseCore-FirebaseCore_Privacy */; }; + DAF62FE91CBC43EBB75F089ED76161A4 /* FirebaseCore_Privacy.bundle in Resources */ = {isa = PBXBuildFile; fileRef = 8BB937B1C0DFFCF92F41861C2BC54DDA /* FirebaseCore_Privacy.bundle */; }; DAFC6CE6321395CF4523DD66DADBB9BA /* ImageDrawing.swift in Sources */ = {isa = PBXBuildFile; fileRef = 2B34B0D9AA47CA431C01960F7061B109 /* ImageDrawing.swift */; }; DB328782629B6B26E16D96883846D477 /* TMAnimation.swift in Sources */ = {isa = PBXBuildFile; fileRef = E2A2D80BD2C1B308C1628BBDB1408214 /* TMAnimation.swift */; }; DBA14A046AC7DBFCC64DB35E70311C62 /* ca.lproj in Resources */ = {isa = PBXBuildFile; fileRef = D8BF30B817BC0B516ED1CF603772B71D /* ca.lproj */; }; @@ -1252,7 +1254,7 @@ EBC2E9D61363A5A8823387F32016EDE6 /* AutoInsetSpec.swift in Sources */ = {isa = PBXBuildFile; fileRef = B402D10521A24C7E1DE7AACA4DEE646A /* AutoInsetSpec.swift */; }; EBDD7C160A59CECF9A1105CE9EAD1060 /* GIDEMMSupport.h in Headers */ = {isa = PBXBuildFile; fileRef = 705D12EEF3A3E8D31A70FBAEA3D600ED /* GIDEMMSupport.h */; settings = {ATTRIBUTES = (Project, ); }; }; EBE36AFF9964F232ABAEA6E260C5CF82 /* OIDServiceDiscovery.h in Headers */ = {isa = PBXBuildFile; fileRef = C5A36F41BC2057F3DD4A645A9C8DE1D3 /* OIDServiceDiscovery.h */; settings = {ATTRIBUTES = (Public, ); }; }; - EBF5412238AF0A9C462A5975F2F8A41F /* GoogleUtilities-GoogleUtilities_Privacy in Resources */ = {isa = PBXBuildFile; fileRef = 44E291D18340EAC3F761346198515323 /* GoogleUtilities-GoogleUtilities_Privacy */; }; + EBF5412238AF0A9C462A5975F2F8A41F /* GoogleUtilities_Privacy.bundle in Resources */ = {isa = PBXBuildFile; fileRef = 44E291D18340EAC3F761346198515323 /* GoogleUtilities_Privacy.bundle */; }; EC287910522F33C62736B04D28AAF4CF /* GULSceneDelegateSwizzler.m in Sources */ = {isa = PBXBuildFile; fileRef = 7B82C520EDA653D923DAF28B816F3B70 /* GULSceneDelegateSwizzler.m */; }; ECE6F23823454A8FDB3F97CE1A7CD182 /* RedirectHandler.swift in Sources */ = {isa = PBXBuildFile; fileRef = 9D159743BE32B6D26833FF6908F23A0A /* RedirectHandler.swift */; }; ECF2F956B37A4C28B228BC291A57AD6E /* RequestTaskMap.swift in Sources */ = {isa = PBXBuildFile; fileRef = 74DEDC24184332D362DBCA7999339C61 /* RequestTaskMap.swift */; }; @@ -2186,9 +2188,9 @@ 01B7A2F8A5334446383DEB2FD250072B /* GoogleDataTransport-Info.plist */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = text.plist.xml; path = "GoogleDataTransport-Info.plist"; sourceTree = ""; }; 01BAFB60B67CF55A805756C3113A5A36 /* GoogleUtilities.release.xcconfig */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = text.xcconfig; path = GoogleUtilities.release.xcconfig; sourceTree = ""; }; 01D1F094717875AEC2FB864E29834629 /* RLMRealm.h */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.h; name = RLMRealm.h; path = include/RLMRealm.h; sourceTree = ""; }; - 01E5F8A739F43E8F60F4D3C9CE783E8F /* hu.lproj */ = {isa = PBXFileReference; includeInIndex = 1; name = hu.lproj; path = GoogleSignIn/Sources/Strings/hu.lproj; sourceTree = ""; }; + 01E5F8A739F43E8F60F4D3C9CE783E8F /* hu.lproj */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = folder; name = hu.lproj; path = GoogleSignIn/Sources/Strings/hu.lproj; sourceTree = ""; }; 01F7B1D20B40B5B2FB55C8A53DEFA4E7 /* RLMArray.h */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.h; name = RLMArray.h; path = include/RLMArray.h; sourceTree = ""; }; - 022A671A33FE8EE006B738F5E83E925F /* RLMObjectBase.mm */ = {isa = PBXFileReference; includeInIndex = 1; name = RLMObjectBase.mm; path = Realm/RLMObjectBase.mm; sourceTree = ""; }; + 022A671A33FE8EE006B738F5E83E925F /* RLMObjectBase.mm */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.cpp.objcpp; name = RLMObjectBase.mm; path = Realm/RLMObjectBase.mm; sourceTree = ""; }; 0234FF47DD3E162C2D12A17DA94D7409 /* GTMAppAuth-umbrella.h */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.h; path = "GTMAppAuth-umbrella.h"; sourceTree = ""; }; 024C283944EC668D9943C7669CF77FC2 /* RLMSwiftObject.h */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.h; name = RLMSwiftObject.h; path = include/RLMSwiftObject.h; sourceTree = ""; }; 0254DB50E9CACFBF56E6EEF3A22004AA /* GDTCORUploadCoordinator.m */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.objc; name = GDTCORUploadCoordinator.m; path = GoogleDataTransport/GDTCORLibrary/GDTCORUploadCoordinator.m; sourceTree = ""; }; @@ -2210,13 +2212,13 @@ 05E62EDDABAEAAD357EFF9C9122FDE44 /* nanopb.release.xcconfig */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = text.xcconfig; path = nanopb.release.xcconfig; sourceTree = ""; }; 0607C5D0A015353481286E2913482CA9 /* GTMOAuth2KeychainCompatibility.m */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.objc; name = GTMOAuth2KeychainCompatibility.m; path = GTMAppAuth/Sources/GTMOAuth2KeychainCompatibility.m; sourceTree = ""; }; 061B01AD003ED9F85FE0F05960CD8EA5 /* Promise+Always.swift */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.swift; name = "Promise+Always.swift"; path = "Sources/Promises/Promise+Always.swift"; sourceTree = ""; }; - 067CED0F0662BBE6DC889AEC6DAB3049 /* PromisesSwift-Promises_Privacy */ = {isa = PBXFileReference; explicitFileType = wrapper.cfbundle; includeInIndex = 0; name = "PromisesSwift-Promises_Privacy"; path = Promises_Privacy.bundle; sourceTree = BUILT_PRODUCTS_DIR; }; + 067CED0F0662BBE6DC889AEC6DAB3049 /* Promises_Privacy.bundle */ = {isa = PBXFileReference; explicitFileType = wrapper.cfbundle; includeInIndex = 0; path = Promises_Privacy.bundle; sourceTree = BUILT_PRODUCTS_DIR; }; 0680CE868D96047B13EF06F4D6C25FD2 /* GDTCORTransport.m */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.objc; name = GDTCORTransport.m; path = GoogleDataTransport/GDTCORLibrary/GDTCORTransport.m; sourceTree = ""; }; 06AD1B51CFE2F4F836B59ED798911096 /* RLMPushClient.h */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.h; name = RLMPushClient.h; path = include/RLMPushClient.h; sourceTree = ""; }; 06D7300D926A53EAF48E4954471A0A9D /* GIDScopes.h */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.h; name = GIDScopes.h; path = GoogleSignIn/Sources/GIDScopes.h; sourceTree = ""; }; 06E23899B4D6E838A06A263F74FDA770 /* GoogleSignIn.debug.xcconfig */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = text.xcconfig; path = GoogleSignIn.debug.xcconfig; sourceTree = ""; }; 06E64ABE958C2688633DA7B2D4C2DD4F /* GTMKeychain.h */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.h; name = GTMKeychain.h; path = GTMAppAuth/Sources/Public/GTMAppAuth/GTMKeychain.h; sourceTree = ""; }; - 06FC5C9CF96D60C50FCD47D339C91951 /* nanopb */ = {isa = PBXFileReference; explicitFileType = wrapper.framework; includeInIndex = 0; name = nanopb; path = nanopb.framework; sourceTree = BUILT_PRODUCTS_DIR; }; + 06FC5C9CF96D60C50FCD47D339C91951 /* nanopb.framework */ = {isa = PBXFileReference; explicitFileType = wrapper.framework; includeInIndex = 0; path = nanopb.framework; sourceTree = BUILT_PRODUCTS_DIR; }; 073BE06E488ACA061C869831C0D9A52D /* RequestInterceptor.swift */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.swift; name = RequestInterceptor.swift; path = Source/RequestInterceptor.swift; sourceTree = ""; }; 07835FCE49B13ECBA587E83F3C8DBD00 /* SettingsDownloadClient.swift */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.swift; name = SettingsDownloadClient.swift; path = FirebaseSessions/Sources/Settings/SettingsDownloadClient.swift; sourceTree = ""; }; 078C282A96535F18233ACBC8E6FCB6D4 /* FIRInstallationsLogger.m */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.objc; name = FIRInstallationsLogger.m; path = FirebaseInstallations/Source/Library/FIRInstallationsLogger.m; sourceTree = ""; }; @@ -2225,13 +2227,13 @@ 08797F562CD10B07F16CD800648A4ABA /* TMBarLayout+None.swift */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.swift; name = "TMBarLayout+None.swift"; path = "Sources/Tabman/Bar/BarLayout/Types/TMBarLayout+None.swift"; sourceTree = ""; }; 08869D2B10A31434940E3446B8FA3680 /* FIRDependency.h */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.h; name = FIRDependency.h; path = FirebaseCore/Extension/FIRDependency.h; sourceTree = ""; }; 08907BB3C5A37F520557F2E06854900A /* GoogleSignInButtonBundleExtensions.swift */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.swift; name = GoogleSignInButtonBundleExtensions.swift; path = GoogleSignInSwift/Sources/GoogleSignInButtonBundleExtensions.swift; sourceTree = ""; }; - 08B7027AB26FF86B981B12A00DFC5C2C /* compliance.nanopb.c */ = {isa = PBXFileReference; includeInIndex = 1; name = compliance.nanopb.c; path = GoogleDataTransport/GDTCCTLibrary/Protogen/nanopb/compliance.nanopb.c; sourceTree = ""; }; - 08D9C684D11773B349CC2C6CE7871C8D /* GoogleAppMeasurementIdentitySupport.xcframework */ = {isa = PBXFileReference; includeInIndex = 1; name = GoogleAppMeasurementIdentitySupport.xcframework; path = Frameworks/GoogleAppMeasurementIdentitySupport.xcframework; sourceTree = ""; }; + 08B7027AB26FF86B981B12A00DFC5C2C /* compliance.nanopb.c */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.c; name = compliance.nanopb.c; path = GoogleDataTransport/GDTCCTLibrary/Protogen/nanopb/compliance.nanopb.c; sourceTree = ""; }; + 08D9C684D11773B349CC2C6CE7871C8D /* GoogleAppMeasurementIdentitySupport.xcframework */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = wrapper.xcframework; name = GoogleAppMeasurementIdentitySupport.xcframework; path = Frameworks/GoogleAppMeasurementIdentitySupport.xcframework; sourceTree = ""; }; 09061903FACDDF19A4D475B084DE6022 /* AFError.swift */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.swift; name = AFError.swift; path = Source/AFError.swift; sourceTree = ""; }; 09237C49DDA5A4EFF5B2B97B673F5F99 /* OIDExternalUserAgentCatalyst.h */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.h; name = OIDExternalUserAgentCatalyst.h; path = Source/AppAuth/iOS/OIDExternalUserAgentCatalyst.h; sourceTree = ""; }; 094F5FFCE1ADAC9A9DE6C4CA5AEDBA79 /* FIRCLSDataCollectionArbiter.h */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.h; name = FIRCLSDataCollectionArbiter.h; path = Crashlytics/Crashlytics/DataCollection/FIRCLSDataCollectionArbiter.h; sourceTree = ""; }; 09649B81835EDE68ECE84FE991410D2B /* IndexedObjectMap.swift */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.swift; name = IndexedObjectMap.swift; path = Sources/Pageboy/Utilities/IndexedObjectMap.swift; sourceTree = ""; }; - 096BC9A89EEF6950EC213614CC12BF33 /* RLMSyncManager.mm */ = {isa = PBXFileReference; includeInIndex = 1; name = RLMSyncManager.mm; path = Realm/RLMSyncManager.mm; sourceTree = ""; }; + 096BC9A89EEF6950EC213614CC12BF33 /* RLMSyncManager.mm */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.cpp.objcpp; name = RLMSyncManager.mm; path = Realm/RLMSyncManager.mm; sourceTree = ""; }; 097066F1431ACF1A489324FEA08FF5F4 /* FirebaseAnalytics.debug.xcconfig */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = text.xcconfig; path = FirebaseAnalytics.debug.xcconfig; sourceTree = ""; }; 09B23967EB8255EE4CA338A3F828CCB8 /* FIRAppInternal.h */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.h; name = FIRAppInternal.h; path = FirebaseCore/Extension/FIRAppInternal.h; sourceTree = ""; }; 0A1664971AAD2DB2971C5CC90F574241 /* GDTCORRegistrar.m */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.objc; name = GDTCORRegistrar.m; path = GoogleDataTransport/GDTCORLibrary/GDTCORRegistrar.m; sourceTree = ""; }; @@ -2269,7 +2271,7 @@ 10DB4AF153343A804EAA1A1D68D02A6A /* FIRComponentContainer.h */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.h; name = FIRComponentContainer.h; path = FirebaseCore/Extension/FIRComponentContainer.h; sourceTree = ""; }; 10E0F972A218718B7157F5A45A7AED43 /* FIRCLSRecordApplication.m */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.objc; name = FIRCLSRecordApplication.m; path = Crashlytics/Crashlytics/Models/Record/FIRCLSRecordApplication.m; sourceTree = ""; }; 10E7B4B1BCC30D5D55B1C4E93E8F797D /* Pods-pochakTests.release.xcconfig */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = text.xcconfig; path = "Pods-pochakTests.release.xcconfig"; sourceTree = ""; }; - 10F8CD4D38DFF11EB2E0F70AA6CA978D /* PrivacyInfo.xcprivacy */ = {isa = PBXFileReference; includeInIndex = 1; name = PrivacyInfo.xcprivacy; path = Crashlytics/Resources/PrivacyInfo.xcprivacy; sourceTree = ""; }; + 10F8CD4D38DFF11EB2E0F70AA6CA978D /* PrivacyInfo.xcprivacy */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = text.xml; name = PrivacyInfo.xcprivacy; path = Crashlytics/Resources/PrivacyInfo.xcprivacy; sourceTree = ""; }; 1159D216E5C5EA5D303CAC393120CD72 /* GDTCORTransformer.m */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.objc; name = GDTCORTransformer.m; path = GoogleDataTransport/GDTCORLibrary/GDTCORTransformer.m; sourceTree = ""; }; 116C91271A0571767F80F00E2CC8172E /* PageboyViewController+ScrollDetection.swift */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.swift; name = "PageboyViewController+ScrollDetection.swift"; path = "Sources/Pageboy/PageboyViewController+ScrollDetection.swift"; sourceTree = ""; }; 1194633003C12D171B4B270465A89792 /* Pods-pochak-pochakUITests-acknowledgements.plist */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = text.plist.xml; path = "Pods-pochak-pochakUITests-acknowledgements.plist"; sourceTree = ""; }; @@ -2279,15 +2281,15 @@ 12A4B9222DE07EE9634BB01AE41C2439 /* ObjectSchema.swift */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.swift; name = ObjectSchema.swift; path = RealmSwift/ObjectSchema.swift; sourceTree = ""; }; 12A920AF5222E0DBA258F0B62FB28765 /* GULSwizzler.h */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.h; name = GULSwizzler.h; path = GoogleUtilities/MethodSwizzler/Public/GoogleUtilities/GULSwizzler.h; sourceTree = ""; }; 12E70086A922D6AE59FE7B2CE4E98717 /* GULSecureCoding.m */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.objc; name = GULSecureCoding.m; path = GoogleUtilities/Environment/GULSecureCoding.m; sourceTree = ""; }; - 12F5BCA1449E8022D2F591AD3C060B7F /* cct.nanopb.c */ = {isa = PBXFileReference; includeInIndex = 1; name = cct.nanopb.c; path = GoogleDataTransport/GDTCCTLibrary/Protogen/nanopb/cct.nanopb.c; sourceTree = ""; }; + 12F5BCA1449E8022D2F591AD3C060B7F /* cct.nanopb.c */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.c; name = cct.nanopb.c; path = GoogleDataTransport/GDTCCTLibrary/Protogen/nanopb/cct.nanopb.c; sourceTree = ""; }; 1302984551E968006B2437D4B7CA0063 /* RLMAPIKeyAuth.h */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.h; name = RLMAPIKeyAuth.h; path = include/RLMAPIKeyAuth.h; sourceTree = ""; }; 1331F671621FB1203C2D8B0E48F60D15 /* GIDMDMPasscodeCache.h */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.h; name = GIDMDMPasscodeCache.h; path = GoogleSignIn/Sources/GIDMDMPasscodeCache.h; sourceTree = ""; }; 13818E233CDAB329D2B2B1B3DE04E764 /* SwiftUI.framework */ = {isa = PBXFileReference; lastKnownFileType = wrapper.framework; name = SwiftUI.framework; path = Platforms/iPhoneOS.platform/Developer/SDKs/iPhoneOS14.0.sdk/System/Library/Frameworks/SwiftUI.framework; sourceTree = DEVELOPER_DIR; }; - 13C8C8B254851998F9289F71229B28A2 /* FirebaseInstallations */ = {isa = PBXFileReference; explicitFileType = wrapper.framework; includeInIndex = 0; name = FirebaseInstallations; path = FirebaseInstallations.framework; sourceTree = BUILT_PRODUCTS_DIR; }; + 13C8C8B254851998F9289F71229B28A2 /* FirebaseInstallations.framework */ = {isa = PBXFileReference; explicitFileType = wrapper.framework; includeInIndex = 0; path = FirebaseInstallations.framework; sourceTree = BUILT_PRODUCTS_DIR; }; 13F1FC8E2BF5F48AA504E3BE7A56A076 /* FirebaseCore.debug.xcconfig */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = text.xcconfig; path = FirebaseCore.debug.xcconfig; sourceTree = ""; }; 14521998A6D415CDB1B78AAE484BDF5C /* FIRInstallationsStoredItem.h */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.h; name = FIRInstallationsStoredItem.h; path = FirebaseInstallations/Source/Library/InstallationsStore/FIRInstallationsStoredItem.h; sourceTree = ""; }; 14727C3DA07EBE193998CBD7963AD2D8 /* FIRCLSContextManager.h */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.h; name = FIRCLSContextManager.h; path = Crashlytics/Crashlytics/Controllers/FIRCLSContextManager.h; sourceTree = ""; }; - 148D0F9E8C7373FEAF40D800FC5F1BAA /* FirebaseCoreInternal */ = {isa = PBXFileReference; explicitFileType = wrapper.framework; includeInIndex = 0; name = FirebaseCoreInternal; path = FirebaseCoreInternal.framework; sourceTree = BUILT_PRODUCTS_DIR; }; + 148D0F9E8C7373FEAF40D800FC5F1BAA /* FirebaseCoreInternal.framework */ = {isa = PBXFileReference; explicitFileType = wrapper.framework; includeInIndex = 0; path = FirebaseCoreInternal.framework; sourceTree = BUILT_PRODUCTS_DIR; }; 148F27CC05C05F5F9CE0F90A769C32E7 /* FBLPromise+Await.m */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.objc; name = "FBLPromise+Await.m"; path = "Sources/FBLPromises/FBLPromise+Await.m"; sourceTree = ""; }; 14A8200E30ED0DE71DD88F48E47D0631 /* FIRCLSMultipartMimeStreamEncoder.h */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.h; name = FIRCLSMultipartMimeStreamEncoder.h; path = Crashlytics/Shared/FIRCLSNetworking/FIRCLSMultipartMimeStreamEncoder.h; sourceTree = ""; }; 14DD17B0A7480E724B68C9120EC4750A /* FIRCLSMachOBinary.h */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.h; name = FIRCLSMachOBinary.h; path = Crashlytics/Shared/FIRCLSMachO/FIRCLSMachOBinary.h; sourceTree = ""; }; @@ -2298,7 +2300,7 @@ 1592206A7C7D917D99AB950AECBFFD1A /* RLMProperty_Private.h */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.h; name = RLMProperty_Private.h; path = include/RLMProperty_Private.h; sourceTree = ""; }; 15AC166C28A7B14169B505C839E4EDF6 /* Pods-pochak-pochakUITests-frameworks.sh */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = text.script.sh; path = "Pods-pochak-pochakUITests-frameworks.sh"; sourceTree = ""; }; 15B8F93BFA1F4A3C9465CDAF11A99219 /* FIRCLSMachO.m */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.objc; name = FIRCLSMachO.m; path = Crashlytics/Shared/FIRCLSMachO/FIRCLSMachO.m; sourceTree = ""; }; - 15C10AE5B39BECBC0091D2010FF4A757 /* RLMScheduler.mm */ = {isa = PBXFileReference; includeInIndex = 1; name = RLMScheduler.mm; path = Realm/RLMScheduler.mm; sourceTree = ""; }; + 15C10AE5B39BECBC0091D2010FF4A757 /* RLMScheduler.mm */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.cpp.objcpp; name = RLMScheduler.mm; path = Realm/RLMScheduler.mm; sourceTree = ""; }; 15FE751B600B620ABF0C8EBF86F4D358 /* ViewTitleViewContainer.swift */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.swift; name = ViewTitleViewContainer.swift; path = Sources/Tabman/Bar/Generic/ViewTitleViewContainer.swift; sourceTree = ""; }; 16184AF5AC3837516BF9D78A20DFE296 /* FirebaseCoreExtension-prefix.pch */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.h; path = "FirebaseCoreExtension-prefix.pch"; sourceTree = ""; }; 162FC42235BF7AE36981CF5EE9ABFE35 /* GTMSessionFetcher.modulemap */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.module; path = GTMSessionFetcher.modulemap; sourceTree = ""; }; @@ -2306,18 +2308,18 @@ 165C90420511686B3C0CF9E8DC858C63 /* EncodedRolloutAssignment.swift */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.swift; name = EncodedRolloutAssignment.swift; path = Crashlytics/Crashlytics/Rollouts/EncodedRolloutAssignment.swift; sourceTree = ""; }; 1697EED1164E94E71C4D90739E02AD54 /* InsetExecutor.swift */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.swift; name = InsetExecutor.swift; path = Sources/Tabman/AutoInsetter/InsetExecutor/InsetExecutor.swift; sourceTree = ""; }; 16CD40F705DBADBF01AD4980E6EACD4D /* GDTCORDirectorySizeTracker.h */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.h; name = GDTCORDirectorySizeTracker.h; path = GoogleDataTransport/GDTCORLibrary/Internal/GDTCORDirectorySizeTracker.h; sourceTree = ""; }; - 1756D31F9BE383F42549BF92792E2199 /* pb_encode.c */ = {isa = PBXFileReference; includeInIndex = 1; path = pb_encode.c; sourceTree = ""; }; + 1756D31F9BE383F42549BF92792E2199 /* pb_encode.c */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.c; path = pb_encode.c; sourceTree = ""; }; 1773970A093519EA394FE0033C71CC6E /* FBLPromiseError.m */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.objc; name = FBLPromiseError.m; path = Sources/FBLPromises/FBLPromiseError.m; sourceTree = ""; }; 177A0B5FD9A061F27E40B68CE4BED594 /* GoogleSignIn.modulemap */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.module; path = GoogleSignIn.modulemap; sourceTree = ""; }; 17A668834BAA47D8E7C27AE40F396F9B /* EventGDTLogger.swift */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.swift; name = EventGDTLogger.swift; path = FirebaseSessions/Sources/EventGDTLogger.swift; sourceTree = ""; }; 17D15EB0E4D70EA0D09CABF619874F21 /* RLMConstants.h */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.h; name = RLMConstants.h; path = include/RLMConstants.h; sourceTree = ""; }; 17F6FD405E68ABB18BE82C1E55A1649B /* FirebaseAnalytics.release.xcconfig */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = text.xcconfig; path = FirebaseAnalytics.release.xcconfig; sourceTree = ""; }; 1837A046F426D712A98FE7CEEEC8CAA7 /* FirebaseRemoteConfigInterop-umbrella.h */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.h; path = "FirebaseRemoteConfigInterop-umbrella.h"; sourceTree = ""; }; - 1843DA727E84A355B6094A73624FD46A /* RLMMongoClient.mm */ = {isa = PBXFileReference; includeInIndex = 1; name = RLMMongoClient.mm; path = Realm/RLMMongoClient.mm; sourceTree = ""; }; + 1843DA727E84A355B6094A73624FD46A /* RLMMongoClient.mm */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.cpp.objcpp; name = RLMMongoClient.mm; path = Realm/RLMMongoClient.mm; sourceTree = ""; }; 18DB9E2E8AFCBAD7D5165C2F8E84011C /* RLMNetworkTransport.h */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.h; name = RLMNetworkTransport.h; path = include/RLMNetworkTransport.h; sourceTree = ""; }; 18DCC6F911698B89D12C5F5889A705DC /* FirebaseCoreExtension.modulemap */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.module; path = FirebaseCoreExtension.modulemap; sourceTree = ""; }; 19075B8D4183BB301BF66758AD59D306 /* FIRComponentContainer.h */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.h; name = FIRComponentContainer.h; path = FirebaseCore/Extension/FIRComponentContainer.h; sourceTree = ""; }; - 19EA1CE114BA545AFD06EC58CFE8DD06 /* RLMObjectId.mm */ = {isa = PBXFileReference; includeInIndex = 1; name = RLMObjectId.mm; path = Realm/RLMObjectId.mm; sourceTree = ""; }; + 19EA1CE114BA545AFD06EC58CFE8DD06 /* RLMObjectId.mm */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.cpp.objcpp; name = RLMObjectId.mm; path = Realm/RLMObjectId.mm; sourceTree = ""; }; 19F411E9DD55DFB9CCC8703D4287074F /* Alamofire.debug.xcconfig */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = text.xcconfig; path = Alamofire.debug.xcconfig; sourceTree = ""; }; 1A81F77BBB12DD6D10A98A5130B2CBB4 /* FIRCLSRecordApplication.h */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.h; name = FIRCLSRecordApplication.h; path = Crashlytics/Crashlytics/Models/Record/FIRCLSRecordApplication.h; sourceTree = ""; }; 1AA6F616B94ED94876C80204CF0F43D6 /* FIRCLSProcessReportOperation.h */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.h; name = FIRCLSProcessReportOperation.h; path = Crashlytics/Crashlytics/Operations/Reports/FIRCLSProcessReportOperation.h; sourceTree = ""; }; @@ -2336,8 +2338,8 @@ 1D806DEB23D8918ECBA2B4CEC1D09C0D /* FIRCLSMachO.h */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.h; name = FIRCLSMachO.h; path = Crashlytics/Shared/FIRCLSMachO/FIRCLSMachO.h; sourceTree = ""; }; 1E06A7CD25DE1EAF6F92869178BC53F4 /* FIRInstallationsBackoffController.h */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.h; name = FIRInstallationsBackoffController.h; path = FirebaseInstallations/Source/Library/InstallationsIDController/FIRInstallationsBackoffController.h; sourceTree = ""; }; 1E298DB7211B2904E258EAEC6BCB5ACA /* TMBarLayout.swift */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.swift; name = TMBarLayout.swift; path = Sources/Tabman/Bar/BarLayout/TMBarLayout.swift; sourceTree = ""; }; - 1E3848F684E7AF002FF0E12BD3CF5FC4 /* fi.lproj */ = {isa = PBXFileReference; includeInIndex = 1; name = fi.lproj; path = GoogleSignIn/Sources/Strings/fi.lproj; sourceTree = ""; }; - 1E717B25C17AA9949DEC511AEC2E4F92 /* pb_common.c */ = {isa = PBXFileReference; includeInIndex = 1; path = pb_common.c; sourceTree = ""; }; + 1E3848F684E7AF002FF0E12BD3CF5FC4 /* fi.lproj */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = folder; name = fi.lproj; path = GoogleSignIn/Sources/Strings/fi.lproj; sourceTree = ""; }; + 1E717B25C17AA9949DEC511AEC2E4F92 /* pb_common.c */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.c; path = pb_common.c; sourceTree = ""; }; 1E80D720B4DA8CFA3225BF6D83BA2401 /* Pods-pochak-pochakUITests.modulemap */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.module; path = "Pods-pochak-pochakUITests.modulemap"; sourceTree = ""; }; 1E905EE97518CD59DCEF1143CEBE8E9C /* GIFAnimatedImage.swift */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.swift; name = GIFAnimatedImage.swift; path = Sources/Image/GIFAnimatedImage.swift; sourceTree = ""; }; 1E9F5E50A982CC57A29BD97A01AAA18F /* FIRLogger.h */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.h; name = FIRLogger.h; path = FirebaseCore/Extension/FIRLogger.h; sourceTree = ""; }; @@ -2352,7 +2354,7 @@ 1FDC097A868DE6DED166EFA19B6D6628 /* SessionDataTask.swift */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.swift; name = SessionDataTask.swift; path = Sources/Networking/SessionDataTask.swift; sourceTree = ""; }; 203F138EB681ADD1486F131B4981E440 /* FIRAnalyticsInterop.h */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.h; name = FIRAnalyticsInterop.h; path = Interop/Analytics/Public/FIRAnalyticsInterop.h; sourceTree = ""; }; 2050FD9C230A69AFB6114DBC6EF9BDE3 /* Promise+All.swift */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.swift; name = "Promise+All.swift"; path = "Sources/Promises/Promise+All.swift"; sourceTree = ""; }; - 206F6D0A0552B8E0B89B26CE427D69AB /* pt_BR.lproj */ = {isa = PBXFileReference; includeInIndex = 1; name = pt_BR.lproj; path = GoogleSignIn/Sources/Strings/pt_BR.lproj; sourceTree = ""; }; + 206F6D0A0552B8E0B89B26CE427D69AB /* pt_BR.lproj */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = folder; name = pt_BR.lproj; path = GoogleSignIn/Sources/Strings/pt_BR.lproj; sourceTree = ""; }; 209C361E44E08376408BF1189E9A8C5C /* GTMSessionFetcher-dummy.m */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.objc; path = "GTMSessionFetcher-dummy.m"; sourceTree = ""; }; 20BB44DEAA667C4AEED0389887EDCF67 /* OIDRegistrationResponse.h */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.h; name = OIDRegistrationResponse.h; path = Source/AppAuthCore/OIDRegistrationResponse.h; sourceTree = ""; }; 20F8C2CB92D9E518C022668777DAC6EE /* Alamofire-Info.plist */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = text.plist.xml; path = "Alamofire-Info.plist"; sourceTree = ""; }; @@ -2366,32 +2368,32 @@ 22BBC7C2ED467F9AC0F071426AF91F86 /* FIRInstallationsAuthTokenResult.h */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.h; name = FIRInstallationsAuthTokenResult.h; path = FirebaseInstallations/Source/Library/Public/FirebaseInstallations/FIRInstallationsAuthTokenResult.h; sourceTree = ""; }; 22D88F0F61300413315F14440060FF82 /* GDTCCTUploader.m */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.objc; name = GDTCCTUploader.m; path = GoogleDataTransport/GDTCCTLibrary/GDTCCTUploader.m; sourceTree = ""; }; 232449ADB92A0379567FD8538F7597F6 /* Promise+Then.swift */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.swift; name = "Promise+Then.swift"; path = "Sources/Promises/Promise+Then.swift"; sourceTree = ""; }; - 235ABE2C2109C00CE32C98AAE5A6B90C /* RLMAPIKeyAuth.mm */ = {isa = PBXFileReference; includeInIndex = 1; name = RLMAPIKeyAuth.mm; path = Realm/RLMAPIKeyAuth.mm; sourceTree = ""; }; + 235ABE2C2109C00CE32C98AAE5A6B90C /* RLMAPIKeyAuth.mm */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.cpp.objcpp; name = RLMAPIKeyAuth.mm; path = Realm/RLMAPIKeyAuth.mm; sourceTree = ""; }; 2366734784F6319E4F1999A005C0F4FF /* FBLPromise+Validate.m */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.objc; name = "FBLPromise+Validate.m"; path = "Sources/FBLPromises/FBLPromise+Validate.m"; sourceTree = ""; }; 23D16C7F0854CC72C493F968B5718347 /* FIRInstallationsIIDTokenStore.m */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.objc; name = FIRInstallationsIIDTokenStore.m; path = FirebaseInstallations/Source/Library/IIDMigration/FIRInstallationsIIDTokenStore.m; sourceTree = ""; }; - 23D5CD291D18F2187712FE6F84B6F1C6 /* Pageboy */ = {isa = PBXFileReference; explicitFileType = wrapper.framework; includeInIndex = 0; name = Pageboy; path = Pageboy.framework; sourceTree = BUILT_PRODUCTS_DIR; }; + 23D5CD291D18F2187712FE6F84B6F1C6 /* Pageboy.framework */ = {isa = PBXFileReference; explicitFileType = wrapper.framework; includeInIndex = 0; path = Pageboy.framework; sourceTree = BUILT_PRODUCTS_DIR; }; 23E7711D6B4B146DABA29507BD78994A /* FBLPromise+Async.m */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.objc; name = "FBLPromise+Async.m"; path = "Sources/FBLPromises/FBLPromise+Async.m"; sourceTree = ""; }; - 240741DCCF1800704ED77E61035A6021 /* crashlytics.nanopb.c */ = {isa = PBXFileReference; includeInIndex = 1; name = crashlytics.nanopb.c; path = Crashlytics/Protogen/nanopb/crashlytics.nanopb.c; sourceTree = ""; }; - 24623709A4C70B7D7A656CF29DB46E54 /* el.lproj */ = {isa = PBXFileReference; includeInIndex = 1; name = el.lproj; path = GoogleSignIn/Sources/Strings/el.lproj; sourceTree = ""; }; + 240741DCCF1800704ED77E61035A6021 /* crashlytics.nanopb.c */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.c; name = crashlytics.nanopb.c; path = Crashlytics/Protogen/nanopb/crashlytics.nanopb.c; sourceTree = ""; }; + 24623709A4C70B7D7A656CF29DB46E54 /* el.lproj */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = folder; name = el.lproj; path = GoogleSignIn/Sources/Strings/el.lproj; sourceTree = ""; }; 2462C8476CB26DED3279130101663CA5 /* RLMSyncSubscription_Private.h */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.h; name = RLMSyncSubscription_Private.h; path = include/RLMSyncSubscription_Private.h; sourceTree = ""; }; 24D50959F678EBBEE7285ABB03B128C4 /* GDTCORAssert.h */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.h; name = GDTCORAssert.h; path = GoogleDataTransport/GDTCORLibrary/Internal/GDTCORAssert.h; sourceTree = ""; }; - 24EDF2DD8B51E7073D5CB5530AEA6143 /* RLMMigration.mm */ = {isa = PBXFileReference; includeInIndex = 1; name = RLMMigration.mm; path = Realm/RLMMigration.mm; sourceTree = ""; }; + 24EDF2DD8B51E7073D5CB5530AEA6143 /* RLMMigration.mm */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.cpp.objcpp; name = RLMMigration.mm; path = Realm/RLMMigration.mm; sourceTree = ""; }; 24F8EE89674F37DFFAECDF059F45EAB2 /* FIRComponentType.h */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.h; name = FIRComponentType.h; path = FirebaseCore/Extension/FIRComponentType.h; sourceTree = ""; }; 250270376B0C3A898C5CB03EFC895F9D /* FIRCLSManagerData.h */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.h; name = FIRCLSManagerData.h; path = Crashlytics/Crashlytics/Controllers/FIRCLSManagerData.h; sourceTree = ""; }; 25403AF4206BBB6DB0F0953B1975624C /* Sync.swift */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.swift; name = Sync.swift; path = RealmSwift/Sync.swift; sourceTree = ""; }; 25D1246F5EAEBF5D5B029A4D3FF37085 /* GIDSignInResult.m */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.objc; name = GIDSignInResult.m; path = GoogleSignIn/Sources/GIDSignInResult.m; sourceTree = ""; }; - 262A73415B6FC8DC98400A585E4273D9 /* RLMRealm.mm */ = {isa = PBXFileReference; includeInIndex = 1; name = RLMRealm.mm; path = Realm/RLMRealm.mm; sourceTree = ""; }; + 262A73415B6FC8DC98400A585E4273D9 /* RLMRealm.mm */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.cpp.objcpp; name = RLMRealm.mm; path = Realm/RLMRealm.mm; sourceTree = ""; }; 264AFE7E97F879517292474B0C55D2D8 /* OIDExternalUserAgent.h */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.h; name = OIDExternalUserAgent.h; path = Source/AppAuthCore/OIDExternalUserAgent.h; sourceTree = ""; }; 2650566C7F0B2D405DE44789F64E55E5 /* GTMAppAuth.debug.xcconfig */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = text.xcconfig; path = GTMAppAuth.debug.xcconfig; sourceTree = ""; }; 2673337977D17A6C72D3DDA880075B47 /* HeartbeatLoggingTestUtils.swift */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.swift; name = HeartbeatLoggingTestUtils.swift; path = FirebaseCore/Internal/Sources/HeartbeatLogging/HeartbeatLoggingTestUtils.swift; sourceTree = ""; }; 26D39FF3AB4F0CF31A77FFB49B26839F /* MemoryStorage.swift */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.swift; name = MemoryStorage.swift; path = Sources/Cache/MemoryStorage.swift; sourceTree = ""; }; - 26DBDB2C6650CBE05C1D8FDF16D9D296 /* RLMUpdateChecker.mm */ = {isa = PBXFileReference; includeInIndex = 1; name = RLMUpdateChecker.mm; path = Realm/RLMUpdateChecker.mm; sourceTree = ""; }; + 26DBDB2C6650CBE05C1D8FDF16D9D296 /* RLMUpdateChecker.mm */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.cpp.objcpp; name = RLMUpdateChecker.mm; path = Realm/RLMUpdateChecker.mm; sourceTree = ""; }; 26EF7293289D767A0828988998EBF912 /* FIRCLSExecutionIdentifierModel.m */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.objc; name = FIRCLSExecutionIdentifierModel.m; path = Crashlytics/Crashlytics/Models/FIRCLSExecutionIdentifierModel.m; sourceTree = ""; }; 270A7B92B8D2ABFEB97979FCE8412FD5 /* FIRCrashlyticsReport.m */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.objc; name = FIRCrashlyticsReport.m; path = Crashlytics/Crashlytics/FIRCrashlyticsReport.m; sourceTree = ""; }; 272235B21C4A3D98EF6ABED4ACE22D5A /* GTMAppAuth-Info.plist */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = text.plist.xml; path = "GTMAppAuth-Info.plist"; sourceTree = ""; }; 2791E3C35958917F39139F6559794081 /* FIRCLSUserLogging.h */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.h; name = FIRCLSUserLogging.h; path = Crashlytics/Crashlytics/Components/FIRCLSUserLogging.h; sourceTree = ""; }; 27F698F92D422E009FC442698148BE4F /* FirebaseSessions-dummy.m */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.objc; path = "FirebaseSessions-dummy.m"; sourceTree = ""; }; - 2888A8B668FF600923F20B3BA6DCE82E /* id.lproj */ = {isa = PBXFileReference; includeInIndex = 1; name = id.lproj; path = GoogleSignIn/Sources/Strings/id.lproj; sourceTree = ""; }; + 2888A8B668FF600923F20B3BA6DCE82E /* id.lproj */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = folder; name = id.lproj; path = GoogleSignIn/Sources/Strings/id.lproj; sourceTree = ""; }; 28D09DF529B1120B77312943CAEF6C3A /* FIRCLSCallStackTree.m */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.objc; name = FIRCLSCallStackTree.m; path = Crashlytics/Crashlytics/Helpers/FIRCLSCallStackTree.m; sourceTree = ""; }; 28FDBF0812AF6A8242DB927A77B75285 /* NSError+RLMSync.m */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.objc; name = "NSError+RLMSync.m"; path = "Realm/NSError+RLMSync.m"; sourceTree = ""; }; 292B9A6E776E43546D011170524B9F77 /* TMBarIndicator.swift */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.swift; name = TMBarIndicator.swift; path = Sources/Tabman/Bar/BarIndicator/TMBarIndicator.swift; sourceTree = ""; }; @@ -2415,8 +2417,8 @@ 2D93AAB086C28FD64DFAD7B3629E3C6F /* RealmConfiguration.swift */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.swift; name = RealmConfiguration.swift; path = RealmSwift/RealmConfiguration.swift; sourceTree = ""; }; 2D966A99103A88039BB54D0D51CE6821 /* FIRCLSLogger.h */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.h; name = FIRCLSLogger.h; path = Crashlytics/Crashlytics/Helpers/FIRCLSLogger.h; sourceTree = ""; }; 2DB19B0D616443654A17EA9E8F8BF27E /* GTMAppAuthFetcherAuthorization.m */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.objc; name = GTMAppAuthFetcherAuthorization.m; path = GTMAppAuth/Sources/GTMAppAuthFetcherAuthorization.m; sourceTree = ""; }; - 2DCB4DBCA1BBF29F4BDA7B2B0A18E870 /* fr.lproj */ = {isa = PBXFileReference; includeInIndex = 1; name = fr.lproj; path = GoogleSignIn/Sources/Strings/fr.lproj; sourceTree = ""; }; - 2DDFBBEADD6F0D4B56B7A44E6F90D0D8 /* RLMBSON.mm */ = {isa = PBXFileReference; includeInIndex = 1; name = RLMBSON.mm; path = Realm/RLMBSON.mm; sourceTree = ""; }; + 2DCB4DBCA1BBF29F4BDA7B2B0A18E870 /* fr.lproj */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = folder; name = fr.lproj; path = GoogleSignIn/Sources/Strings/fr.lproj; sourceTree = ""; }; + 2DDFBBEADD6F0D4B56B7A44E6F90D0D8 /* RLMBSON.mm */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.cpp.objcpp; name = RLMBSON.mm; path = Realm/RLMBSON.mm; sourceTree = ""; }; 2DF09BE4562948F2B72CA740F8787054 /* pb_decode.h */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.h; path = pb_decode.h; sourceTree = ""; }; 2E02701BAE21E3A6369C9A272879C022 /* CallbackQueue.swift */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.swift; name = CallbackQueue.swift; path = Sources/Utility/CallbackQueue.swift; sourceTree = ""; }; 2E1461B1576A6FC09D59DAC5B242C342 /* KFImageOptions.swift */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.swift; name = KFImageOptions.swift; path = Sources/SwiftUI/KFImageOptions.swift; sourceTree = ""; }; @@ -2442,14 +2444,14 @@ 3152C78D564D06E61195B33B9E5DFA35 /* FIRInstallationsStatus.h */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.h; name = FIRInstallationsStatus.h; path = FirebaseInstallations/Source/Library/InstallationsIDController/FIRInstallationsStatus.h; sourceTree = ""; }; 31A2773AF44EACAE9FEA83B9ECC975CD /* GoogleDataTransport.h */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.h; name = GoogleDataTransport.h; path = GoogleDataTransport/GDTCORLibrary/Public/GoogleDataTransport/GoogleDataTransport.h; sourceTree = ""; }; 321BAEDE7E5C4F52C2CD49119828D73E /* ResourceBundle-FirebaseCore_Privacy-FirebaseCore-Info.plist */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = text.plist.xml; path = "ResourceBundle-FirebaseCore_Privacy-FirebaseCore-Info.plist"; sourceTree = ""; }; - 3227F3FC45681D7CEE5D1355A532398A /* nanopb-nanopb_Privacy */ = {isa = PBXFileReference; explicitFileType = wrapper.cfbundle; includeInIndex = 0; name = "nanopb-nanopb_Privacy"; path = nanopb_Privacy.bundle; sourceTree = BUILT_PRODUCTS_DIR; }; - 3242DA2CF40FDE685E91EEDFFD784031 /* client_metrics.nanopb.c */ = {isa = PBXFileReference; includeInIndex = 1; name = client_metrics.nanopb.c; path = GoogleDataTransport/GDTCCTLibrary/Protogen/nanopb/client_metrics.nanopb.c; sourceTree = ""; }; + 3227F3FC45681D7CEE5D1355A532398A /* nanopb_Privacy.bundle */ = {isa = PBXFileReference; explicitFileType = wrapper.cfbundle; includeInIndex = 0; path = nanopb_Privacy.bundle; sourceTree = BUILT_PRODUCTS_DIR; }; + 3242DA2CF40FDE685E91EEDFFD784031 /* client_metrics.nanopb.c */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.c; name = client_metrics.nanopb.c; path = GoogleDataTransport/GDTCCTLibrary/Protogen/nanopb/client_metrics.nanopb.c; sourceTree = ""; }; 3268E589D98020CF7F5694DFD31D0D69 /* ResourceBundle-FirebaseInstallations_Privacy-FirebaseInstallations-Info.plist */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = text.plist.xml; path = "ResourceBundle-FirebaseInstallations_Privacy-FirebaseInstallations-Info.plist"; sourceTree = ""; }; 32C6BAD5574CFB60764E764FF2C627D1 /* FIRCLSRolloutsPersistenceManager.h */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.h; name = FIRCLSRolloutsPersistenceManager.h; path = Crashlytics/Crashlytics/Controllers/FIRCLSRolloutsPersistenceManager.h; sourceTree = ""; }; 32D31D303B0B28082ADA9B72B12DF0E4 /* GTMSessionFetcherService+Internal.h */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.h; name = "GTMSessionFetcherService+Internal.h"; path = "Sources/Core/GTMSessionFetcherService+Internal.h"; sourceTree = ""; }; 32D540CB70BAE226160D0409331633C3 /* Alamofire-dummy.m */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.objc; path = "Alamofire-dummy.m"; sourceTree = ""; }; 32DCE94F342E91379A4718506666ED20 /* FIRInstallations.m */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.objc; name = FIRInstallations.m; path = FirebaseInstallations/Source/Library/FIRInstallations.m; sourceTree = ""; }; - 3347A1AB6546F0A3977529B8F199DC41 /* PromisesObjC */ = {isa = PBXFileReference; explicitFileType = wrapper.framework; includeInIndex = 0; name = PromisesObjC; path = FBLPromises.framework; sourceTree = BUILT_PRODUCTS_DIR; }; + 3347A1AB6546F0A3977529B8F199DC41 /* FBLPromises.framework */ = {isa = PBXFileReference; explicitFileType = wrapper.framework; includeInIndex = 0; path = FBLPromises.framework; sourceTree = BUILT_PRODUCTS_DIR; }; 3360ACFD672B668488DC206438F5DEA0 /* Tabman.release.xcconfig */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = text.xcconfig; path = Tabman.release.xcconfig; sourceTree = ""; }; 337E50EFAA560D1D065458CC226AAA4E /* GTMSessionFetcherLogging.m */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.objc; name = GTMSessionFetcherLogging.m; path = Sources/Core/GTMSessionFetcherLogging.m; sourceTree = ""; }; 3388F57BC2D0AD29FDE3276A85CDB843 /* FBLPromise+All.h */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.h; name = "FBLPromise+All.h"; path = "Sources/FBLPromises/include/FBLPromise+All.h"; sourceTree = ""; }; @@ -2471,16 +2473,16 @@ 35EDC5CCBB6A06E251013CDF74F6BE17 /* UIKit.framework */ = {isa = PBXFileReference; lastKnownFileType = wrapper.framework; name = UIKit.framework; path = Platforms/iPhoneOS.platform/Developer/SDKs/iPhoneOS14.0.sdk/System/Library/Frameworks/UIKit.framework; sourceTree = DEVELOPER_DIR; }; 3605DF0EFD2C61381F80DFB10B2FFD8D /* FIRCLSFABAsyncOperation_Private.h */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.h; name = FIRCLSFABAsyncOperation_Private.h; path = Crashlytics/Shared/FIRCLSOperation/FIRCLSFABAsyncOperation_Private.h; sourceTree = ""; }; 365A4BDDDF525FAF4658715CA736B589 /* GTMSessionFetcher.h */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.h; name = GTMSessionFetcher.h; path = Sources/Core/Public/GTMSessionFetcher/GTMSessionFetcher.h; sourceTree = ""; }; - 369BAE75489C6730CCD6AEBFF524011D /* RLMUpdateResult.mm */ = {isa = PBXFileReference; includeInIndex = 1; name = RLMUpdateResult.mm; path = Realm/RLMUpdateResult.mm; sourceTree = ""; }; - 3762BC52214D2EB260BA988D44523C75 /* RLMFindOptions.mm */ = {isa = PBXFileReference; includeInIndex = 1; name = RLMFindOptions.mm; path = Realm/RLMFindOptions.mm; sourceTree = ""; }; - 379E5319BC6B4AE5613DFF7EEEAA6905 /* PromisesSwift */ = {isa = PBXFileReference; explicitFileType = wrapper.framework; includeInIndex = 0; name = PromisesSwift; path = Promises.framework; sourceTree = BUILT_PRODUCTS_DIR; }; + 369BAE75489C6730CCD6AEBFF524011D /* RLMUpdateResult.mm */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.cpp.objcpp; name = RLMUpdateResult.mm; path = Realm/RLMUpdateResult.mm; sourceTree = ""; }; + 3762BC52214D2EB260BA988D44523C75 /* RLMFindOptions.mm */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.cpp.objcpp; name = RLMFindOptions.mm; path = Realm/RLMFindOptions.mm; sourceTree = ""; }; + 379E5319BC6B4AE5613DFF7EEEAA6905 /* Promises.framework */ = {isa = PBXFileReference; explicitFileType = wrapper.framework; includeInIndex = 0; path = Promises.framework; sourceTree = BUILT_PRODUCTS_DIR; }; 37A76017BB894BC1226C9C8AAD4303AA /* FBLPromise+Await.h */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.h; name = "FBLPromise+Await.h"; path = "Sources/FBLPromises/include/FBLPromise+Await.h"; sourceTree = ""; }; 38582E56768CBD7D43795BBB0E38B8DD /* TMBarLayoutParent.swift */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.swift; name = TMBarLayoutParent.swift; path = Sources/Tabman/Bar/BarLayout/TMBarLayoutParent.swift; sourceTree = ""; }; 3873C69CB70A21E5CD8558FEB6A12131 /* GULKeychainUtils.m */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.objc; name = GULKeychainUtils.m; path = GoogleUtilities/Environment/SecureStorage/GULKeychainUtils.m; sourceTree = ""; }; 38E7ED530B263901FF880C42CE2DCBB3 /* HeartbeatStorage.swift */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.swift; name = HeartbeatStorage.swift; path = FirebaseCore/Internal/Sources/HeartbeatLogging/HeartbeatStorage.swift; sourceTree = ""; }; - 38E8D12C73DD142B9E8B4C7B4A2F07E6 /* RLMSyncUtil.mm */ = {isa = PBXFileReference; includeInIndex = 1; name = RLMSyncUtil.mm; path = Realm/RLMSyncUtil.mm; sourceTree = ""; }; + 38E8D12C73DD142B9E8B4C7B4A2F07E6 /* RLMSyncUtil.mm */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.cpp.objcpp; name = RLMSyncUtil.mm; path = Realm/RLMSyncUtil.mm; sourceTree = ""; }; 39434C7E0F224DDC5DFD3FAA904405C8 /* RLMObjectBase_Dynamic.h */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.h; name = RLMObjectBase_Dynamic.h; path = include/RLMObjectBase_Dynamic.h; sourceTree = ""; }; - 39532E8F50825FDA0F623885D2A8C28C /* sv.lproj */ = {isa = PBXFileReference; includeInIndex = 1; name = sv.lproj; path = GoogleSignIn/Sources/Strings/sv.lproj; sourceTree = ""; }; + 39532E8F50825FDA0F623885D2A8C28C /* sv.lproj */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = folder; name = sv.lproj; path = GoogleSignIn/Sources/Strings/sv.lproj; sourceTree = ""; }; 3962DA36A0DEC0600C99745EDC96BCF2 /* GULMutableDictionary.m */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.objc; name = GULMutableDictionary.m; path = GoogleUtilities/Network/GULMutableDictionary.m; sourceTree = ""; }; 39A11EF090AAEA814EAF405F7D63C073 /* OIDClientMetadataParameters.m */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.objc; name = OIDClientMetadataParameters.m; path = Source/AppAuthCore/OIDClientMetadataParameters.m; sourceTree = ""; }; 39C21542A4C58154B12335D61C7BA9E8 /* TransitionOperation+Action.swift */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.swift; name = "TransitionOperation+Action.swift"; path = "Sources/Pageboy/Transitioning/TransitionOperation+Action.swift"; sourceTree = ""; }; @@ -2493,9 +2495,9 @@ 3B3975F49B5730291292E02F0019246C /* FBLPromise+Any.m */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.objc; name = "FBLPromise+Any.m"; path = "Sources/FBLPromises/FBLPromise+Any.m"; sourceTree = ""; }; 3BF151565BB163BE783D66DCB7A84272 /* GULReachabilityChecker.m */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.objc; name = GULReachabilityChecker.m; path = GoogleUtilities/Reachability/GULReachabilityChecker.m; sourceTree = ""; }; 3BF5A3EE8B83560E0B1BA3A5BCED5BE5 /* FIRCLSdSYM.h */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.h; name = FIRCLSdSYM.h; path = Crashlytics/Shared/FIRCLSMachO/FIRCLSdSYM.h; sourceTree = ""; }; - 3C4A6DB7CE76B65AB73875D382BB3D0D /* PrivacyInfo.xcprivacy */ = {isa = PBXFileReference; includeInIndex = 1; name = PrivacyInfo.xcprivacy; path = FirebaseCore/Extension/Resources/PrivacyInfo.xcprivacy; sourceTree = ""; }; + 3C4A6DB7CE76B65AB73875D382BB3D0D /* PrivacyInfo.xcprivacy */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = text.xml; name = PrivacyInfo.xcprivacy; path = FirebaseCore/Extension/Resources/PrivacyInfo.xcprivacy; sourceTree = ""; }; 3CB094FB749B9C29E2E63F684EAA9DDE /* GoogleUtilities-Info.plist */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = text.plist.xml; path = "GoogleUtilities-Info.plist"; sourceTree = ""; }; - 3CB3BCF1390F1406B03BC8DB4735D727 /* FirebaseRemoteConfigInterop */ = {isa = PBXFileReference; explicitFileType = wrapper.framework; includeInIndex = 0; name = FirebaseRemoteConfigInterop; path = FirebaseRemoteConfigInterop.framework; sourceTree = BUILT_PRODUCTS_DIR; }; + 3CB3BCF1390F1406B03BC8DB4735D727 /* FirebaseRemoteConfigInterop.framework */ = {isa = PBXFileReference; explicitFileType = wrapper.framework; includeInIndex = 0; path = FirebaseRemoteConfigInterop.framework; sourceTree = BUILT_PRODUCTS_DIR; }; 3CB9AC9DFE11AD678B3552F05C400DE0 /* ResourceBundle-FirebaseCoreExtension_Privacy-FirebaseCoreExtension-Info.plist */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = text.plist.xml; path = "ResourceBundle-FirebaseCoreExtension_Privacy-FirebaseCoreExtension-Info.plist"; sourceTree = ""; }; 3CB9F052C9AC715674B7C142CA5D9DAB /* Notifications.swift */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.swift; name = Notifications.swift; path = Source/Notifications.swift; sourceTree = ""; }; 3CE510AE3607001AEEF33B2449D892E4 /* nanopb-dummy.m */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.objc; path = "nanopb-dummy.m"; sourceTree = ""; }; @@ -2503,13 +2505,13 @@ 3CF246F1E89907E30694654E70682665 /* OIDServiceConfiguration.h */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.h; name = OIDServiceConfiguration.h; path = Source/AppAuthCore/OIDServiceConfiguration.h; sourceTree = ""; }; 3D1F66F49AD770B2C3F83A8463DA172A /* FIRCLSInternalReport.h */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.h; name = FIRCLSInternalReport.h; path = Crashlytics/Crashlytics/Models/FIRCLSInternalReport.h; sourceTree = ""; }; 3DAF659A9A14877318A9DF51CCB4D37E /* FirebaseInstallationsInternal.h */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.h; name = FirebaseInstallationsInternal.h; path = FirebaseInstallations/Source/Library/Private/FirebaseInstallationsInternal.h; sourceTree = ""; }; - 3DB01FDB86ADD70A7FACA4029C20E2E7 /* FIRCLSDwarfUnwind.c */ = {isa = PBXFileReference; includeInIndex = 1; name = FIRCLSDwarfUnwind.c; path = Crashlytics/Crashlytics/Unwind/Dwarf/FIRCLSDwarfUnwind.c; sourceTree = ""; }; + 3DB01FDB86ADD70A7FACA4029C20E2E7 /* FIRCLSDwarfUnwind.c */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.c; name = FIRCLSDwarfUnwind.c; path = Crashlytics/Crashlytics/Unwind/Dwarf/FIRCLSDwarfUnwind.c; sourceTree = ""; }; 3E23BBFD4720B3083604DD33ED079030 /* DiskStorage.swift */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.swift; name = DiskStorage.swift; path = Sources/Cache/DiskStorage.swift; sourceTree = ""; }; 3E4CDED0C4C5DBA09BEFF86084308BD2 /* FIRCLSRecordBase.m */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.objc; name = FIRCLSRecordBase.m; path = Crashlytics/Crashlytics/Models/Record/FIRCLSRecordBase.m; sourceTree = ""; }; 3EA53E7876FEAE83B2048CDF79EF2247 /* FIRCLSFile.m */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.objc; name = FIRCLSFile.m; path = Crashlytics/Crashlytics/Helpers/FIRCLSFile.m; sourceTree = ""; }; 3ED207EE01C9D01AD2C2B3DC616DCF7E /* GraphicsContext.swift */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.swift; name = GraphicsContext.swift; path = Sources/Image/GraphicsContext.swift; sourceTree = ""; }; 3F08735F1F7AEBEF01D30E53576E1779 /* SessionCoordinator.swift */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.swift; name = SessionCoordinator.swift; path = FirebaseSessions/Sources/SessionCoordinator.swift; sourceTree = ""; }; - 3F238BB22C5201CE689CAF2F766AED95 /* PromisesObjC-FBLPromises_Privacy */ = {isa = PBXFileReference; explicitFileType = wrapper.cfbundle; includeInIndex = 0; name = "PromisesObjC-FBLPromises_Privacy"; path = FBLPromises_Privacy.bundle; sourceTree = BUILT_PRODUCTS_DIR; }; + 3F238BB22C5201CE689CAF2F766AED95 /* FBLPromises_Privacy.bundle */ = {isa = PBXFileReference; explicitFileType = wrapper.cfbundle; includeInIndex = 0; path = FBLPromises_Privacy.bundle; sourceTree = BUILT_PRODUCTS_DIR; }; 3F2601615E8567B1EC6D30C218DCD8D6 /* GIDSignInButton.m */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.objc; name = GIDSignInButton.m; path = GoogleSignIn/Sources/GIDSignInButton.m; sourceTree = ""; }; 3F2C5118A2AED4B0E1A38C655AA75B6E /* FIRCLSUnwind_arch.h */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.h; name = FIRCLSUnwind_arch.h; path = Crashlytics/Crashlytics/Unwind/FIRCLSUnwind_arch.h; sourceTree = ""; }; 3F6A47A7DC17B866A0A5D7E71849F043 /* NSBundle+GID3PAdditions.m */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.objc; name = "NSBundle+GID3PAdditions.m"; path = "GoogleSignIn/Sources/NSBundle+GID3PAdditions.m"; sourceTree = ""; }; @@ -2517,7 +2519,7 @@ 3F9F532813281ECF6E2D3FFF3A40DE23 /* FIRCLSCompactUnwind.h */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.h; name = FIRCLSCompactUnwind.h; path = Crashlytics/Crashlytics/Unwind/Compact/FIRCLSCompactUnwind.h; sourceTree = ""; }; 3FB318202D58BFABC418C0E3CA6DCCB3 /* ImageBinder.swift */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.swift; name = ImageBinder.swift; path = Sources/SwiftUI/ImageBinder.swift; sourceTree = ""; }; 3FBCA0CB8659485A95DC1CEE179F270D /* GDTCOREndpoints_Private.h */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.h; name = GDTCOREndpoints_Private.h; path = GoogleDataTransport/GDTCORLibrary/Private/GDTCOREndpoints_Private.h; sourceTree = ""; }; - 3FD1B4C1246D643E9476438C28048FA8 /* AppAuth */ = {isa = PBXFileReference; explicitFileType = wrapper.framework; includeInIndex = 0; name = AppAuth; path = AppAuth.framework; sourceTree = BUILT_PRODUCTS_DIR; }; + 3FD1B4C1246D643E9476438C28048FA8 /* AppAuth.framework */ = {isa = PBXFileReference; explicitFileType = wrapper.framework; includeInIndex = 0; path = AppAuth.framework; sourceTree = BUILT_PRODUCTS_DIR; }; 3FE37AA038B9063F50553CD95B14EF25 /* FIRCLSNotificationManager.m */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.objc; name = FIRCLSNotificationManager.m; path = Crashlytics/Crashlytics/Controllers/FIRCLSNotificationManager.m; sourceTree = ""; }; 401B14DB1FDC28F846A323713AC6D739 /* Pageboy.release.xcconfig */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = text.xcconfig; path = Pageboy.release.xcconfig; sourceTree = ""; }; 4022C906DAD4ABB97BF30145DCEB1B8D /* ServerTrustEvaluation.swift */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.swift; name = ServerTrustEvaluation.swift; path = Source/ServerTrustEvaluation.swift; sourceTree = ""; }; @@ -2527,11 +2529,11 @@ 40CBBE3491434E1B578E2B20424EA217 /* Kingfisher-dummy.m */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.objc; path = "Kingfisher-dummy.m"; sourceTree = ""; }; 415C84A785D442C458472FCDC9405D78 /* GULMutableDictionary.h */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.h; name = GULMutableDictionary.h; path = GoogleUtilities/Network/Public/GoogleUtilities/GULMutableDictionary.h; sourceTree = ""; }; 4160FCD418BD8BCD6BFAE0A483C6EF03 /* UIViewController+ScrollViewDetection.swift */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.swift; name = "UIViewController+ScrollViewDetection.swift"; path = "Sources/Tabman/AutoInsetter/Utilities/UIViewController+ScrollViewDetection.swift"; sourceTree = ""; }; - 41718E1E619CA46128430578570E22C9 /* FIRCLSProcess.c */ = {isa = PBXFileReference; includeInIndex = 1; name = FIRCLSProcess.c; path = Crashlytics/Crashlytics/Components/FIRCLSProcess.c; sourceTree = ""; }; + 41718E1E619CA46128430578570E22C9 /* FIRCLSProcess.c */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.c; name = FIRCLSProcess.c; path = Crashlytics/Crashlytics/Components/FIRCLSProcess.c; sourceTree = ""; }; 4177F623D0F7B52991B8F22A1406D5E5 /* FirebaseCore.modulemap */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.module; path = FirebaseCore.modulemap; sourceTree = ""; }; 41982BDAF9ED97B0E13CF1C64EA30D61 /* ImageProgressive.swift */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.swift; name = ImageProgressive.swift; path = Sources/Image/ImageProgressive.swift; sourceTree = ""; }; 419C18814EA131B07C06AF41C7080D85 /* EdgeFadedView.swift */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.swift; name = EdgeFadedView.swift; path = Sources/Tabman/Bar/Generic/EdgeFadedView.swift; sourceTree = ""; }; - 41BDB12D51BD09A4941E50AF70031B27 /* RLMUUID.mm */ = {isa = PBXFileReference; includeInIndex = 1; name = RLMUUID.mm; path = Realm/RLMUUID.mm; sourceTree = ""; }; + 41BDB12D51BD09A4941E50AF70031B27 /* RLMUUID.mm */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.cpp.objcpp; name = RLMUUID.mm; path = Realm/RLMUUID.mm; sourceTree = ""; }; 41DF45E5595A6CA56FE165A6CE46E0F1 /* OIDAuthorizationRequest.m */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.objc; name = OIDAuthorizationRequest.m; path = Source/AppAuthCore/OIDAuthorizationRequest.m; sourceTree = ""; }; 42132B49FA06781F77EF997D9D87D1DF /* FirebaseRemoteConfigInterop.debug.xcconfig */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = text.xcconfig; path = FirebaseRemoteConfigInterop.debug.xcconfig; sourceTree = ""; }; 42328FCB5380FEEE565DEEC94D9CB1E3 /* GDTCORUploadBatch.m */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.objc; name = GDTCORUploadBatch.m; path = GoogleDataTransport/GDTCORLibrary/GDTCORUploadBatch.m; sourceTree = ""; }; @@ -2539,27 +2541,27 @@ 42B39BE501AF475C9699E58CCC9636CF /* FIRInstallationsStoredAuthToken.m */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.objc; name = FIRInstallationsStoredAuthToken.m; path = FirebaseInstallations/Source/Library/InstallationsStore/FIRInstallationsStoredAuthToken.m; sourceTree = ""; }; 42BD1939B9C22F97EEAA2DE3E276505C /* RLMSyncSubscription.h */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.h; name = RLMSyncSubscription.h; path = include/RLMSyncSubscription.h; sourceTree = ""; }; 42CBDEF210C918321714F7E4A1C557FA /* RLMMongoDatabase.h */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.h; name = RLMMongoDatabase.h; path = include/RLMMongoDatabase.h; sourceTree = ""; }; - 4301CA3D9E073FF7468CBD37EEC25C60 /* RLMQueryUtil.mm */ = {isa = PBXFileReference; includeInIndex = 1; name = RLMQueryUtil.mm; path = Realm/RLMQueryUtil.mm; sourceTree = ""; }; + 4301CA3D9E073FF7468CBD37EEC25C60 /* RLMQueryUtil.mm */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.cpp.objcpp; name = RLMQueryUtil.mm; path = Realm/RLMQueryUtil.mm; sourceTree = ""; }; 430462AD1838D1D853FF7E83C3815ABA /* FIRCurrentDateProvider.h */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.h; name = FIRCurrentDateProvider.h; path = FirebaseInstallations/Source/Library/InstallationsIDController/FIRCurrentDateProvider.h; sourceTree = ""; }; 432DAEF82041FA4A7E8108C26322D541 /* NetworkReachabilityManager.swift */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.swift; name = NetworkReachabilityManager.swift; path = Source/NetworkReachabilityManager.swift; sourceTree = ""; }; 43532206E965DB3E583ED246DA45E4EB /* external_prequest_context.nanopb.h */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.h; name = external_prequest_context.nanopb.h; path = GoogleDataTransport/GDTCCTLibrary/Protogen/nanopb/external_prequest_context.nanopb.h; sourceTree = ""; }; - 437919EE08EC6BFCCBAC3BD346309742 /* RealmSwift */ = {isa = PBXFileReference; explicitFileType = wrapper.framework; includeInIndex = 0; name = RealmSwift; path = RealmSwift.framework; sourceTree = BUILT_PRODUCTS_DIR; }; - 43836CE6BF6CF62BA225B01DE7CBC72C /* RLMResults.mm */ = {isa = PBXFileReference; includeInIndex = 1; name = RLMResults.mm; path = Realm/RLMResults.mm; sourceTree = ""; }; + 437919EE08EC6BFCCBAC3BD346309742 /* RealmSwift.framework */ = {isa = PBXFileReference; explicitFileType = wrapper.framework; includeInIndex = 0; path = RealmSwift.framework; sourceTree = BUILT_PRODUCTS_DIR; }; + 43836CE6BF6CF62BA225B01DE7CBC72C /* RLMResults.mm */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.cpp.objcpp; name = RLMResults.mm; path = Realm/RLMResults.mm; sourceTree = ""; }; 43A89E3DCABEF4F62665D035FE85A4ED /* GoogleUtilities-dummy.m */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.objc; path = "GoogleUtilities-dummy.m"; sourceTree = ""; }; 43C25D971C8DBA8B970A6B9BF88B6847 /* GDTCOREvent+GDTCCTSupport.h */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.h; name = "GDTCOREvent+GDTCCTSupport.h"; path = "GoogleDataTransport/GDTCCTLibrary/Public/GDTCOREvent+GDTCCTSupport.h"; sourceTree = ""; }; 43EEE6F6736AD8719B1588A9B992A243 /* PromisesObjC-Info.plist */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = text.plist.xml; path = "PromisesObjC-Info.plist"; sourceTree = ""; }; 43FDF3805A649EAAA358D08476FCB6FB /* SessionStartEvent.swift */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.swift; name = SessionStartEvent.swift; path = FirebaseSessions/Sources/SessionStartEvent.swift; sourceTree = ""; }; 43FFBA1B323F5D4E1960043CBFEC5BDF /* LocalOverrideSettings.swift */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.swift; name = LocalOverrideSettings.swift; path = FirebaseSessions/Sources/Settings/LocalOverrideSettings.swift; sourceTree = ""; }; 44076AB70C350A3C5172E11E41BA6B13 /* RLMResults.h */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.h; name = RLMResults.h; path = include/RLMResults.h; sourceTree = ""; }; - 442D128D9E0D1A4D52AADC2E66826C9E /* sk.lproj */ = {isa = PBXFileReference; includeInIndex = 1; name = sk.lproj; path = GoogleSignIn/Sources/Strings/sk.lproj; sourceTree = ""; }; + 442D128D9E0D1A4D52AADC2E66826C9E /* sk.lproj */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = folder; name = sk.lproj; path = GoogleSignIn/Sources/Strings/sk.lproj; sourceTree = ""; }; 448BE1BBC44A801C0FB6849E7D3E4BB6 /* FIRAnalyticsConfiguration.m */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.objc; name = FIRAnalyticsConfiguration.m; path = FirebaseCore/Sources/FIRAnalyticsConfiguration.m; sourceTree = ""; }; 448D5248DA13F678B69E4BADA4BF560F /* Alamofire-umbrella.h */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.h; path = "Alamofire-umbrella.h"; sourceTree = ""; }; 44914FBC5FC1AE17CE00A003EAF8CFA1 /* CollectionViewInsetCalculator.swift */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.swift; name = CollectionViewInsetCalculator.swift; path = Sources/Tabman/AutoInsetter/InsetCalculator/CollectionViewInsetCalculator.swift; sourceTree = ""; }; - 44E291D18340EAC3F761346198515323 /* GoogleUtilities-GoogleUtilities_Privacy */ = {isa = PBXFileReference; explicitFileType = wrapper.cfbundle; includeInIndex = 0; name = "GoogleUtilities-GoogleUtilities_Privacy"; path = GoogleUtilities_Privacy.bundle; sourceTree = BUILT_PRODUCTS_DIR; }; + 44E291D18340EAC3F761346198515323 /* GoogleUtilities_Privacy.bundle */ = {isa = PBXFileReference; explicitFileType = wrapper.cfbundle; includeInIndex = 0; path = GoogleUtilities_Privacy.bundle; sourceTree = BUILT_PRODUCTS_DIR; }; 44FE0BB57E19D188FF831C0DEBE267D5 /* TMBarBackgroundView.swift */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.swift; name = TMBarBackgroundView.swift; path = Sources/Tabman/Bar/BarBackgroundView/TMBarBackgroundView.swift; sourceTree = ""; }; - 4542A74D967525344AF0AA5C14ADE4C5 /* FIRCLSAllocate.c */ = {isa = PBXFileReference; includeInIndex = 1; name = FIRCLSAllocate.c; path = Crashlytics/Crashlytics/Helpers/FIRCLSAllocate.c; sourceTree = ""; }; + 4542A74D967525344AF0AA5C14ADE4C5 /* FIRCLSAllocate.c */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.c; name = FIRCLSAllocate.c; path = Crashlytics/Crashlytics/Helpers/FIRCLSAllocate.c; sourceTree = ""; }; 455AF3D02EFDF36F211D1B66DBC434B8 /* FIRCLSGlobals.h */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.h; name = FIRCLSGlobals.h; path = Crashlytics/Crashlytics/Components/FIRCLSGlobals.h; sourceTree = ""; }; - 4597368236CAD695E0D439ADAE65DF93 /* PrivacyInfo.xcprivacy */ = {isa = PBXFileReference; includeInIndex = 1; name = PrivacyInfo.xcprivacy; path = FirebaseCore/Internal/Sources/Resources/PrivacyInfo.xcprivacy; sourceTree = ""; }; + 4597368236CAD695E0D439ADAE65DF93 /* PrivacyInfo.xcprivacy */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = text.xml; name = PrivacyInfo.xcprivacy; path = FirebaseCore/Internal/Sources/Resources/PrivacyInfo.xcprivacy; sourceTree = ""; }; 45A7B24E4FF62EA47E8ADAB031C4BE57 /* SectionedResults.swift */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.swift; name = SectionedResults.swift; path = RealmSwift/SectionedResults.swift; sourceTree = ""; }; 45ADE1576945AD5139E5E746366D1601 /* FIRFirebaseUserAgent.m */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.objc; name = FIRFirebaseUserAgent.m; path = FirebaseCore/Sources/FIRFirebaseUserAgent.m; sourceTree = ""; }; 45B335676C1B4EED0E3314299643DC70 /* RLMDictionary.h */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.h; name = RLMDictionary.h; path = include/RLMDictionary.h; sourceTree = ""; }; @@ -2571,7 +2573,7 @@ 468DD6347DA5A121E1F35CE150E598E7 /* FIROptions.h */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.h; name = FIROptions.h; path = FirebaseCore/Sources/Public/FirebaseCore/FIROptions.h; sourceTree = ""; }; 46CAD3030B13E135CF0F123FA2BA1A2E /* UIKit+TMBarItemable.swift */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.swift; name = "UIKit+TMBarItemable.swift"; path = "Sources/Tabman/Bar/BarItem/UIKit+TMBarItemable.swift"; sourceTree = ""; }; 479AFF56750C697F3F929740B5D639F0 /* SyncSubscription.swift */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.swift; name = SyncSubscription.swift; path = RealmSwift/SyncSubscription.swift; sourceTree = ""; }; - 47C581450CDB4A6111CB97EEE0711A8C /* FirebaseInstallations-FirebaseInstallations_Privacy */ = {isa = PBXFileReference; explicitFileType = wrapper.cfbundle; includeInIndex = 0; name = "FirebaseInstallations-FirebaseInstallations_Privacy"; path = FirebaseInstallations_Privacy.bundle; sourceTree = BUILT_PRODUCTS_DIR; }; + 47C581450CDB4A6111CB97EEE0711A8C /* FirebaseInstallations_Privacy.bundle */ = {isa = PBXFileReference; explicitFileType = wrapper.cfbundle; includeInIndex = 0; path = FirebaseInstallations_Privacy.bundle; sourceTree = BUILT_PRODUCTS_DIR; }; 47C8758C43CA13F1EAD00551E592A897 /* ImageDataProcessor.swift */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.swift; name = ImageDataProcessor.swift; path = Sources/Networking/ImageDataProcessor.swift; sourceTree = ""; }; 48235BBCC78EE20C23573AEF3C06672B /* UIScrollView+Interaction.swift */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.swift; name = "UIScrollView+Interaction.swift"; path = "Sources/Pageboy/Utilities/Extensions/UIScrollView+Interaction.swift"; sourceTree = ""; }; 48331F3450843608A6A609D957E7DB02 /* FIRCLSAnalyticsManager.h */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.h; name = FIRCLSAnalyticsManager.h; path = Crashlytics/Crashlytics/Controllers/FIRCLSAnalyticsManager.h; sourceTree = ""; }; @@ -2582,7 +2584,7 @@ 48D2A9A3D8D1AB2712193E1CB0A9F0B3 /* Tabman.debug.xcconfig */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = text.xcconfig; path = Tabman.debug.xcconfig; sourceTree = ""; }; 490B08CD6AD27B605280C321C1F55786 /* GIDCallbackQueue.h */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.h; name = GIDCallbackQueue.h; path = GoogleSignIn/Sources/GIDCallbackQueue.h; sourceTree = ""; }; 492006410BA71A35E613160B841859DD /* FBLPromise+Retry.h */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.h; name = "FBLPromise+Retry.h"; path = "Sources/FBLPromises/include/FBLPromise+Retry.h"; sourceTree = ""; }; - 498263EF2F2145AFA0321633550E6B7E /* RLMSwiftCollectionBase.mm */ = {isa = PBXFileReference; includeInIndex = 1; name = RLMSwiftCollectionBase.mm; path = Realm/RLMSwiftCollectionBase.mm; sourceTree = ""; }; + 498263EF2F2145AFA0321633550E6B7E /* RLMSwiftCollectionBase.mm */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.cpp.objcpp; name = RLMSwiftCollectionBase.mm; path = Realm/RLMSwiftCollectionBase.mm; sourceTree = ""; }; 49A972BF3C9B7FFE5A41CEA4E3D5F58E /* FIRCLSInternalReport.m */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.objc; name = FIRCLSInternalReport.m; path = Crashlytics/Crashlytics/Models/FIRCLSInternalReport.m; sourceTree = ""; }; 49AAB895459C5E451ED50502ED060576 /* FirebaseCoreInternal-umbrella.h */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.h; path = "FirebaseCoreInternal-umbrella.h"; sourceTree = ""; }; 4A305D6078828CAA8AA49121CD56BD04 /* RLMFindOneAndModifyOptions.h */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.h; name = RLMFindOneAndModifyOptions.h; path = include/RLMFindOneAndModifyOptions.h; sourceTree = ""; }; @@ -2590,9 +2592,9 @@ 4A67E1ACDDE0955803C129CA9EBEDF7A /* FIRCLSProcess.h */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.h; name = FIRCLSProcess.h; path = Crashlytics/Crashlytics/Components/FIRCLSProcess.h; sourceTree = ""; }; 4A6F3133598C956FB25F7122AF180779 /* RLMScheduler.h */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.h; name = RLMScheduler.h; path = include/RLMScheduler.h; sourceTree = ""; }; 4B0936334FFE081A49D1889C73775EA7 /* FIRCLSFile.h */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.h; name = FIRCLSFile.h; path = Crashlytics/Crashlytics/Helpers/FIRCLSFile.h; sourceTree = ""; }; - 4B17B2C7F960F86CB6FF5F26189D187D /* RLMArray.mm */ = {isa = PBXFileReference; includeInIndex = 1; name = RLMArray.mm; path = Realm/RLMArray.mm; sourceTree = ""; }; + 4B17B2C7F960F86CB6FF5F26189D187D /* RLMArray.mm */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.cpp.objcpp; name = RLMArray.mm; path = Realm/RLMArray.mm; sourceTree = ""; }; 4B263796A3BBDF55812CA3CD38A25A16 /* FIRInstallationsItem.h */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.h; name = FIRInstallationsItem.h; path = FirebaseInstallations/Source/Library/FIRInstallationsItem.h; sourceTree = ""; }; - 4B31EE0C35F4C463AFDB679410D504FF /* pt.lproj */ = {isa = PBXFileReference; includeInIndex = 1; name = pt.lproj; path = GoogleSignIn/Sources/Strings/pt.lproj; sourceTree = ""; }; + 4B31EE0C35F4C463AFDB679410D504FF /* pt.lproj */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = folder; name = pt.lproj; path = GoogleSignIn/Sources/Strings/pt.lproj; sourceTree = ""; }; 4B6D3A0F43F9B126A0AAA3341627A0BD /* PageboyViewController+AutoScrolling.swift */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.swift; name = "PageboyViewController+AutoScrolling.swift"; path = "Sources/Pageboy/AutoScrolling/PageboyViewController+AutoScrolling.swift"; sourceTree = ""; }; 4BFAC97EF44DD5798380B0FCAE886AD3 /* Tabman-dummy.m */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.objc; path = "Tabman-dummy.m"; sourceTree = ""; }; 4C05A2D397179BBBEB1F258EA63D03D2 /* FIRCLSDataCollectionToken.h */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.h; name = FIRCLSDataCollectionToken.h; path = Crashlytics/Crashlytics/DataCollection/FIRCLSDataCollectionToken.h; sourceTree = ""; }; @@ -2604,15 +2606,15 @@ 4C8042DAAB06E58AF6767A0038DA7899 /* nanopb-umbrella.h */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.h; path = "nanopb-umbrella.h"; sourceTree = ""; }; 4CFF008AA31DBC642D766BB4A1C7F916 /* GIDAuthStateMigration.m */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.objc; name = GIDAuthStateMigration.m; path = GoogleSignIn/Sources/GIDAuthStateMigration.m; sourceTree = ""; }; 4D437D6FB8363FE41F9702823DC12AB6 /* PromisesSwift.release.xcconfig */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = text.xcconfig; path = PromisesSwift.release.xcconfig; sourceTree = ""; }; - 4D4799138F8AC5FFF2497DCB60AF4CBB /* Tabman */ = {isa = PBXFileReference; explicitFileType = wrapper.framework; includeInIndex = 0; name = Tabman; path = Tabman.framework; sourceTree = BUILT_PRODUCTS_DIR; }; + 4D4799138F8AC5FFF2497DCB60AF4CBB /* Tabman.framework */ = {isa = PBXFileReference; explicitFileType = wrapper.framework; includeInIndex = 0; path = Tabman.framework; sourceTree = BUILT_PRODUCTS_DIR; }; 4D626A3DA333BDA4B5F4EFE30873225F /* FirebaseCoreExtension-umbrella.h */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.h; path = "FirebaseCoreExtension-umbrella.h"; sourceTree = ""; }; 4D743B54C59EA4F69E4E94676EB620E2 /* GDTCORUploadBatch.h */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.h; name = GDTCORUploadBatch.h; path = GoogleDataTransport/GDTCORLibrary/Private/GDTCORUploadBatch.h; sourceTree = ""; }; - 4D7B18CD9E34976607FF5B4639DADBF2 /* RLMObjectStore.mm */ = {isa = PBXFileReference; includeInIndex = 1; name = RLMObjectStore.mm; path = Realm/RLMObjectStore.mm; sourceTree = ""; }; - 4DB03FD262B678178A44272143846563 /* FirebaseCoreInternal-FirebaseCoreInternal_Privacy */ = {isa = PBXFileReference; explicitFileType = wrapper.cfbundle; includeInIndex = 0; name = "FirebaseCoreInternal-FirebaseCoreInternal_Privacy"; path = FirebaseCoreInternal_Privacy.bundle; sourceTree = BUILT_PRODUCTS_DIR; }; + 4D7B18CD9E34976607FF5B4639DADBF2 /* RLMObjectStore.mm */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.cpp.objcpp; name = RLMObjectStore.mm; path = Realm/RLMObjectStore.mm; sourceTree = ""; }; + 4DB03FD262B678178A44272143846563 /* FirebaseCoreInternal_Privacy.bundle */ = {isa = PBXFileReference; explicitFileType = wrapper.cfbundle; includeInIndex = 0; path = FirebaseCoreInternal_Privacy.bundle; sourceTree = BUILT_PRODUCTS_DIR; }; 4DCFA92A504DE14154F5D2019A225B6C /* ObjectId.swift */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.swift; name = ObjectId.swift; path = RealmSwift/ObjectId.swift; sourceTree = ""; }; 4E276A320FE70EFC9BAC7BD21E81BA2C /* RLMApp_Private.h */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.h; name = RLMApp_Private.h; path = include/RLMApp_Private.h; sourceTree = ""; }; 4E2A27990BBFEA40D120A9F677B0EF51 /* OIDAuthStateErrorDelegate.h */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.h; name = OIDAuthStateErrorDelegate.h; path = Source/AppAuthCore/OIDAuthStateErrorDelegate.h; sourceTree = ""; }; - 4E91D48440B2E3FD06FD706A4CA1F38B /* RLMClassInfo.mm */ = {isa = PBXFileReference; includeInIndex = 1; name = RLMClassInfo.mm; path = Realm/RLMClassInfo.mm; sourceTree = ""; }; + 4E91D48440B2E3FD06FD706A4CA1F38B /* RLMClassInfo.mm */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.cpp.objcpp; name = RLMClassInfo.mm; path = Realm/RLMClassInfo.mm; sourceTree = ""; }; 4EB6257781A05DE8FDC81BAF56AD5CB0 /* GTMAppAuthFetcherAuthorization+Keychain.m */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.objc; name = "GTMAppAuthFetcherAuthorization+Keychain.m"; path = "GTMAppAuth/Sources/GTMAppAuthFetcherAuthorization+Keychain.m"; sourceTree = ""; }; 4EE5BC2CBF2745FEA5EE6C4CBA83C205 /* FBLPromise+Retry.m */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.objc; name = "FBLPromise+Retry.m"; path = "Sources/FBLPromises/FBLPromise+Retry.m"; sourceTree = ""; }; 4EF2D4CB44643DC4AE569A006AFA3C26 /* FIRLoggerLevel.h */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.h; name = FIRLoggerLevel.h; path = FirebaseCore/Sources/Public/FirebaseCore/FIRLoggerLevel.h; sourceTree = ""; }; @@ -2637,7 +2639,7 @@ 53342203E0D679698CC61213D483A7AE /* GULLogger.m */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.objc; name = GULLogger.m; path = GoogleUtilities/Logger/GULLogger.m; sourceTree = ""; }; 5343E933D4EE0AFD9442180A4EDD0C58 /* GIDMDMPasscodeCache.m */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.objc; name = GIDMDMPasscodeCache.m; path = GoogleSignIn/Sources/GIDMDMPasscodeCache.m; sourceTree = ""; }; 534A63BD2714527DC1A37AF8792F8598 /* FIRInstallationsIIDStore.m */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.objc; name = FIRInstallationsIIDStore.m; path = FirebaseInstallations/Source/Library/IIDMigration/FIRInstallationsIIDStore.m; sourceTree = ""; }; - 534DDBFAA581BCD28E2208297AF24275 /* nb.lproj */ = {isa = PBXFileReference; includeInIndex = 1; name = nb.lproj; path = GoogleSignIn/Sources/Strings/nb.lproj; sourceTree = ""; }; + 534DDBFAA581BCD28E2208297AF24275 /* nb.lproj */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = folder; name = nb.lproj; path = GoogleSignIn/Sources/Strings/nb.lproj; sourceTree = ""; }; 53BC35E4AAE7822625A5FA445FB983B8 /* FIRCLSContext.m */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.objc; name = FIRCLSContext.m; path = Crashlytics/Crashlytics/Components/FIRCLSContext.m; sourceTree = ""; }; 53D2F0E40F187BB1D533FEC59371A6E3 /* GULApplication.h */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.h; name = GULApplication.h; path = GoogleUtilities/AppDelegateSwizzler/Public/GoogleUtilities/GULApplication.h; sourceTree = ""; }; 53D981053390803E49DC3BD67F483BD7 /* FIRCLSSettings.h */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.h; name = FIRCLSSettings.h; path = Crashlytics/Crashlytics/Models/FIRCLSSettings.h; sourceTree = ""; }; @@ -2647,7 +2649,7 @@ 544480BB435B3042D1BD649FCD262934 /* Combine.swift */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.swift; name = Combine.swift; path = Source/Combine.swift; sourceTree = ""; }; 5466A4E7831FD6178A5EB92C1944256E /* OIDIDToken.m */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.objc; name = OIDIDToken.m; path = Source/AppAuthCore/OIDIDToken.m; sourceTree = ""; }; 547977C8795E87C9C90993C8096C6776 /* GIDEMMErrorHandler.m */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.objc; name = GIDEMMErrorHandler.m; path = GoogleSignIn/Sources/GIDEMMErrorHandler.m; sourceTree = ""; }; - 5484B11E1FDA51A9C5E1E793927E7D53 /* hi.lproj */ = {isa = PBXFileReference; includeInIndex = 1; name = hi.lproj; path = GoogleSignIn/Sources/Strings/hi.lproj; sourceTree = ""; }; + 5484B11E1FDA51A9C5E1E793927E7D53 /* hi.lproj */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = folder; name = hi.lproj; path = GoogleSignIn/Sources/Strings/hi.lproj; sourceTree = ""; }; 54922ABDD078BF1B60FE179EF751CA4E /* FIRCLSCallStackTree.h */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.h; name = FIRCLSCallStackTree.h; path = Crashlytics/Crashlytics/Helpers/FIRCLSCallStackTree.h; sourceTree = ""; }; 54938645F26D34DC1BB8AA87ADC3EF97 /* dwarf.h */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.h; name = dwarf.h; path = Crashlytics/third_party/libunwind/dwarf.h; sourceTree = ""; }; 549A830C192EDCEF59D70CC36DC6D902 /* Kingfisher.release.xcconfig */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = text.xcconfig; path = Kingfisher.release.xcconfig; sourceTree = ""; }; @@ -2655,7 +2657,7 @@ 54C1DC71BAD5407D11523246929C1633 /* Error.swift */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.swift; name = Error.swift; path = RealmSwift/Error.swift; sourceTree = ""; }; 54CE1BB220709D43C4B74C278E24E279 /* URLSessionConfiguration+Alamofire.swift */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.swift; name = "URLSessionConfiguration+Alamofire.swift"; path = "Source/URLSessionConfiguration+Alamofire.swift"; sourceTree = ""; }; 54F1A31A8FB16805631AF53A81DC7A2F /* RLMUser.h */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.h; name = RLMUser.h; path = include/RLMUser.h; sourceTree = ""; }; - 55276C88E7B1785631AFF08051A9E2CB /* en_GB.lproj */ = {isa = PBXFileReference; includeInIndex = 1; name = en_GB.lproj; path = GoogleSignIn/Sources/Strings/en_GB.lproj; sourceTree = ""; }; + 55276C88E7B1785631AFF08051A9E2CB /* en_GB.lproj */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = folder; name = en_GB.lproj; path = GoogleSignIn/Sources/Strings/en_GB.lproj; sourceTree = ""; }; 559B7EBC29FFDD99FD4E44BF44FE5B1E /* GTMSessionUploadFetcher.h */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.h; name = GTMSessionUploadFetcher.h; path = Sources/Core/Public/GTMSessionFetcher/GTMSessionUploadFetcher.h; sourceTree = ""; }; 561E5FA21C7A138B881C7DD1AD557E0F /* FIRCLSFABNetworkClient.h */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.h; name = FIRCLSFABNetworkClient.h; path = Crashlytics/Shared/FIRCLSNetworking/FIRCLSFABNetworkClient.h; sourceTree = ""; }; 566A3FFABEFC28048A5783FA0876C895 /* AppAuth.release.xcconfig */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = text.xcconfig; path = AppAuth.release.xcconfig; sourceTree = ""; }; @@ -2663,7 +2665,7 @@ 569C373124FB072B98FAE95B237F013F /* ObjectiveCSupport+AnyRealmValue.swift */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.swift; name = "ObjectiveCSupport+AnyRealmValue.swift"; path = "RealmSwift/ObjectiveCSupport+AnyRealmValue.swift"; sourceTree = ""; }; 56F921E183D5FCBABAD3280D54DEE4AD /* IsAppEncrypted.h */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.h; name = IsAppEncrypted.h; path = third_party/IsAppEncrypted/Public/IsAppEncrypted.h; sourceTree = ""; }; 56FFAAA096DBFB2512E7B93B462AD219 /* DispatchQueue+main.swift */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.swift; name = "DispatchQueue+main.swift"; path = "Sources/Pageboy/Utilities/Extensions/DispatchQueue+main.swift"; sourceTree = ""; }; - 57208586A40C907EC5DFBD942EFEF597 /* RLMDictionary.mm */ = {isa = PBXFileReference; includeInIndex = 1; name = RLMDictionary.mm; path = Realm/RLMDictionary.mm; sourceTree = ""; }; + 57208586A40C907EC5DFBD942EFEF597 /* RLMDictionary.mm */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.cpp.objcpp; name = RLMDictionary.mm; path = Realm/RLMDictionary.mm; sourceTree = ""; }; 5739B6664D8EE9FD0FB1B3782F393ACD /* Pods-pochak-pochakUITests-Info.plist */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = text.plist.xml; path = "Pods-pochak-pochakUITests-Info.plist"; sourceTree = ""; }; 575396EF4E78DD85851873B603302790 /* FIRCLSFABAsyncOperation.m */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.objc; name = FIRCLSFABAsyncOperation.m; path = Crashlytics/Shared/FIRCLSOperation/FIRCLSFABAsyncOperation.m; sourceTree = ""; }; 57564D96CEC6A7BF0FA0E9F3200B982B /* FIRStackFrame.m */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.objc; name = FIRStackFrame.m; path = Crashlytics/Crashlytics/FIRStackFrame.m; sourceTree = ""; }; @@ -2675,9 +2677,9 @@ 594C90BAAB97C29EC33CF423437D1074 /* HeartbeatsPayload.swift */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.swift; name = HeartbeatsPayload.swift; path = FirebaseCore/Internal/Sources/HeartbeatLogging/HeartbeatsPayload.swift; sourceTree = ""; }; 599C98EC4BBA03481B93F032A3898FA5 /* RLMUserAPIKey.h */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.h; name = RLMUserAPIKey.h; path = include/RLMUserAPIKey.h; sourceTree = ""; }; 59D1C15464C6AFA9C68C376EE6B5F995 /* Image.swift */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.swift; name = Image.swift; path = Sources/Image/Image.swift; sourceTree = ""; }; - 59D892ED15567407A178B95F31D1DEB8 /* RLMAccessor.mm */ = {isa = PBXFileReference; includeInIndex = 1; name = RLMAccessor.mm; path = Realm/RLMAccessor.mm; sourceTree = ""; }; + 59D892ED15567407A178B95F31D1DEB8 /* RLMAccessor.mm */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.cpp.objcpp; name = RLMAccessor.mm; path = Realm/RLMAccessor.mm; sourceTree = ""; }; 59DEE6687F8B2A1AC980AB7604A9B27E /* Promise+Wrap.swift */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.swift; name = "Promise+Wrap.swift"; path = "Sources/Promises/Promise+Wrap.swift"; sourceTree = ""; }; - 59E7D662B1BE65DF2AEC0073CC94DE05 /* FIRCLSDemangleOperation.mm */ = {isa = PBXFileReference; includeInIndex = 1; name = FIRCLSDemangleOperation.mm; path = Crashlytics/Crashlytics/Operations/Symbolication/FIRCLSDemangleOperation.mm; sourceTree = ""; }; + 59E7D662B1BE65DF2AEC0073CC94DE05 /* FIRCLSDemangleOperation.mm */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.cpp.objcpp; name = FIRCLSDemangleOperation.mm; path = Crashlytics/Crashlytics/Operations/Symbolication/FIRCLSDemangleOperation.mm; sourceTree = ""; }; 5A1D4985204422A65E566019851B4150 /* GoogleSignIn-umbrella.h */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.h; path = "GoogleSignIn-umbrella.h"; sourceTree = ""; }; 5A904310166607FAE0EACF5004A6CD7B /* OIDErrorUtilities.h */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.h; name = OIDErrorUtilities.h; path = Source/AppAuthCore/OIDErrorUtilities.h; sourceTree = ""; }; 5AD2117B6AD7B4EE7FDFF984C1B3F7AB /* OIDURLSessionProvider.m */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.objc; name = OIDURLSessionProvider.m; path = Source/AppAuthCore/OIDURLSessionProvider.m; sourceTree = ""; }; @@ -2695,7 +2697,7 @@ 5D3AAAAE317CEC6713884F67805954E5 /* OIDAuthorizationService.h */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.h; name = OIDAuthorizationService.h; path = Source/AppAuthCore/OIDAuthorizationService.h; sourceTree = ""; }; 5D4FC6B67C905B6E2BD4BC062C85D412 /* FIRCLSReportManager.h */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.h; name = FIRCLSReportManager.h; path = Crashlytics/Crashlytics/Controllers/FIRCLSReportManager.h; sourceTree = ""; }; 5D70CC783E69D920829635E508B8BA6E /* GDTCOREvent+GDTCCTSupport.m */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.objc; name = "GDTCOREvent+GDTCCTSupport.m"; path = "GoogleDataTransport/GDTCCTLibrary/GDTCOREvent+GDTCCTSupport.m"; sourceTree = ""; }; - 5D797E9A5C5782CE845840781FA1CC81 /* Alamofire */ = {isa = PBXFileReference; explicitFileType = wrapper.framework; includeInIndex = 0; name = Alamofire; path = Alamofire.framework; sourceTree = BUILT_PRODUCTS_DIR; }; + 5D797E9A5C5782CE845840781FA1CC81 /* Alamofire.framework */ = {isa = PBXFileReference; explicitFileType = wrapper.framework; includeInIndex = 0; path = Alamofire.framework; sourceTree = BUILT_PRODUCTS_DIR; }; 5D9EB6837C19F8CE1776092C25139A29 /* CoreTelephony.framework */ = {isa = PBXFileReference; lastKnownFileType = wrapper.framework; name = CoreTelephony.framework; path = Platforms/iPhoneOS.platform/Developer/SDKs/iPhoneOS14.0.sdk/System/Library/Frameworks/CoreTelephony.framework; sourceTree = DEVELOPER_DIR; }; 5E582C4602587721562838528C06B655 /* OIDScopeUtilities.h */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.h; name = OIDScopeUtilities.h; path = Source/AppAuthCore/OIDScopeUtilities.h; sourceTree = ""; }; 5E75E4CCB18B8A5A14C5E517D8889C24 /* GDTCORUploadCoordinator.h */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.h; name = GDTCORUploadCoordinator.h; path = GoogleDataTransport/GDTCORLibrary/Private/GDTCORUploadCoordinator.h; sourceTree = ""; }; @@ -2721,8 +2723,8 @@ 62BACBD6A76A44898BBE4B3DC1C03E1C /* FIRCLSApplicationIdentifierModel.h */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.h; name = FIRCLSApplicationIdentifierModel.h; path = Crashlytics/Crashlytics/Settings/Models/FIRCLSApplicationIdentifierModel.h; sourceTree = ""; }; 62C3A82162F41E6A79D6C368136DC665 /* TMBarViewFocusRect.swift */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.swift; name = TMBarViewFocusRect.swift; path = Sources/Tabman/Bar/BarView/TMBarViewFocusRect.swift; sourceTree = ""; }; 62EFC74CE5075A38F2A82D42E8713DAA /* FIRCLSThreadArrayOperation.m */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.objc; name = FIRCLSThreadArrayOperation.m; path = Crashlytics/Crashlytics/Operations/Symbolication/FIRCLSThreadArrayOperation.m; sourceTree = ""; }; - 62FF95AAD4006DE4F2539FDF389BBE8D /* RLMValue.mm */ = {isa = PBXFileReference; includeInIndex = 1; name = RLMValue.mm; path = Realm/RLMValue.mm; sourceTree = ""; }; - 63BD50AD040F837155C1F5CD8F39CCE4 /* RLMRealmConfiguration.mm */ = {isa = PBXFileReference; includeInIndex = 1; name = RLMRealmConfiguration.mm; path = Realm/RLMRealmConfiguration.mm; sourceTree = ""; }; + 62FF95AAD4006DE4F2539FDF389BBE8D /* RLMValue.mm */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.cpp.objcpp; name = RLMValue.mm; path = Realm/RLMValue.mm; sourceTree = ""; }; + 63BD50AD040F837155C1F5CD8F39CCE4 /* RLMRealmConfiguration.mm */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.cpp.objcpp; name = RLMRealmConfiguration.mm; path = Realm/RLMRealmConfiguration.mm; sourceTree = ""; }; 641BF1C28B2FE8B2CE7356254D37F11F /* FBLPromise+Delay.h */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.h; name = "FBLPromise+Delay.h"; path = "Sources/FBLPromises/include/FBLPromise+Delay.h"; sourceTree = ""; }; 641C3C21E85ABDE3018EA02E0F3A2502 /* GTMSessionFetcher.release.xcconfig */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = text.xcconfig; path = GTMSessionFetcher.release.xcconfig; sourceTree = ""; }; 64222983E31C4E8D4DDB60B289FFE464 /* RLMObjectStore.h */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.h; name = RLMObjectStore.h; path = include/RLMObjectStore.h; sourceTree = ""; }; @@ -2739,9 +2741,9 @@ 65B3F3F7630C1EFEF8578D333BA77F53 /* FIRCLSAsyncOperation.m */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.objc; name = FIRCLSAsyncOperation.m; path = Crashlytics/Crashlytics/Operations/FIRCLSAsyncOperation.m; sourceTree = ""; }; 65DD555D521AA99B36B83765BA3D6386 /* ResponseSerialization.swift */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.swift; name = ResponseSerialization.swift; path = Source/ResponseSerialization.swift; sourceTree = ""; }; 65ED589EEEFEC981A6B625678B863C40 /* RolloutsStateSubscriber.swift */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.swift; name = RolloutsStateSubscriber.swift; path = FirebaseRemoteConfig/Interop/RolloutsStateSubscriber.swift; sourceTree = ""; }; - 660761F09DD98D036E0EE3C6C8C43D54 /* FIRCLSException.mm */ = {isa = PBXFileReference; includeInIndex = 1; name = FIRCLSException.mm; path = Crashlytics/Crashlytics/Handlers/FIRCLSException.mm; sourceTree = ""; }; + 660761F09DD98D036E0EE3C6C8C43D54 /* FIRCLSException.mm */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.cpp.objcpp; name = FIRCLSException.mm; path = Crashlytics/Crashlytics/Handlers/FIRCLSException.mm; sourceTree = ""; }; 667DC241BB9E1CCF525B936081D099D8 /* ApplicationInfo.swift */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.swift; name = ApplicationInfo.swift; path = FirebaseSessions/Sources/ApplicationInfo.swift; sourceTree = ""; }; - 66CB6FA6EF9E4687C78E856C39AB15D4 /* PrivacyInfo.xcprivacy */ = {isa = PBXFileReference; includeInIndex = 1; name = PrivacyInfo.xcprivacy; path = Sources/FBLPromises/Resources/PrivacyInfo.xcprivacy; sourceTree = ""; }; + 66CB6FA6EF9E4687C78E856C39AB15D4 /* PrivacyInfo.xcprivacy */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = text.xml; name = PrivacyInfo.xcprivacy; path = Sources/FBLPromises/Resources/PrivacyInfo.xcprivacy; sourceTree = ""; }; 673B3D1AF8E58A2ABEEB781E6ED96950 /* FIRInstallationsSingleOperationPromiseCache.m */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.objc; name = FIRInstallationsSingleOperationPromiseCache.m; path = FirebaseInstallations/Source/Library/InstallationsIDController/FIRInstallationsSingleOperationPromiseCache.m; sourceTree = ""; }; 673BDC030CF742CF99BE36B322A8EAC9 /* GIDMDMPasscodeState.h */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.h; name = GIDMDMPasscodeState.h; path = GoogleSignIn/Sources/GIDMDMPasscodeState.h; sourceTree = ""; }; 6755B9C41B026263032E4BF7D35E2165 /* HTTPMethod.swift */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.swift; name = HTTPMethod.swift; path = Source/HTTPMethod.swift; sourceTree = ""; }; @@ -2749,17 +2751,17 @@ 67C4107DB236E6DF5FEE1E798FD68EF8 /* NSTextAttachment+Kingfisher.swift */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.swift; name = "NSTextAttachment+Kingfisher.swift"; path = "Sources/Extensions/NSTextAttachment+Kingfisher.swift"; sourceTree = ""; }; 67D9D034B9E717969E1DC65C0A37F0A4 /* FirebaseRemoteConfigInterop-dummy.m */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.objc; path = "FirebaseRemoteConfigInterop-dummy.m"; sourceTree = ""; }; 683BD15C075C483E37ACBA404A19E121 /* Realm.debug.xcconfig */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = text.xcconfig; path = Realm.debug.xcconfig; sourceTree = ""; }; - 683DE4762220E2D281522EAD532DB67E /* external_prequest_context.nanopb.c */ = {isa = PBXFileReference; includeInIndex = 1; name = external_prequest_context.nanopb.c; path = GoogleDataTransport/GDTCCTLibrary/Protogen/nanopb/external_prequest_context.nanopb.c; sourceTree = ""; }; + 683DE4762220E2D281522EAD532DB67E /* external_prequest_context.nanopb.c */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.c; name = external_prequest_context.nanopb.c; path = GoogleDataTransport/GDTCCTLibrary/Protogen/nanopb/external_prequest_context.nanopb.c; sourceTree = ""; }; 687BBFA83DF6A70DE9BEDF98EEE5AD1B /* FIRAppInternal.h */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.h; name = FIRAppInternal.h; path = FirebaseCore/Extension/FIRAppInternal.h; sourceTree = ""; }; 68EA88842D008C15ABAB0E51C8BB24EE /* Resource.swift */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.swift; name = Resource.swift; path = Sources/General/ImageSource/Resource.swift; sourceTree = ""; }; - 68EB68633DDEDF7CD1790D74A0AE7D8E /* RLMCollection.mm */ = {isa = PBXFileReference; includeInIndex = 1; name = RLMCollection.mm; path = Realm/RLMCollection.mm; sourceTree = ""; }; + 68EB68633DDEDF7CD1790D74A0AE7D8E /* RLMCollection.mm */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.cpp.objcpp; name = RLMCollection.mm; path = Realm/RLMCollection.mm; sourceTree = ""; }; 695117E23EB03AF540629EC5C9E9294E /* AuthenticationInterceptor.swift */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.swift; name = AuthenticationInterceptor.swift; path = Source/AuthenticationInterceptor.swift; sourceTree = ""; }; 6961F4B1DAF156F080498FCAE82D548F /* FIRCLSOperation.h */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.h; name = FIRCLSOperation.h; path = Crashlytics/Shared/FIRCLSOperation/FIRCLSOperation.h; sourceTree = ""; }; - 69B02FF3280A026BD651B36A10DD724A /* RLMFindOneAndModifyOptions.mm */ = {isa = PBXFileReference; includeInIndex = 1; name = RLMFindOneAndModifyOptions.mm; path = Realm/RLMFindOneAndModifyOptions.mm; sourceTree = ""; }; + 69B02FF3280A026BD651B36A10DD724A /* RLMFindOneAndModifyOptions.mm */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.cpp.objcpp; name = RLMFindOneAndModifyOptions.mm; path = Realm/RLMFindOneAndModifyOptions.mm; sourceTree = ""; }; 69E211D9915DC7CDD8F98F965F478227 /* FirebaseCrashlytics.modulemap */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.module; path = FirebaseCrashlytics.modulemap; sourceTree = ""; }; 69FAEC898DB418C3F03FE26CC86087B2 /* FIRCLSDataCollectionToken.m */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.objc; name = FIRCLSDataCollectionToken.m; path = Crashlytics/Crashlytics/DataCollection/FIRCLSDataCollectionToken.m; sourceTree = ""; }; 6A5498B096DDF04346D1459970D6D263 /* TMHorizontalBarLayout+Separator.swift */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.swift; name = "TMHorizontalBarLayout+Separator.swift"; path = "Sources/Tabman/Bar/BarLayout/Types/TMHorizontalBarLayout+Separator.swift"; sourceTree = ""; }; - 6A615C81CF9A6B2E7AFA8F3AF20BE668 /* RLMManagedDictionary.mm */ = {isa = PBXFileReference; includeInIndex = 1; name = RLMManagedDictionary.mm; path = Realm/RLMManagedDictionary.mm; sourceTree = ""; }; + 6A615C81CF9A6B2E7AFA8F3AF20BE668 /* RLMManagedDictionary.mm */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.cpp.objcpp; name = RLMManagedDictionary.mm; path = Realm/RLMManagedDictionary.mm; sourceTree = ""; }; 6B16C2FFF411DB9480FD2C46BDAF508A /* GDTCORReachability_Private.h */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.h; name = GDTCORReachability_Private.h; path = GoogleDataTransport/GDTCORLibrary/Private/GDTCORReachability_Private.h; sourceTree = ""; }; 6B2858030E7AED5EAC7916723B951AED /* RLMDictionary_Private.h */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.h; name = RLMDictionary_Private.h; path = include/RLMDictionary_Private.h; sourceTree = ""; }; 6B4756DA7CFA9CB90D587F0D3ADB3B6C /* Tabman.h */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.h; name = Tabman.h; path = Sources/Tabman/Tabman.h; sourceTree = ""; }; @@ -2769,11 +2771,11 @@ 6C2936F34B3979B42A84234371512322 /* FIRCLSContext.h */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.h; name = FIRCLSContext.h; path = Crashlytics/Crashlytics/Components/FIRCLSContext.h; sourceTree = ""; }; 6C2BA7D8DC9312EB034CBBAE4D60A4AD /* LinkingObjects.swift */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.swift; name = LinkingObjects.swift; path = RealmSwift/LinkingObjects.swift; sourceTree = ""; }; 6C4B72881CD091C837F701DDC605E4F3 /* Promise+Recover.swift */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.swift; name = "Promise+Recover.swift"; path = "Sources/Promises/Promise+Recover.swift"; sourceTree = ""; }; - 6C5E184AF9CDCF92FA1648238F40FD08 /* RLMRealmUtil.mm */ = {isa = PBXFileReference; includeInIndex = 1; name = RLMRealmUtil.mm; path = Realm/RLMRealmUtil.mm; sourceTree = ""; }; - 6CAF48A3F91722C8FDACC5B65D92F53A /* Pods-pochak */ = {isa = PBXFileReference; explicitFileType = wrapper.framework; includeInIndex = 0; name = "Pods-pochak"; path = Pods_pochak.framework; sourceTree = BUILT_PRODUCTS_DIR; }; + 6C5E184AF9CDCF92FA1648238F40FD08 /* RLMRealmUtil.mm */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.cpp.objcpp; name = RLMRealmUtil.mm; path = Realm/RLMRealmUtil.mm; sourceTree = ""; }; + 6CAF48A3F91722C8FDACC5B65D92F53A /* Pods_pochak.framework */ = {isa = PBXFileReference; explicitFileType = wrapper.framework; includeInIndex = 0; path = Pods_pochak.framework; sourceTree = BUILT_PRODUCTS_DIR; }; 6CED15E1C5DD57736BF9E575D62AAB22 /* HeartbeatsBundle.swift */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.swift; name = HeartbeatsBundle.swift; path = FirebaseCore/Internal/Sources/HeartbeatLogging/HeartbeatsBundle.swift; sourceTree = ""; }; 6D2A56A8CED7C9EB4BF1F425780DB234 /* PageboyViewController+RelativeCurrentPosition.swift */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.swift; name = "PageboyViewController+RelativeCurrentPosition.swift"; path = "Sources/Tabman/Extensions/PageboyViewController+RelativeCurrentPosition.swift"; sourceTree = ""; }; - 6D315C779143F0938AF8B263410F78AA /* RLMEvent.mm */ = {isa = PBXFileReference; includeInIndex = 1; name = RLMEvent.mm; path = Realm/RLMEvent.mm; sourceTree = ""; }; + 6D315C779143F0938AF8B263410F78AA /* RLMEvent.mm */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.cpp.objcpp; name = RLMEvent.mm; path = Realm/RLMEvent.mm; sourceTree = ""; }; 6D35CA478003E2CD09473BDDA3E3E6BB /* AppAuth-prefix.pch */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.h; path = "AppAuth-prefix.pch"; sourceTree = ""; }; 6D3FB984273854A56A3753FBC56911FE /* FIRComponentContainer.h */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.h; name = FIRComponentContainer.h; path = FirebaseCore/Extension/FIRComponentContainer.h; sourceTree = ""; }; 6D61EF31FA00891DF2F1FCDAFE0D2E1F /* FIRLibrary.h */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.h; name = FIRLibrary.h; path = FirebaseCore/Extension/FIRLibrary.h; sourceTree = ""; }; @@ -2782,7 +2784,7 @@ 6E2D0321B910617D02C8DB3E57974133 /* InsetCalculations.swift */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.swift; name = InsetCalculations.swift; path = Sources/Tabman/AutoInsetter/InsetCalculator/InsetCalculations.swift; sourceTree = ""; }; 6E3900822B4849871A061BDF18925486 /* FIRDependency.h */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.h; name = FIRDependency.h; path = FirebaseCore/Extension/FIRDependency.h; sourceTree = ""; }; 6E41FA4B5FD93CCF974A195D26612491 /* OIDRegistrationRequest.h */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.h; name = OIDRegistrationRequest.h; path = Source/AppAuthCore/OIDRegistrationRequest.h; sourceTree = ""; }; - 6E4EDE882B52CAC2ACEDE13ACA36EC47 /* PrivacyInfo.xcprivacy */ = {isa = PBXFileReference; includeInIndex = 1; name = PrivacyInfo.xcprivacy; path = FirebaseInstallations/Source/Library/Resources/PrivacyInfo.xcprivacy; sourceTree = ""; }; + 6E4EDE882B52CAC2ACEDE13ACA36EC47 /* PrivacyInfo.xcprivacy */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = text.xml; name = PrivacyInfo.xcprivacy; path = FirebaseInstallations/Source/Library/Resources/PrivacyInfo.xcprivacy; sourceTree = ""; }; 6E5850C2FC100607A967CB1781C7EB9C /* PromisesObjC.release.xcconfig */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = text.xcconfig; path = PromisesObjC.release.xcconfig; sourceTree = ""; }; 6EA01D12CE38FF4EE1EAAEA367EF378F /* GIDAppAuthFetcherAuthorizationWithEMMSupport.h */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.h; name = GIDAppAuthFetcherAuthorizationWithEMMSupport.h; path = GoogleSignIn/Sources/GIDAppAuthFetcherAuthorizationWithEMMSupport.h; sourceTree = ""; }; 6EA291CB8CA110CCC55E0690751A3F57 /* RealmCollection.swift */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.swift; name = RealmCollection.swift; path = RealmSwift/RealmCollection.swift; sourceTree = ""; }; @@ -2790,17 +2792,17 @@ 6EEC5BA9AF92ED960C9170D493AC5154 /* FIRCLSLogger.m */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.objc; name = FIRCLSLogger.m; path = Crashlytics/Crashlytics/Helpers/FIRCLSLogger.m; sourceTree = ""; }; 6F0110E10F96EBA59400B84FB6EA2475 /* Accelerate.framework */ = {isa = PBXFileReference; lastKnownFileType = wrapper.framework; name = Accelerate.framework; path = Platforms/iPhoneOS.platform/Developer/SDKs/iPhoneOS14.0.sdk/System/Library/Frameworks/Accelerate.framework; sourceTree = DEVELOPER_DIR; }; 6F5E6DDD046E8D17EF6E8A6B35DF2D0B /* Persistable.swift */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.swift; name = Persistable.swift; path = RealmSwift/Impl/Persistable.swift; sourceTree = ""; }; - 6FA6CC8223A17E0CF64570D6557304F1 /* RLMSectionedResults.mm */ = {isa = PBXFileReference; includeInIndex = 1; name = RLMSectionedResults.mm; path = Realm/RLMSectionedResults.mm; sourceTree = ""; }; + 6FA6CC8223A17E0CF64570D6557304F1 /* RLMSectionedResults.mm */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.cpp.objcpp; name = RLMSectionedResults.mm; path = Realm/RLMSectionedResults.mm; sourceTree = ""; }; 6FB9E1A4B6ACECEA7DECC956A03C3605 /* FIRHeartbeatLogger.h */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.h; name = FIRHeartbeatLogger.h; path = FirebaseCore/Extension/FIRHeartbeatLogger.h; sourceTree = ""; }; 6FCE138D81A99410D42F5D49EF0F4832 /* GULHeartbeatDateStorage.h */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.h; name = GULHeartbeatDateStorage.h; path = GoogleUtilities/Environment/Public/GoogleUtilities/GULHeartbeatDateStorage.h; sourceTree = ""; }; - 6FD122EA0AB9AB2A8FFA5F676C795DF0 /* GTMAppAuth */ = {isa = PBXFileReference; explicitFileType = wrapper.framework; includeInIndex = 0; name = GTMAppAuth; path = GTMAppAuth.framework; sourceTree = BUILT_PRODUCTS_DIR; }; + 6FD122EA0AB9AB2A8FFA5F676C795DF0 /* GTMAppAuth.framework */ = {isa = PBXFileReference; explicitFileType = wrapper.framework; includeInIndex = 0; path = GTMAppAuth.framework; sourceTree = BUILT_PRODUCTS_DIR; }; 6FEF140948CC2EDBD90AD533DC507A4A /* Pageboy-umbrella.h */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.h; path = "Pageboy-umbrella.h"; sourceTree = ""; }; 701A948F66D611615E448A526CAED5B8 /* GIDMDMPasscodeState.m */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.objc; name = GIDMDMPasscodeState.m; path = GoogleSignIn/Sources/GIDMDMPasscodeState.m; sourceTree = ""; }; 701AA5076CCC31E1FB3442B4EF442AE4 /* UIPageViewController+ScrollView.swift */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.swift; name = "UIPageViewController+ScrollView.swift"; path = "Sources/Pageboy/Utilities/Extensions/UIPageViewController+ScrollView.swift"; sourceTree = ""; }; 705D12EEF3A3E8D31A70FBAEA3D600ED /* GIDEMMSupport.h */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.h; name = GIDEMMSupport.h; path = GoogleSignIn/Sources/GIDEMMSupport.h; sourceTree = ""; }; - 7074F5320A0E14173F33243C7D382260 /* FIRCLSUnwind_x86.c */ = {isa = PBXFileReference; includeInIndex = 1; name = FIRCLSUnwind_x86.c; path = Crashlytics/Crashlytics/Unwind/FIRCLSUnwind_x86.c; sourceTree = ""; }; + 7074F5320A0E14173F33243C7D382260 /* FIRCLSUnwind_x86.c */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.c; name = FIRCLSUnwind_x86.c; path = Crashlytics/Crashlytics/Unwind/FIRCLSUnwind_x86.c; sourceTree = ""; }; 70C86A98700F627BC5CD29B66E618A7A /* FirebaseCrashlytics-umbrella.h */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.h; path = "FirebaseCrashlytics-umbrella.h"; sourceTree = ""; }; - 71E272D102557A0F499FD4B6C02EEDCA /* ar.lproj */ = {isa = PBXFileReference; includeInIndex = 1; name = ar.lproj; path = GoogleSignIn/Sources/Strings/ar.lproj; sourceTree = ""; }; + 71E272D102557A0F499FD4B6C02EEDCA /* ar.lproj */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = folder; name = ar.lproj; path = GoogleSignIn/Sources/Strings/ar.lproj; sourceTree = ""; }; 71E82491EA032336469884436E6FBFCE /* GIDEMMSupport.m */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.objc; name = GIDEMMSupport.m; path = GoogleSignIn/Sources/GIDEMMSupport.m; sourceTree = ""; }; 71EB11C5FE4E339C6EBABB7778A8DB7D /* Property.swift */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.swift; name = Property.swift; path = RealmSwift/Property.swift; sourceTree = ""; }; 72026CFB7F8D2085EE9EC636DE724C49 /* GULKeychainStorage.m */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.objc; name = GULKeychainStorage.m; path = GoogleUtilities/Environment/SecureStorage/GULKeychainStorage.m; sourceTree = ""; }; @@ -2809,9 +2811,9 @@ 72576440DD0A1790F43501092C12808E /* SessionsSettings.swift */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.swift; name = SessionsSettings.swift; path = FirebaseSessions/Sources/Settings/SessionsSettings.swift; sourceTree = ""; }; 7269663F9B816738D870518CAF6A4AB4 /* GULNetwork.h */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.h; name = GULNetwork.h; path = GoogleUtilities/Network/Public/GoogleUtilities/GULNetwork.h; sourceTree = ""; }; 7277AE1C32F3D75AD1740960A8484332 /* GDTCORStorageMetadata.m */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.objc; name = GDTCORStorageMetadata.m; path = GoogleDataTransport/GDTCORLibrary/GDTCORStorageMetadata.m; sourceTree = ""; }; - 727F33921ECC2E46ADE0FC341B1CB69D /* RLMManagedArray.mm */ = {isa = PBXFileReference; includeInIndex = 1; name = RLMManagedArray.mm; path = Realm/RLMManagedArray.mm; sourceTree = ""; }; + 727F33921ECC2E46ADE0FC341B1CB69D /* RLMManagedArray.mm */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.cpp.objcpp; name = RLMManagedArray.mm; path = Realm/RLMManagedArray.mm; sourceTree = ""; }; 72A4DBC51E34396D463A2CB440D60751 /* FIRCLSAsyncOperation_Private.h */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.h; name = FIRCLSAsyncOperation_Private.h; path = Crashlytics/Crashlytics/Operations/FIRCLSAsyncOperation_Private.h; sourceTree = ""; }; - 72B3FD93FE501F8DB2C9588132B26C61 /* it.lproj */ = {isa = PBXFileReference; includeInIndex = 1; name = it.lproj; path = GoogleSignIn/Sources/Strings/it.lproj; sourceTree = ""; }; + 72B3FD93FE501F8DB2C9588132B26C61 /* it.lproj */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = folder; name = it.lproj; path = GoogleSignIn/Sources/Strings/it.lproj; sourceTree = ""; }; 7310529C901E69D3C069C1B130C09CB5 /* OIDAuthStateChangeDelegate.h */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.h; name = OIDAuthStateChangeDelegate.h; path = Source/AppAuthCore/OIDAuthStateChangeDelegate.h; sourceTree = ""; }; 732018BB59A5B56970FB51642D38F8B3 /* FIRCLSAllocate.h */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.h; name = FIRCLSAllocate.h; path = Crashlytics/Crashlytics/Helpers/FIRCLSAllocate.h; sourceTree = ""; }; 736EFE4406A7A44CC95121B5CA46530F /* FIRComponent.h */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.h; name = FIRComponent.h; path = FirebaseCore/Extension/FIRComponent.h; sourceTree = ""; }; @@ -2821,7 +2823,7 @@ 742F7BBCEF5C49C0D2FB9B964886AAD6 /* GDTCORProductData.h */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.h; name = GDTCORProductData.h; path = GoogleDataTransport/GDTCORLibrary/Public/GoogleDataTransport/GDTCORProductData.h; sourceTree = ""; }; 7441CDDCCF679C83337AF3926DFCF86C /* FirebaseCoreExtension.release.xcconfig */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = text.xcconfig; path = FirebaseCoreExtension.release.xcconfig; sourceTree = ""; }; 744F897CF5FBADB2B19F12E5AC4D076B /* OIDEndSessionResponse.h */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.h; name = OIDEndSessionResponse.h; path = Source/AppAuthCore/OIDEndSessionResponse.h; sourceTree = ""; }; - 74579ABD287740631A5466A266BC794A /* RLMProviderClient.mm */ = {isa = PBXFileReference; includeInIndex = 1; name = RLMProviderClient.mm; path = Realm/RLMProviderClient.mm; sourceTree = ""; }; + 74579ABD287740631A5466A266BC794A /* RLMProviderClient.mm */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.cpp.objcpp; name = RLMProviderClient.mm; path = Realm/RLMProviderClient.mm; sourceTree = ""; }; 74D01F0D4AEDC25C2E1DC828139A6D57 /* URLConvertible+URLRequestConvertible.swift */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.swift; name = "URLConvertible+URLRequestConvertible.swift"; path = "Source/URLConvertible+URLRequestConvertible.swift"; sourceTree = ""; }; 74D43D3322E11C1EC8D10A3D555DBDBA /* GULNetworkConstants.h */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.h; name = GULNetworkConstants.h; path = GoogleUtilities/Network/Public/GoogleUtilities/GULNetworkConstants.h; sourceTree = ""; }; 74DEDC24184332D362DBCA7999339C61 /* RequestTaskMap.swift */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.swift; name = RequestTaskMap.swift; path = Source/RequestTaskMap.swift; sourceTree = ""; }; @@ -2834,24 +2836,24 @@ 7681F5C50C0A05DB64AACFEC988729DA /* OIDEndSessionResponse.m */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.objc; name = OIDEndSessionResponse.m; path = Source/AppAuthCore/OIDEndSessionResponse.m; sourceTree = ""; }; 76F8AE4EEE5C49BC1E22507B2E2726D5 /* ImageFormat.swift */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.swift; name = ImageFormat.swift; path = Sources/Image/ImageFormat.swift; sourceTree = ""; }; 7762E4841E9ACB8E83B309268A1015E4 /* GULAppDelegateSwizzler.m */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.objc; name = GULAppDelegateSwizzler.m; path = GoogleUtilities/AppDelegateSwizzler/GULAppDelegateSwizzler.m; sourceTree = ""; }; - 776C346D761D1A578AA679BFB6ABC3EA /* RLMThreadSafeReference.mm */ = {isa = PBXFileReference; includeInIndex = 1; name = RLMThreadSafeReference.mm; path = Realm/RLMThreadSafeReference.mm; sourceTree = ""; }; + 776C346D761D1A578AA679BFB6ABC3EA /* RLMThreadSafeReference.mm */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.cpp.objcpp; name = RLMThreadSafeReference.mm; path = Realm/RLMThreadSafeReference.mm; sourceTree = ""; }; 7773FC5D88EC91AF80BD1B41341A613D /* FIRCLSHandler.m */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.objc; name = FIRCLSHandler.m; path = Crashlytics/Crashlytics/Handlers/FIRCLSHandler.m; sourceTree = ""; }; 77B85DB65C2065C5CB057211F4964992 /* RLMMigration.h */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.h; name = RLMMigration.h; path = include/RLMMigration.h; sourceTree = ""; }; 77FCF0876C50F46F4BD44E5188044793 /* Storage.swift */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.swift; name = Storage.swift; path = Sources/Cache/Storage.swift; sourceTree = ""; }; - 782BC2EE54CC089EEAA5A74AFF416961 /* RLMSchema.mm */ = {isa = PBXFileReference; includeInIndex = 1; name = RLMSchema.mm; path = Realm/RLMSchema.mm; sourceTree = ""; }; + 782BC2EE54CC089EEAA5A74AFF416961 /* RLMSchema.mm */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.cpp.objcpp; name = RLMSchema.mm; path = Realm/RLMSchema.mm; sourceTree = ""; }; 78AC6C63CEB7BAB96146C59BDE1EDD00 /* FirebaseCore.release.xcconfig */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = text.xcconfig; path = FirebaseCore.release.xcconfig; sourceTree = ""; }; 78F350947E3078B3D8647FB4F88F917F /* FIRInstallationsStore.m */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.objc; name = FIRInstallationsStore.m; path = FirebaseInstallations/Source/Library/InstallationsStore/FIRInstallationsStore.m; sourceTree = ""; }; 78F623CE5855D78CCDEC1429F314D9AC /* ResourceBundle-FirebaseCrashlytics_Privacy-FirebaseCrashlytics-Info.plist */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = text.plist.xml; path = "ResourceBundle-FirebaseCrashlytics_Privacy-FirebaseCrashlytics-Info.plist"; sourceTree = ""; }; 7916D354B67BB7AD92001F47158219F3 /* RLMCollection_Private.h */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.h; name = RLMCollection_Private.h; path = include/RLMCollection_Private.h; sourceTree = ""; }; 79788B4EF842BB8C91B0D962641C7B97 /* FirebaseCore-Info.plist */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = text.plist.xml; path = "FirebaseCore-Info.plist"; sourceTree = ""; }; 79CC9F473CBC11C491785342832404CC /* Decimal128.swift */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.swift; name = Decimal128.swift; path = RealmSwift/Decimal128.swift; sourceTree = ""; }; - 79DCA66867589B3175FC1D6E8BE48909 /* FIRCLSInternalLogging.c */ = {isa = PBXFileReference; includeInIndex = 1; name = FIRCLSInternalLogging.c; path = Crashlytics/Crashlytics/Helpers/FIRCLSInternalLogging.c; sourceTree = ""; }; - 79F6BDD004101D6D4CF97F2AAC68FDC1 /* RLMEmailPasswordAuth.mm */ = {isa = PBXFileReference; includeInIndex = 1; name = RLMEmailPasswordAuth.mm; path = Realm/RLMEmailPasswordAuth.mm; sourceTree = ""; }; - 7A05562DCBC567DE349EF15787A00F29 /* RLMAsymmetricObject.mm */ = {isa = PBXFileReference; includeInIndex = 1; name = RLMAsymmetricObject.mm; path = Realm/RLMAsymmetricObject.mm; sourceTree = ""; }; + 79DCA66867589B3175FC1D6E8BE48909 /* FIRCLSInternalLogging.c */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.c; name = FIRCLSInternalLogging.c; path = Crashlytics/Crashlytics/Helpers/FIRCLSInternalLogging.c; sourceTree = ""; }; + 79F6BDD004101D6D4CF97F2AAC68FDC1 /* RLMEmailPasswordAuth.mm */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.cpp.objcpp; name = RLMEmailPasswordAuth.mm; path = Realm/RLMEmailPasswordAuth.mm; sourceTree = ""; }; + 7A05562DCBC567DE349EF15787A00F29 /* RLMAsymmetricObject.mm */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.cpp.objcpp; name = RLMAsymmetricObject.mm; path = Realm/RLMAsymmetricObject.mm; sourceTree = ""; }; 7A96EBB6F0766DDC531B3CFBC884081A /* CollectionAccess.swift */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.swift; name = CollectionAccess.swift; path = RealmSwift/Impl/CollectionAccess.swift; sourceTree = ""; }; 7AA9514EB845D76BAE70B8D95D9C0461 /* FirebaseCoreExtension-Info.plist */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = text.plist.xml; path = "FirebaseCoreExtension-Info.plist"; sourceTree = ""; }; - 7ACBED25A85146BF28CE5906DA7E6414 /* FIRCLSUnwind_arm.c */ = {isa = PBXFileReference; includeInIndex = 1; name = FIRCLSUnwind_arm.c; path = Crashlytics/Crashlytics/Unwind/FIRCLSUnwind_arm.c; sourceTree = ""; }; - 7B1AAE16021295AAE6261A13007D3CCB /* pl.lproj */ = {isa = PBXFileReference; includeInIndex = 1; name = pl.lproj; path = GoogleSignIn/Sources/Strings/pl.lproj; sourceTree = ""; }; + 7ACBED25A85146BF28CE5906DA7E6414 /* FIRCLSUnwind_arm.c */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.c; name = FIRCLSUnwind_arm.c; path = Crashlytics/Crashlytics/Unwind/FIRCLSUnwind_arm.c; sourceTree = ""; }; + 7B1AAE16021295AAE6261A13007D3CCB /* pl.lproj */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = folder; name = pl.lproj; path = GoogleSignIn/Sources/Strings/pl.lproj; sourceTree = ""; }; 7B82C520EDA653D923DAF28B816F3B70 /* GULSceneDelegateSwizzler.m */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.objc; name = GULSceneDelegateSwizzler.m; path = GoogleUtilities/AppDelegateSwizzler/GULSceneDelegateSwizzler.m; sourceTree = ""; }; 7BD6B573E4B59DB22DDB3239F2FF4B7D /* FIRExceptionModel.h */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.h; name = FIRExceptionModel.h; path = Crashlytics/Crashlytics/Public/FirebaseCrashlytics/FIRExceptionModel.h; sourceTree = ""; }; 7C10CD034923FE760536E467744BC04A /* GTMSessionFetcher-umbrella.h */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.h; path = "GTMSessionFetcher-umbrella.h"; sourceTree = ""; }; @@ -2873,15 +2875,15 @@ 7EED3E4A31035D3305D0142B1221E287 /* RLMBSON.h */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.h; name = RLMBSON.h; path = include/RLMBSON.h; sourceTree = ""; }; 7F37D66B9C6433F71683D87BFD70C021 /* GestureScrollView.swift */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.swift; name = GestureScrollView.swift; path = Sources/Tabman/Bar/Generic/GestureScrollView.swift; sourceTree = ""; }; 7F447CEC3372F48005DDD8005B865A13 /* RLMFindOptions.h */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.h; name = RLMFindOptions.h; path = include/RLMFindOptions.h; sourceTree = ""; }; - 7F5D35C66CD82E96A3EB5477AAED1E1F /* tr.lproj */ = {isa = PBXFileReference; includeInIndex = 1; name = tr.lproj; path = GoogleSignIn/Sources/Strings/tr.lproj; sourceTree = ""; }; + 7F5D35C66CD82E96A3EB5477AAED1E1F /* tr.lproj */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = folder; name = tr.lproj; path = GoogleSignIn/Sources/Strings/tr.lproj; sourceTree = ""; }; 7F611EDCB7C21C14371DAEA843BD3403 /* ImageTransition.swift */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.swift; name = ImageTransition.swift; path = Sources/Image/ImageTransition.swift; sourceTree = ""; }; - 7FA92CD658F758C192F3ACED6F1D363B /* he.lproj */ = {isa = PBXFileReference; includeInIndex = 1; name = he.lproj; path = GoogleSignIn/Sources/Strings/he.lproj; sourceTree = ""; }; + 7FA92CD658F758C192F3ACED6F1D363B /* he.lproj */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = folder; name = he.lproj; path = GoogleSignIn/Sources/Strings/he.lproj; sourceTree = ""; }; 7FD0AAA79F428770577BA3665E154C19 /* GDTCORConsoleLogger.m */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.objc; name = GDTCORConsoleLogger.m; path = GoogleDataTransport/GDTCORLibrary/GDTCORConsoleLogger.m; sourceTree = ""; }; 8020905100A9446DD619BABFB079FE04 /* SchemaDiscovery.swift */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.swift; name = SchemaDiscovery.swift; path = RealmSwift/Impl/SchemaDiscovery.swift; sourceTree = ""; }; 80BFE8D98AEAF9AF6A3E3C9BD7205ED7 /* FIRAnalyticsInteropListener.h */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.h; name = FIRAnalyticsInteropListener.h; path = Interop/Analytics/Public/FIRAnalyticsInteropListener.h; sourceTree = ""; }; 8154773AFCB42BFB3F9B3EF4E8A407CD /* GULSwizzler.m */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.objc; name = GULSwizzler.m; path = GoogleUtilities/MethodSwizzler/GULSwizzler.m; sourceTree = ""; }; 815E30045F0281243EF996FDE4E7F2B7 /* RemoteConfigInterop.swift */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.swift; name = RemoteConfigInterop.swift; path = FirebaseRemoteConfig/Interop/RemoteConfigInterop.swift; sourceTree = ""; }; - 8166B7CB8F286C5721F63BCE9AACF6EE /* RLMSyncSession.mm */ = {isa = PBXFileReference; includeInIndex = 1; name = RLMSyncSession.mm; path = Realm/RLMSyncSession.mm; sourceTree = ""; }; + 8166B7CB8F286C5721F63BCE9AACF6EE /* RLMSyncSession.mm */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.cpp.objcpp; name = RLMSyncSession.mm; path = Realm/RLMSyncSession.mm; sourceTree = ""; }; 81E9E6B378F74F161E21A77BC2C1F194 /* FIRComponentType.h */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.h; name = FIRComponentType.h; path = FirebaseCore/Extension/FIRComponentType.h; sourceTree = ""; }; 821CA1E540A3DE54C2E479F362F1AE48 /* Foundation.framework */ = {isa = PBXFileReference; lastKnownFileType = wrapper.framework; name = Foundation.framework; path = Platforms/iPhoneOS.platform/Developer/SDKs/iPhoneOS14.0.sdk/System/Library/Frameworks/Foundation.framework; sourceTree = DEVELOPER_DIR; }; 825023221C26622A4174D7227D534FC2 /* StorageFactory.swift */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.swift; name = StorageFactory.swift; path = FirebaseCore/Internal/Sources/HeartbeatLogging/StorageFactory.swift; sourceTree = ""; }; @@ -2895,22 +2897,22 @@ 83A7144D4C1ED4F3CC0557E4145EE586 /* GULNetworkConstants.m */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.objc; name = GULNetworkConstants.m; path = GoogleUtilities/Network/GULNetworkConstants.m; sourceTree = ""; }; 83B2148C1820CCC0B4B7A9DE082BD609 /* ParameterEncoding.swift */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.swift; name = ParameterEncoding.swift; path = Source/ParameterEncoding.swift; sourceTree = ""; }; 83DF2247C1E60D7352AC3F305BB4857C /* Realm.h */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.h; name = Realm.h; path = include/Realm.h; sourceTree = ""; }; - 83F5CCB22EE126A829F2A8820798DC8D /* FirebaseSessions */ = {isa = PBXFileReference; explicitFileType = wrapper.framework; includeInIndex = 0; name = FirebaseSessions; path = FirebaseSessions.framework; sourceTree = BUILT_PRODUCTS_DIR; }; - 84754CE45676593DFB7E6D58EB8623CB /* GoogleSignInSwiftSupport */ = {isa = PBXFileReference; explicitFileType = wrapper.framework; includeInIndex = 0; name = GoogleSignInSwiftSupport; path = GoogleSignInSwift.framework; sourceTree = BUILT_PRODUCTS_DIR; }; - 847CB70AB5256F206448A760219E8901 /* RLMProperty.mm */ = {isa = PBXFileReference; includeInIndex = 1; name = RLMProperty.mm; path = Realm/RLMProperty.mm; sourceTree = ""; }; + 83F5CCB22EE126A829F2A8820798DC8D /* FirebaseSessions.framework */ = {isa = PBXFileReference; explicitFileType = wrapper.framework; includeInIndex = 0; path = FirebaseSessions.framework; sourceTree = BUILT_PRODUCTS_DIR; }; + 84754CE45676593DFB7E6D58EB8623CB /* GoogleSignInSwift.framework */ = {isa = PBXFileReference; explicitFileType = wrapper.framework; includeInIndex = 0; path = GoogleSignInSwift.framework; sourceTree = BUILT_PRODUCTS_DIR; }; + 847CB70AB5256F206448A760219E8901 /* RLMProperty.mm */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.cpp.objcpp; name = RLMProperty.mm; path = Realm/RLMProperty.mm; sourceTree = ""; }; 848A640BFFB4B8B8D5466520A2C1C1ED /* NSBundle+GID3PAdditions.h */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.h; name = "NSBundle+GID3PAdditions.h"; path = "GoogleSignIn/Sources/NSBundle+GID3PAdditions.h"; sourceTree = ""; }; 84F1A52109ECA1A909C66E43BD06B394 /* BSON.swift */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.swift; name = BSON.swift; path = RealmSwift/BSON.swift; sourceTree = ""; }; 850A947B7DCF5E9DD7967F852A6C7E9D /* WeakContainer.swift */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.swift; name = WeakContainer.swift; path = FirebaseCore/Internal/Sources/HeartbeatLogging/WeakContainer.swift; sourceTree = ""; }; - 856B5CD56F194FAD26EA91620B66D614 /* GoogleDataTransport */ = {isa = PBXFileReference; explicitFileType = wrapper.framework; includeInIndex = 0; name = GoogleDataTransport; path = GoogleDataTransport.framework; sourceTree = BUILT_PRODUCTS_DIR; }; + 856B5CD56F194FAD26EA91620B66D614 /* GoogleDataTransport.framework */ = {isa = PBXFileReference; explicitFileType = wrapper.framework; includeInIndex = 0; path = GoogleDataTransport.framework; sourceTree = BUILT_PRODUCTS_DIR; }; 8596CAE27EB1AE827433B7C20E31DFEC /* FirebaseCoreInternal.release.xcconfig */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = text.xcconfig; path = FirebaseCoreInternal.release.xcconfig; sourceTree = ""; }; - 859AE0302B28BD8AE67A780BFCAEE082 /* FirebaseCrashlytics-FirebaseCrashlytics_Privacy */ = {isa = PBXFileReference; explicitFileType = wrapper.cfbundle; includeInIndex = 0; name = "FirebaseCrashlytics-FirebaseCrashlytics_Privacy"; path = FirebaseCrashlytics_Privacy.bundle; sourceTree = BUILT_PRODUCTS_DIR; }; + 859AE0302B28BD8AE67A780BFCAEE082 /* FirebaseCrashlytics_Privacy.bundle */ = {isa = PBXFileReference; explicitFileType = wrapper.cfbundle; includeInIndex = 0; path = FirebaseCrashlytics_Privacy.bundle; sourceTree = BUILT_PRODUCTS_DIR; }; 859C83D193E97AB9D4272CC5367FDDFC /* PromisesSwift-Info.plist */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = text.plist.xml; path = "PromisesSwift-Info.plist"; sourceTree = ""; }; 85AE1B1428C17B4CF45A9D1C1AB1BB94 /* OIDResponseTypes.h */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.h; name = OIDResponseTypes.h; path = Source/AppAuthCore/OIDResponseTypes.h; sourceTree = ""; }; 85B45952F4E17520C1ECDA786FA3683E /* FIRSESNanoPBHelpers.h */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.h; name = FIRSESNanoPBHelpers.h; path = FirebaseSessions/SourcesObjC/NanoPB/FIRSESNanoPBHelpers.h; sourceTree = ""; }; 85E0890377A1B4682D04A7056C397D20 /* GTMOAuth2KeychainCompatibility.h */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.h; name = GTMOAuth2KeychainCompatibility.h; path = GTMAppAuth/Sources/Public/GTMAppAuth/GTMOAuth2KeychainCompatibility.h; sourceTree = ""; }; 85F9544CA721C2E29276674696ADB059 /* GDTCORPlatform.m */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.objc; name = GDTCORPlatform.m; path = GoogleDataTransport/GDTCORLibrary/GDTCORPlatform.m; sourceTree = ""; }; 8610AAD4A00B0B4A2A71B01CB4B8A727 /* AuthenticationChallengeResponsable.swift */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.swift; name = AuthenticationChallengeResponsable.swift; path = Sources/Networking/AuthenticationChallengeResponsable.swift; sourceTree = ""; }; - 86375444C196BA272DDBB8165BF64A15 /* FirebaseCrashlytics */ = {isa = PBXFileReference; explicitFileType = wrapper.framework; includeInIndex = 0; name = FirebaseCrashlytics; path = FirebaseCrashlytics.framework; sourceTree = BUILT_PRODUCTS_DIR; }; + 86375444C196BA272DDBB8165BF64A15 /* FirebaseCrashlytics.framework */ = {isa = PBXFileReference; explicitFileType = wrapper.framework; includeInIndex = 0; path = FirebaseCrashlytics.framework; sourceTree = BUILT_PRODUCTS_DIR; }; 86ABB582CEDFA6DCBE60B7142319DF5A /* Realm-Info.plist */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = text.plist.xml; path = "Realm-Info.plist"; sourceTree = ""; }; 86B2C06BE581210E65EEF54E9D373014 /* FIRCLSExecutionIdentifierModel.h */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.h; name = FIRCLSExecutionIdentifierModel.h; path = Crashlytics/Crashlytics/Models/FIRCLSExecutionIdentifierModel.h; sourceTree = ""; }; 86BBE28999642DFA90315D58454930D4 /* FIRInstallationsStoredItem.m */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.objc; name = FIRInstallationsStoredItem.m; path = FirebaseInstallations/Source/Library/InstallationsStore/FIRInstallationsStoredItem.m; sourceTree = ""; }; @@ -2925,7 +2927,7 @@ 89051E828DA018AE503C7C8AD6DDA719 /* PageboyViewControllerDataSource.swift */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.swift; name = PageboyViewControllerDataSource.swift; path = Sources/Pageboy/Protocols/PageboyViewControllerDataSource.swift; sourceTree = ""; }; 896EEA911D71D7CBCBED7325908D7BE1 /* FIRLibrary.h */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.h; name = FIRLibrary.h; path = FirebaseCore/Extension/FIRLibrary.h; sourceTree = ""; }; 898EB913FAE293932FA2B232C36DED41 /* SafariServices.framework */ = {isa = PBXFileReference; lastKnownFileType = wrapper.framework; name = SafariServices.framework; path = Platforms/iPhoneOS.platform/Developer/SDKs/iPhoneOS14.0.sdk/System/Library/Frameworks/SafariServices.framework; sourceTree = DEVELOPER_DIR; }; - 89AC2DE14BB410ABBBA21262976F9E89 /* RLMCredentials.mm */ = {isa = PBXFileReference; includeInIndex = 1; name = RLMCredentials.mm; path = Realm/RLMCredentials.mm; sourceTree = ""; }; + 89AC2DE14BB410ABBBA21262976F9E89 /* RLMCredentials.mm */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.cpp.objcpp; name = RLMCredentials.mm; path = Realm/RLMCredentials.mm; sourceTree = ""; }; 89D13CBBA0F6787330373C3662815167 /* GoogleSignInSwiftSupport.release.xcconfig */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = text.xcconfig; path = GoogleSignInSwiftSupport.release.xcconfig; sourceTree = ""; }; 8A0782E2CE8D8F28B12429DF5867C33E /* PageboyViewController+Transitioning.swift */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.swift; name = "PageboyViewController+Transitioning.swift"; path = "Sources/Pageboy/Transitioning/PageboyViewController+Transitioning.swift"; sourceTree = ""; }; 8A3EBC166DE6575394A6F55587AF2A64 /* OIDAuthState+IOS.h */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.h; name = "OIDAuthState+IOS.h"; path = "Source/AppAuth/iOS/OIDAuthState+IOS.h"; sourceTree = ""; }; @@ -2942,15 +2944,15 @@ 8B87DCAE4B606AE18D8F3D641A6A46CB /* RLMSchema.h */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.h; name = RLMSchema.h; path = include/RLMSchema.h; sourceTree = ""; }; 8B98CA44F1C5BA9B7750E51DE71FEF75 /* FirebaseInstallations.debug.xcconfig */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = text.xcconfig; path = FirebaseInstallations.debug.xcconfig; sourceTree = ""; }; 8BABDEB2BF7D1799405E29F12485C47E /* FIRDependency.h */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.h; name = FIRDependency.h; path = FirebaseCore/Extension/FIRDependency.h; sourceTree = ""; }; - 8BB937B1C0DFFCF92F41861C2BC54DDA /* FirebaseCore-FirebaseCore_Privacy */ = {isa = PBXFileReference; explicitFileType = wrapper.cfbundle; includeInIndex = 0; name = "FirebaseCore-FirebaseCore_Privacy"; path = FirebaseCore_Privacy.bundle; sourceTree = BUILT_PRODUCTS_DIR; }; + 8BB937B1C0DFFCF92F41861C2BC54DDA /* FirebaseCore_Privacy.bundle */ = {isa = PBXFileReference; explicitFileType = wrapper.cfbundle; includeInIndex = 0; path = FirebaseCore_Privacy.bundle; sourceTree = BUILT_PRODUCTS_DIR; }; 8BD1F85540AA07FC7D7BF4F257D84642 /* GDTCORLifecycle.h */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.h; name = GDTCORLifecycle.h; path = GoogleDataTransport/GDTCORLibrary/Internal/GDTCORLifecycle.h; sourceTree = ""; }; 8C2E084DA1A25C6E0022C10EB44E0A0C /* RLMSyncConfiguration_Private.h */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.h; name = RLMSyncConfiguration_Private.h; path = include/RLMSyncConfiguration_Private.h; sourceTree = ""; }; - 8C8CD6ECD9CEDF61955D3CAEDF73A60D /* Roboto-Bold.ttf */ = {isa = PBXFileReference; includeInIndex = 1; name = "Roboto-Bold.ttf"; path = "GoogleSignIn/Sources/Resources/Roboto-Bold.ttf"; sourceTree = ""; }; + 8C8CD6ECD9CEDF61955D3CAEDF73A60D /* Roboto-Bold.ttf */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = file; name = "Roboto-Bold.ttf"; path = "GoogleSignIn/Sources/Resources/Roboto-Bold.ttf"; sourceTree = ""; }; 8C9B439C933D7ED8EB8BEB7C6D49D488 /* FBLPromise+Then.m */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.objc; name = "FBLPromise+Then.m"; path = "Sources/FBLPromises/FBLPromise+Then.m"; sourceTree = ""; }; 8CA833903F7265181DD5E6964D242D9F /* Promise+Await.swift */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.swift; name = "Promise+Await.swift"; path = "Sources/Promises/Promise+Await.swift"; sourceTree = ""; }; 8CAB1A0D549E317215029FBD4BD357C7 /* RLMObjectBase_Private.h */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.h; name = RLMObjectBase_Private.h; path = include/RLMObjectBase_Private.h; sourceTree = ""; }; 8CD70540F65DDEE3BB1EAD3CFE166D64 /* RLMConstants.m */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.objc; name = RLMConstants.m; path = Realm/RLMConstants.m; sourceTree = ""; }; - 8CE70F45EC0FBFF2D250649FE590174F /* FIRCLSCompactUnwind.c */ = {isa = PBXFileReference; includeInIndex = 1; name = FIRCLSCompactUnwind.c; path = Crashlytics/Crashlytics/Unwind/Compact/FIRCLSCompactUnwind.c; sourceTree = ""; }; + 8CE70F45EC0FBFF2D250649FE590174F /* FIRCLSCompactUnwind.c */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.c; name = FIRCLSCompactUnwind.c; path = Crashlytics/Crashlytics/Unwind/Compact/FIRCLSCompactUnwind.c; sourceTree = ""; }; 8CF3B7362BD041DF62A656DC57A81E79 /* RLMObjectSchema_Private.h */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.h; name = RLMObjectSchema_Private.h; path = include/RLMObjectSchema_Private.h; sourceTree = ""; }; 8D334EE2EBFF29480472CD1BD52BAF06 /* SessionDelegate.swift */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.swift; name = SessionDelegate.swift; path = Source/SessionDelegate.swift; sourceTree = ""; }; 8DB1C4AE8E35B6C3F4819B89635A6C64 /* FIRCLSSignal.h */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.h; name = FIRCLSSignal.h; path = Crashlytics/Crashlytics/Handlers/FIRCLSSignal.h; sourceTree = ""; }; @@ -2958,7 +2960,7 @@ 8DE70DCE7C2217B03A72DBA753282653 /* GDTCOREvent+GDTMetricsSupport.h */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.h; name = "GDTCOREvent+GDTMetricsSupport.h"; path = "GoogleDataTransport/GDTCCTLibrary/Private/GDTCOREvent+GDTMetricsSupport.h"; sourceTree = ""; }; 8E25621B7BA9E2A88482CC5F1B761343 /* Kingfisher.debug.xcconfig */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = text.xcconfig; path = Kingfisher.debug.xcconfig; sourceTree = ""; }; 8E4FAC629F0DDD19867832E8AB3D3998 /* FBLPromise+All.m */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.objc; name = "FBLPromise+All.m"; path = "Sources/FBLPromises/FBLPromise+All.m"; sourceTree = ""; }; - 8E505C1C3CBD7EFB36ECEA1837F0C3E0 /* uk.lproj */ = {isa = PBXFileReference; includeInIndex = 1; name = uk.lproj; path = GoogleSignIn/Sources/Strings/uk.lproj; sourceTree = ""; }; + 8E505C1C3CBD7EFB36ECEA1837F0C3E0 /* uk.lproj */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = folder; name = uk.lproj; path = GoogleSignIn/Sources/Strings/uk.lproj; sourceTree = ""; }; 8E5CC540E2C81A10060D298F8FC37BA8 /* FIRInstallationsIIDStore.h */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.h; name = FIRInstallationsIIDStore.h; path = FirebaseInstallations/Source/Library/IIDMigration/FIRInstallationsIIDStore.h; sourceTree = ""; }; 8E74FED6BDCE4EC8953284F3B8F71F21 /* FirebaseInstallations.modulemap */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.module; path = FirebaseInstallations.modulemap; sourceTree = ""; }; 8F16D90D6B227124715A3B7D82AF5500 /* UIView+AutoLayout.swift */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.swift; name = "UIView+AutoLayout.swift"; path = "Sources/Pageboy/Utilities/Extensions/UIView+AutoLayout.swift"; sourceTree = ""; }; @@ -2976,30 +2978,30 @@ 9181C03E2E7234CA26BF2F15EC1C74CD /* FIRCLSRolloutsPersistenceManager.m */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.objc; name = FIRCLSRolloutsPersistenceManager.m; path = Crashlytics/Crashlytics/Controllers/FIRCLSRolloutsPersistenceManager.m; sourceTree = ""; }; 91D54C64CFB7555225B7ECE02A2854F7 /* RLMUpdateResult.h */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.h; name = RLMUpdateResult.h; path = include/RLMUpdateResult.h; sourceTree = ""; }; 91E07F53F4A12F6A25BA8552CCCF667C /* PromisesObjC.debug.xcconfig */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = text.xcconfig; path = PromisesObjC.debug.xcconfig; sourceTree = ""; }; - 91E1F3AFA52D888AEF6CA5406C0A8F35 /* nl.lproj */ = {isa = PBXFileReference; includeInIndex = 1; name = nl.lproj; path = GoogleSignIn/Sources/Strings/nl.lproj; sourceTree = ""; }; + 91E1F3AFA52D888AEF6CA5406C0A8F35 /* nl.lproj */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = folder; name = nl.lproj; path = GoogleSignIn/Sources/Strings/nl.lproj; sourceTree = ""; }; 91EEEE183FD65DDE166B64A38990CA02 /* TMHidingBar.swift */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.swift; name = TMHidingBar.swift; path = Sources/Tabman/Bar/BarExtensions/AutoHidingBar/TMHidingBar.swift; sourceTree = ""; }; 9201E40330A2D42E1A19B10F52FB9821 /* Pods-pochak-pochakUITests.debug.xcconfig */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = text.xcconfig; path = "Pods-pochak-pochakUITests.debug.xcconfig"; sourceTree = ""; }; 92026674B513571AAEEBB11B650EC62B /* GDTCOREvent.h */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.h; name = GDTCOREvent.h; path = GoogleDataTransport/GDTCORLibrary/Public/GoogleDataTransport/GDTCOREvent.h; sourceTree = ""; }; - 921BE4A82C4A7A5C72A0C6F8B8FEF200 /* Realm */ = {isa = PBXFileReference; explicitFileType = wrapper.framework; includeInIndex = 0; name = Realm; path = Realm.framework; sourceTree = BUILT_PRODUCTS_DIR; }; + 921BE4A82C4A7A5C72A0C6F8B8FEF200 /* Realm.framework */ = {isa = PBXFileReference; explicitFileType = wrapper.framework; includeInIndex = 0; path = Realm.framework; sourceTree = BUILT_PRODUCTS_DIR; }; 923CFDB3D3D5BD9B0670FC4F4CCC6795 /* GDTCCTUploader.h */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.h; name = GDTCCTUploader.h; path = GoogleDataTransport/GDTCCTLibrary/Private/GDTCCTUploader.h; sourceTree = ""; }; 924C4DBD84848EE4D73AEA822DB3EF52 /* GULNetworkURLSession.m */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.objc; name = GULNetworkURLSession.m; path = GoogleUtilities/Network/GULNetworkURLSession.m; sourceTree = ""; }; 924CC3BED7D45648CD166C3CFFE5A893 /* FIRLibrary.h */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.h; name = FIRLibrary.h; path = FirebaseCore/Extension/FIRLibrary.h; sourceTree = ""; }; 9277CFBC836AD2A2C941459899201A6C /* OIDScopes.h */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.h; name = OIDScopes.h; path = Source/AppAuthCore/OIDScopes.h; sourceTree = ""; }; 92FEFE66148F4324AB09338581B5987E /* FBLPromisePrivate.h */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.h; name = FBLPromisePrivate.h; path = Sources/FBLPromises/include/FBLPromisePrivate.h; sourceTree = ""; }; 931EA6A38DE45F2CD2A23902E070DDC7 /* FIRCLSBinaryImage.h */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.h; name = FIRCLSBinaryImage.h; path = Crashlytics/Crashlytics/Components/FIRCLSBinaryImage.h; sourceTree = ""; }; - 9340B5D45A389351DACEA37EA37C7B44 /* ko.lproj */ = {isa = PBXFileReference; includeInIndex = 1; name = ko.lproj; path = GoogleSignIn/Sources/Strings/ko.lproj; sourceTree = ""; }; + 9340B5D45A389351DACEA37EA37C7B44 /* ko.lproj */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = folder; name = ko.lproj; path = GoogleSignIn/Sources/Strings/ko.lproj; sourceTree = ""; }; 934ABD25DB89AF17BFCA751D2E3F3E50 /* GDTCORStorageEventSelector.h */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.h; name = GDTCORStorageEventSelector.h; path = GoogleDataTransport/GDTCORLibrary/Internal/GDTCORStorageEventSelector.h; sourceTree = ""; }; 9353FB614FC7D20F4761B435705CA6F6 /* TMBarLayoutInsetGuides.swift */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.swift; name = TMBarLayoutInsetGuides.swift; path = Sources/Tabman/Bar/BarLayout/TMBarLayoutInsetGuides.swift; sourceTree = ""; }; - 9399390533A1F67D29CD555FC983A5BB /* RLMSwiftValueStorage.mm */ = {isa = PBXFileReference; includeInIndex = 1; name = RLMSwiftValueStorage.mm; path = Realm/RLMSwiftValueStorage.mm; sourceTree = ""; }; + 9399390533A1F67D29CD555FC983A5BB /* RLMSwiftValueStorage.mm */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.cpp.objcpp; name = RLMSwiftValueStorage.mm; path = Realm/RLMSwiftValueStorage.mm; sourceTree = ""; }; 93EDBE4CE5E7001B1945EDAF115414FE /* Promise+Catch.swift */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.swift; name = "Promise+Catch.swift"; path = "Sources/Promises/Promise+Catch.swift"; sourceTree = ""; }; 9444673AFB4BFDCFABF064D3C685C78F /* GULAppDelegateSwizzler.h */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.h; name = GULAppDelegateSwizzler.h; path = GoogleUtilities/AppDelegateSwizzler/Public/GoogleUtilities/GULAppDelegateSwizzler.h; sourceTree = ""; }; 944FD6BA4AA4BF8FD0AF48D5C4B6D5BC /* TMBarViewScrollHandler.swift */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.swift; name = TMBarViewScrollHandler.swift; path = Sources/Tabman/Bar/BarView/TMBarViewScrollHandler.swift; sourceTree = ""; }; 946DE9EE7EDFC2151601401FC04959BE /* GoogleSignInSwiftSupport-Info.plist */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = text.plist.xml; path = "GoogleSignInSwiftSupport-Info.plist"; sourceTree = ""; }; 9477FDD5B0FAD2298554FAE72AD8E0FB /* FirebaseSessions.swift */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.swift; name = FirebaseSessions.swift; path = FirebaseSessions/Sources/FirebaseSessions.swift; sourceTree = ""; }; 947CE33040D399620F9997F7C2058E26 /* FIRCLSByteUtility.m */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.objc; name = FIRCLSByteUtility.m; path = Crashlytics/Shared/FIRCLSByteUtility.m; sourceTree = ""; }; - 951AD483B167B84DE246CAC86C14A12A /* RLMLogger.mm */ = {isa = PBXFileReference; includeInIndex = 1; name = RLMLogger.mm; path = Realm/RLMLogger.mm; sourceTree = ""; }; + 951AD483B167B84DE246CAC86C14A12A /* RLMLogger.mm */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.cpp.objcpp; name = RLMLogger.mm; path = Realm/RLMLogger.mm; sourceTree = ""; }; 953818363CB8A0ACE650F0CEF470CADD /* ComplexTypes.swift */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.swift; name = ComplexTypes.swift; path = RealmSwift/Impl/ComplexTypes.swift; sourceTree = ""; }; - 9562495E4EA6B938101F235988FB2D11 /* RLMUserAPIKey.mm */ = {isa = PBXFileReference; includeInIndex = 1; name = RLMUserAPIKey.mm; path = Realm/RLMUserAPIKey.mm; sourceTree = ""; }; + 9562495E4EA6B938101F235988FB2D11 /* RLMUserAPIKey.mm */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.cpp.objcpp; name = RLMUserAPIKey.mm; path = Realm/RLMUserAPIKey.mm; sourceTree = ""; }; 956A8C413ED5453722BDB295F1F1EB72 /* RealmSwift-prefix.pch */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.h; path = "RealmSwift-prefix.pch"; sourceTree = ""; }; 9590E40ADBE66B680FBD575B3B2FDBB2 /* Map.swift */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.swift; name = Map.swift; path = RealmSwift/Map.swift; sourceTree = ""; }; 95D63515231BAD798E17BB6A83F77DDE /* PageboyViewController.swift */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.swift; name = PageboyViewController.swift; path = Sources/Pageboy/PageboyViewController.swift; sourceTree = ""; }; @@ -3014,12 +3016,12 @@ 96F60EFAFEE794CDB4DB344FE30A61B8 /* google@2x.png */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = image.png; name = "google@2x.png"; path = "GoogleSignIn/Sources/Resources/google@2x.png"; sourceTree = ""; }; 9724B9B4CEAEBCFB1C27969571C91C55 /* Pods-pochak-Info.plist */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = text.plist.xml; path = "Pods-pochak-Info.plist"; sourceTree = ""; }; 974BD49D79D8F66E0835C1ADD46B5C4F /* BarMath.swift */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.swift; name = BarMath.swift; path = Sources/Tabman/Bar/Utility/BarMath.swift; sourceTree = ""; }; - 978DE789DE51F9EEE984BCA62AF4D9C4 /* Pods-pochak-pochakUITests */ = {isa = PBXFileReference; explicitFileType = wrapper.framework; includeInIndex = 0; name = "Pods-pochak-pochakUITests"; path = Pods_pochak_pochakUITests.framework; sourceTree = BUILT_PRODUCTS_DIR; }; + 978DE789DE51F9EEE984BCA62AF4D9C4 /* Pods_pochak_pochakUITests.framework */ = {isa = PBXFileReference; explicitFileType = wrapper.framework; includeInIndex = 0; path = Pods_pochak_pochakUITests.framework; sourceTree = BUILT_PRODUCTS_DIR; }; 97EC7EB67D5B20CE338CA863285E10AA /* FIRCLSReportUploader_Private.h */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.h; name = FIRCLSReportUploader_Private.h; path = Crashlytics/Crashlytics/Controllers/FIRCLSReportUploader_Private.h; sourceTree = ""; }; 983DCEA68015D8BBC26B5B736C99A2D7 /* google.png */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = image.png; name = google.png; path = GoogleSignIn/Sources/Resources/google.png; sourceTree = ""; }; 988AA0898C4651C0B1A7F8B41D2CE5F1 /* Logger.swift */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.swift; name = Logger.swift; path = FirebaseSessions/Sources/Logger.swift; sourceTree = ""; }; 98AD0F7838D156A7B31CC4C151EC9AE4 /* GDTCORTargets.h */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.h; name = GDTCORTargets.h; path = GoogleDataTransport/GDTCORLibrary/Public/GoogleDataTransport/GDTCORTargets.h; sourceTree = ""; }; - 98C40F4DA9B30E95673CED13431A058D /* RLMEmbeddedObject.mm */ = {isa = PBXFileReference; includeInIndex = 1; name = RLMEmbeddedObject.mm; path = Realm/RLMEmbeddedObject.mm; sourceTree = ""; }; + 98C40F4DA9B30E95673CED13431A058D /* RLMEmbeddedObject.mm */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.cpp.objcpp; name = RLMEmbeddedObject.mm; path = Realm/RLMEmbeddedObject.mm; sourceTree = ""; }; 98FD763212E833785C297C27C6132649 /* OIDAuthState.h */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.h; name = OIDAuthState.h; path = Source/AppAuthCore/OIDAuthState.h; sourceTree = ""; }; 993B7B5A4F1558F0A38170E2D024F645 /* TMChevronBarIndicator.swift */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.swift; name = TMChevronBarIndicator.swift; path = Sources/Tabman/Bar/BarIndicator/Types/TMChevronBarIndicator.swift; sourceTree = ""; }; 99547C6C37B2B7D9632B96E9CE34F1D2 /* Pods-pochak-pochakUITests.release.xcconfig */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = text.xcconfig; path = "Pods-pochak-pochakUITests.release.xcconfig"; sourceTree = ""; }; @@ -3030,7 +3032,7 @@ 9A54A24AA5FDA120457CDD790043DB04 /* FIRCLSAsyncOperation.h */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.h; name = FIRCLSAsyncOperation.h; path = Crashlytics/Crashlytics/Operations/FIRCLSAsyncOperation.h; sourceTree = ""; }; 9AD0852AA04D9DBB7CEDFFE3FDE181D8 /* Promise+Async.swift */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.swift; name = "Promise+Async.swift"; path = "Sources/Promises/Promise+Async.swift"; sourceTree = ""; }; 9AD4AA3E0D8A333D84E6E754E10D7B9B /* RLMMongoClient.h */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.h; name = RLMMongoClient.h; path = include/RLMMongoClient.h; sourceTree = ""; }; - 9AD5740454FECD6487654FB5D61723A3 /* RLMSyncSubscription.mm */ = {isa = PBXFileReference; includeInIndex = 1; name = RLMSyncSubscription.mm; path = Realm/RLMSyncSubscription.mm; sourceTree = ""; }; + 9AD5740454FECD6487654FB5D61723A3 /* RLMSyncSubscription.mm */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.cpp.objcpp; name = RLMSyncSubscription.mm; path = Realm/RLMSyncSubscription.mm; sourceTree = ""; }; 9AE1AABCA9677C234FEDA7C56456A149 /* FIRLibrary.h */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.h; name = FIRLibrary.h; path = FirebaseCore/Extension/FIRLibrary.h; sourceTree = ""; }; 9B0BF0D8CCC4BC5DB562037553568FA4 /* FIRCrashlyticsReport_Private.h */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.h; name = FIRCrashlyticsReport_Private.h; path = Crashlytics/Crashlytics/Private/FIRCrashlyticsReport_Private.h; sourceTree = ""; }; 9B37F3E7DEF6CC773FE0550B93EDFC83 /* Promise.swift */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.swift; name = Promise.swift; path = Sources/Promises/Promise.swift; sourceTree = ""; }; @@ -3042,7 +3044,7 @@ 9C1E52A92BE88DEAA25F11C5841A69CB /* CoreText.framework */ = {isa = PBXFileReference; lastKnownFileType = wrapper.framework; name = CoreText.framework; path = Platforms/iPhoneOS.platform/Developer/SDKs/iPhoneOS14.0.sdk/System/Library/Frameworks/CoreText.framework; sourceTree = DEVELOPER_DIR; }; 9C2D36575C6578DA9E611B4BA3DE5648 /* GDTCOREvent+GDTMetricsSupport.m */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.objc; name = "GDTCOREvent+GDTMetricsSupport.m"; path = "GoogleDataTransport/GDTCCTLibrary/GDTCOREvent+GDTMetricsSupport.m"; sourceTree = ""; }; 9C43E15FA015041DCD2AD05E50238C47 /* GDTCORFlatFileStorage.m */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.objc; name = GDTCORFlatFileStorage.m; path = GoogleDataTransport/GDTCORLibrary/GDTCORFlatFileStorage.m; sourceTree = ""; }; - 9C4C38AB0DFDFB6397226747CBCDFEBF /* RLMRealm+Sync.mm */ = {isa = PBXFileReference; includeInIndex = 1; name = "RLMRealm+Sync.mm"; path = "Realm/RLMRealm+Sync.mm"; sourceTree = ""; }; + 9C4C38AB0DFDFB6397226747CBCDFEBF /* RLMRealm+Sync.mm */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.cpp.objcpp; name = "RLMRealm+Sync.mm"; path = "Realm/RLMRealm+Sync.mm"; sourceTree = ""; }; 9C535C4961B3287242500FEAE5653D24 /* GDTCORFlatFileStorage.h */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.h; name = GDTCORFlatFileStorage.h; path = GoogleDataTransport/GDTCORLibrary/Private/GDTCORFlatFileStorage.h; sourceTree = ""; }; 9C6CE4B60439EE3973DD15D14C83CB0B /* RLMAsyncTask_Private.h */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.h; name = RLMAsyncTask_Private.h; path = include/RLMAsyncTask_Private.h; sourceTree = ""; }; 9CA57D10F13798981EB08B536C48DC44 /* FIRCLSDwarfUnwind.h */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.h; name = FIRCLSDwarfUnwind.h; path = Crashlytics/Crashlytics/Unwind/Dwarf/FIRCLSDwarfUnwind.h; sourceTree = ""; }; @@ -3051,7 +3053,7 @@ 9D159743BE32B6D26833FF6908F23A0A /* RedirectHandler.swift */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.swift; name = RedirectHandler.swift; path = Source/RedirectHandler.swift; sourceTree = ""; }; 9D1A0EF30DC94A72B4BBCB0AD69BC3D8 /* NSError+RLMSync.h */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.h; name = "NSError+RLMSync.h"; path = "include/NSError+RLMSync.h"; sourceTree = ""; }; 9D7AF0635A6D6F00829EECDBFA8C288F /* FirebaseAnalytics-xcframeworks.sh */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = text.script.sh; path = "FirebaseAnalytics-xcframeworks.sh"; sourceTree = ""; }; - 9D940727FF8FB9C785EB98E56350EF41 /* Podfile */ = {isa = PBXFileReference; explicitFileType = text.script.ruby; includeInIndex = 1; indentWidth = 2; lastKnownFileType = text; name = Podfile; path = ../Podfile; sourceTree = SOURCE_ROOT; tabWidth = 2; xcLanguageSpecificationIdentifier = xcode.lang.ruby; }; + 9D940727FF8FB9C785EB98E56350EF41 /* Podfile */ = {isa = PBXFileReference; explicitFileType = text.script.ruby; includeInIndex = 1; indentWidth = 2; name = Podfile; path = ../Podfile; sourceTree = SOURCE_ROOT; tabWidth = 2; xcLanguageSpecificationIdentifier = xcode.lang.ruby; }; 9DCF831A5A553B5C8EF627B7EBEDC29A /* TMBarIndicatorContainer.swift */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.swift; name = TMBarIndicatorContainer.swift; path = Sources/Tabman/Bar/BarIndicator/TMBarIndicatorContainer.swift; sourceTree = ""; }; 9E53406852FC82B5A425FC8F0186E1EA /* FIRCLSException.h */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.h; name = FIRCLSException.h; path = Crashlytics/Crashlytics/Handlers/FIRCLSException.h; sourceTree = ""; }; 9E684D4AE10471AA4D8EFA043127AD7F /* GDTCORConsoleLogger.h */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.h; name = GDTCORConsoleLogger.h; path = GoogleDataTransport/GDTCORLibrary/Public/GoogleDataTransport/GDTCORConsoleLogger.h; sourceTree = ""; }; @@ -3079,7 +3081,7 @@ A1CBA00B2B55B3219B74A475CFBDAC01 /* FIRCLSContextInitData.h */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.h; name = FIRCLSContextInitData.h; path = Crashlytics/Crashlytics/Helpers/FIRCLSContextInitData.h; sourceTree = ""; }; A2546812E546745061C3F672C056C863 /* GoogleAppMeasurement-xcframeworks.sh */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = text.script.sh; path = "GoogleAppMeasurement-xcframeworks.sh"; sourceTree = ""; }; A2880FF15989C9A0F9B3032789C80F47 /* RLMLogger_Private.h */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.h; name = RLMLogger_Private.h; path = include/RLMLogger_Private.h; sourceTree = ""; }; - A2BA830BC8B8A3B6EAEE3BF85ECF5A2E /* RLMManagedSet.mm */ = {isa = PBXFileReference; includeInIndex = 1; name = RLMManagedSet.mm; path = Realm/RLMManagedSet.mm; sourceTree = ""; }; + A2BA830BC8B8A3B6EAEE3BF85ECF5A2E /* RLMManagedSet.mm */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.cpp.objcpp; name = RLMManagedSet.mm; path = Realm/RLMManagedSet.mm; sourceTree = ""; }; A2F2F8CC304F10A209C8D19F51C72587 /* Heartbeat.swift */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.swift; name = Heartbeat.swift; path = FirebaseCore/Internal/Sources/HeartbeatLogging/Heartbeat.swift; sourceTree = ""; }; A32B9AFCAB80E840F2FFBF2296964A18 /* ObjectiveCSupport+BSON.swift */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.swift; name = "ObjectiveCSupport+BSON.swift"; path = "RealmSwift/ObjectiveCSupport+BSON.swift"; sourceTree = ""; }; A3793288357EE0455DAE6A70F51F8FD3 /* GIDSignIn.h */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.h; name = GIDSignIn.h; path = GoogleSignIn/Sources/Public/GoogleSignIn/GIDSignIn.h; sourceTree = ""; }; @@ -3088,7 +3090,7 @@ A426C9871A88D5F25D800FF7641857DB /* FIRAppInternal.h */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.h; name = FIRAppInternal.h; path = FirebaseCore/Extension/FIRAppInternal.h; sourceTree = ""; }; A4315947F251D3E2A28CC92C2BFF8BEC /* Kingfisher.modulemap */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.module; path = Kingfisher.modulemap; sourceTree = ""; }; A4CD2668AB59B172D40CD5C4A769F752 /* RLMObjectId.h */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.h; name = RLMObjectId.h; path = include/RLMObjectId.h; sourceTree = ""; }; - A4D1545B2EA55736EBFF7C6FACB63C54 /* de.lproj */ = {isa = PBXFileReference; includeInIndex = 1; name = de.lproj; path = GoogleSignIn/Sources/Strings/de.lproj; sourceTree = ""; }; + A4D1545B2EA55736EBFF7C6FACB63C54 /* de.lproj */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = folder; name = de.lproj; path = GoogleSignIn/Sources/Strings/de.lproj; sourceTree = ""; }; A57FA1A0D21BA5A169A672DF0005EF69 /* InsetCalculator.swift */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.swift; name = InsetCalculator.swift; path = Sources/Tabman/AutoInsetter/InsetCalculator/InsetCalculator.swift; sourceTree = ""; }; A5B53E095D78DA8406E103E835D86D2E /* GDTCORProductData.m */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.objc; name = GDTCORProductData.m; path = GoogleDataTransport/GDTCORLibrary/GDTCORProductData.m; sourceTree = ""; }; A5C8E6E8A5DC25BE6E7F57633A926EEF /* RequestModifier.swift */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.swift; name = RequestModifier.swift; path = Sources/Networking/RequestModifier.swift; sourceTree = ""; }; @@ -3120,7 +3122,7 @@ AA7144C2CBB7B61D46C0FA1B38705932 /* Promise+Validate.swift */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.swift; name = "Promise+Validate.swift"; path = "Sources/Promises/Promise+Validate.swift"; sourceTree = ""; }; AAA59DEAB38A63BD7BB064FD55B26A4B /* FBLPromise+Catch.h */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.h; name = "FBLPromise+Catch.h"; path = "Sources/FBLPromises/include/FBLPromise+Catch.h"; sourceTree = ""; }; AAF8A3E3E8679AA9B41CED26E1192FD2 /* TMBarViewLayoutGrid.swift */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.swift; name = TMBarViewLayoutGrid.swift; path = Sources/Tabman/Bar/BarView/TMBarViewLayoutGrid.swift; sourceTree = ""; }; - AB40ED788BBEA385AFCA856C04EBB385 /* es_MX.lproj */ = {isa = PBXFileReference; includeInIndex = 1; name = es_MX.lproj; path = GoogleSignIn/Sources/Strings/es_MX.lproj; sourceTree = ""; }; + AB40ED788BBEA385AFCA856C04EBB385 /* es_MX.lproj */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = folder; name = es_MX.lproj; path = GoogleSignIn/Sources/Strings/es_MX.lproj; sourceTree = ""; }; AB46DBA1F43378BD395B32482FFA9329 /* GDTCORRegistrar_Private.h */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.h; name = GDTCORRegistrar_Private.h; path = GoogleDataTransport/GDTCORLibrary/Private/GDTCORRegistrar_Private.h; sourceTree = ""; }; AB4794FE49AAC6E6F637D2809626DBE2 /* ResourceBundle-GoogleSignIn-GoogleSignIn-Info.plist */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = text.plist.xml; path = "ResourceBundle-GoogleSignIn-GoogleSignIn-Info.plist"; sourceTree = ""; }; AB5A78B7346211CCA3F002D7E2E40FF5 /* RLMLogger.h */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.h; name = RLMLogger.h; path = include/RLMLogger.h; sourceTree = ""; }; @@ -3137,11 +3139,11 @@ ADCF0B90A7A16A56897146A2EC0097F1 /* ObjectiveCSupport+Sync.swift */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.swift; name = "ObjectiveCSupport+Sync.swift"; path = "RealmSwift/ObjectiveCSupport+Sync.swift"; sourceTree = ""; }; ADE0B7D885871A21AA0DD75689B9B568 /* OIDExternalUserAgentIOSCustomBrowser.h */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.h; name = OIDExternalUserAgentIOSCustomBrowser.h; path = Source/AppAuth/iOS/OIDExternalUserAgentIOSCustomBrowser.h; sourceTree = ""; }; AEB48A1BDAD3C6D3B0603B8D614F0209 /* OIDExternalUserAgentCatalyst.m */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.objc; name = OIDExternalUserAgentCatalyst.m; path = Source/AppAuth/iOS/OIDExternalUserAgentCatalyst.m; sourceTree = ""; }; - AEF1DC80F0EB62580B81D18786BAF924 /* FirebaseCoreExtension */ = {isa = PBXFileReference; explicitFileType = wrapper.framework; includeInIndex = 0; name = FirebaseCoreExtension; path = FirebaseCoreExtension.framework; sourceTree = BUILT_PRODUCTS_DIR; }; + AEF1DC80F0EB62580B81D18786BAF924 /* FirebaseCoreExtension.framework */ = {isa = PBXFileReference; explicitFileType = wrapper.framework; includeInIndex = 0; path = FirebaseCoreExtension.framework; sourceTree = BUILT_PRODUCTS_DIR; }; AF00B6D791F0A13DAC6F0A5BDBDC6492 /* Pods-pochak.release.xcconfig */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = text.xcconfig; path = "Pods-pochak.release.xcconfig"; sourceTree = ""; }; AF244FCD0BA601785C3FD55F014EBE7C /* KF.swift */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.swift; name = KF.swift; path = Sources/General/KF.swift; sourceTree = ""; }; AFCD2A0D8B5F7344AB5AB3F86351F6A2 /* PromisesObjC.modulemap */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.module; path = PromisesObjC.modulemap; sourceTree = ""; }; - AFF9EB64FB3D5622190451850815AD4C /* external_privacy_context.nanopb.c */ = {isa = PBXFileReference; includeInIndex = 1; name = external_privacy_context.nanopb.c; path = GoogleDataTransport/GDTCCTLibrary/Protogen/nanopb/external_privacy_context.nanopb.c; sourceTree = ""; }; + AFF9EB64FB3D5622190451850815AD4C /* external_privacy_context.nanopb.c */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.c; name = external_privacy_context.nanopb.c; path = GoogleDataTransport/GDTCCTLibrary/Protogen/nanopb/external_privacy_context.nanopb.c; sourceTree = ""; }; B05B0277D6A6D365E308C3F3C3C64052 /* FIRInstallationsErrorUtil.h */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.h; name = FIRInstallationsErrorUtil.h; path = FirebaseInstallations/Source/Library/Errors/FIRInstallationsErrorUtil.h; sourceTree = ""; }; B0F129A8864A6E2E774B7E506449E214 /* GIDProfileData.h */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.h; name = GIDProfileData.h; path = GoogleSignIn/Sources/Public/GoogleSignIn/GIDProfileData.h; sourceTree = ""; }; B1038A2DA103593AB4E0790908996361 /* GULURLSessionDataResponse.m */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.objc; name = GULURLSessionDataResponse.m; path = GoogleUtilities/Environment/URLSessionPromiseWrapper/GULURLSessionDataResponse.m; sourceTree = ""; }; @@ -3151,10 +3153,10 @@ B1EA2D21854E3D5FF85F959D015EAFB0 /* FirebaseCrashlytics.debug.xcconfig */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = text.xcconfig; path = FirebaseCrashlytics.debug.xcconfig; sourceTree = ""; }; B1F51D963B698B6CEDB1752D7D2CA445 /* GDTCOREndpoints.h */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.h; name = GDTCOREndpoints.h; path = GoogleDataTransport/GDTCORLibrary/Public/GoogleDataTransport/GDTCOREndpoints.h; sourceTree = ""; }; B24CF660420B606B6C4CC73839310132 /* GIDAppAuthFetcherAuthorizationWithEMMSupport.m */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.objc; name = GIDAppAuthFetcherAuthorizationWithEMMSupport.m; path = GoogleSignIn/Sources/GIDAppAuthFetcherAuthorizationWithEMMSupport.m; sourceTree = ""; }; - B262998602B22BAB2A97971C2DDC15BF /* FirebaseAnalytics.xcframework */ = {isa = PBXFileReference; includeInIndex = 1; name = FirebaseAnalytics.xcframework; path = Frameworks/FirebaseAnalytics.xcframework; sourceTree = ""; }; + B262998602B22BAB2A97971C2DDC15BF /* FirebaseAnalytics.xcframework */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = wrapper.xcframework; name = FirebaseAnalytics.xcframework; path = Frameworks/FirebaseAnalytics.xcframework; sourceTree = ""; }; B274D5A00CC089BA6DB313FEDEBF73DC /* NSButton+Kingfisher.swift */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.swift; name = "NSButton+Kingfisher.swift"; path = "Sources/Extensions/NSButton+Kingfisher.swift"; sourceTree = ""; }; B2E6857679B6C208563C841249506CEA /* Pods-pochak-acknowledgements.plist */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = text.plist.xml; path = "Pods-pochak-acknowledgements.plist"; sourceTree = ""; }; - B339B71239944D6427EA8F308B161E5B /* RLMSet.mm */ = {isa = PBXFileReference; includeInIndex = 1; name = RLMSet.mm; path = Realm/RLMSet.mm; sourceTree = ""; }; + B339B71239944D6427EA8F308B161E5B /* RLMSet.mm */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.cpp.objcpp; name = RLMSet.mm; path = Realm/RLMSet.mm; sourceTree = ""; }; B38FBB79611253F7E3993EA3FF2E22CE /* GDTCORStorageProtocol.h */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.h; name = GDTCORStorageProtocol.h; path = GoogleDataTransport/GDTCORLibrary/Internal/GDTCORStorageProtocol.h; sourceTree = ""; }; B3A2595DEACEA75403C3681FC1B05FC4 /* Pageboy-prefix.pch */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.h; path = "Pageboy-prefix.pch"; sourceTree = ""; }; B3BA18D01DCA27EF8DBAD195E5B8F7D2 /* FIRCLSMachOSlice.m */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.objc; name = FIRCLSMachOSlice.m; path = Crashlytics/Shared/FIRCLSMachO/FIRCLSMachOSlice.m; sourceTree = ""; }; @@ -3162,7 +3164,7 @@ B402D10521A24C7E1DE7AACA4DEE646A /* AutoInsetSpec.swift */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.swift; name = AutoInsetSpec.swift; path = Sources/Tabman/AutoInsetter/AutoInsetSpec.swift; sourceTree = ""; }; B40C5E341B246252F0EB1C037962E8BD /* GDTCOREvent.m */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.objc; name = GDTCOREvent.m; path = GoogleDataTransport/GDTCORLibrary/GDTCOREvent.m; sourceTree = ""; }; B41D696036404B8CEED69191C31DD542 /* GIDSignInInternalOptions.m */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.objc; name = GIDSignInInternalOptions.m; path = GoogleSignIn/Sources/GIDSignInInternalOptions.m; sourceTree = ""; }; - B43874C6CBB50E7134FBEC24BABFE14F /* GoogleUtilities */ = {isa = PBXFileReference; explicitFileType = wrapper.framework; includeInIndex = 0; name = GoogleUtilities; path = GoogleUtilities.framework; sourceTree = BUILT_PRODUCTS_DIR; }; + B43874C6CBB50E7134FBEC24BABFE14F /* GoogleUtilities.framework */ = {isa = PBXFileReference; explicitFileType = wrapper.framework; includeInIndex = 0; path = GoogleUtilities.framework; sourceTree = BUILT_PRODUCTS_DIR; }; B4918118F9CFA0BE3246F09931B9250F /* dummy.m */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.objc; name = dummy.m; path = FirebaseCore/Extension/dummy.m; sourceTree = ""; }; B4D64313B830D0E169CE3CD3C613DF72 /* FIRCLSDwarfExpressionMachine.h */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.h; name = FIRCLSDwarfExpressionMachine.h; path = Crashlytics/Crashlytics/Unwind/Dwarf/FIRCLSDwarfExpressionMachine.h; sourceTree = ""; }; B53AE03FD7343B68AD83A2E598BBF60F /* GDTCCTCompressionHelper.m */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.objc; name = GDTCCTCompressionHelper.m; path = GoogleDataTransport/GDTCCTLibrary/GDTCCTCompressionHelper.m; sourceTree = ""; }; @@ -3198,7 +3200,7 @@ BBF8AB7705DB2A2ECC5E3588B65BCAA6 /* FBLPromise+Validate.h */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.h; name = "FBLPromise+Validate.h"; path = "Sources/FBLPromises/include/FBLPromise+Validate.h"; sourceTree = ""; }; BC16CC57B5B53990DD30EE091B70569A /* RLMProperty.h */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.h; name = RLMProperty.h; path = include/RLMProperty.h; sourceTree = ""; }; BC29513C7F5CC98B5E95E9546E27D2C6 /* Promise+Testing.swift */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.swift; name = "Promise+Testing.swift"; path = "Sources/Promises/Promise+Testing.swift"; sourceTree = ""; }; - BC75C005A5037C3B953248BBDE8650F0 /* cs.lproj */ = {isa = PBXFileReference; includeInIndex = 1; name = cs.lproj; path = GoogleSignIn/Sources/Strings/cs.lproj; sourceTree = ""; }; + BC75C005A5037C3B953248BBDE8650F0 /* cs.lproj */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = folder; name = cs.lproj; path = GoogleSignIn/Sources/Strings/cs.lproj; sourceTree = ""; }; BCC2AB56DD07FB6E3D7D7C5D492F17D6 /* FBLPromise+Always.h */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.h; name = "FBLPromise+Always.h"; path = "Sources/FBLPromises/include/FBLPromise+Always.h"; sourceTree = ""; }; BD219E99337E185CCB8355A1E1A5D29C /* GDTCORMetricsController.h */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.h; name = GDTCORMetricsController.h; path = GoogleDataTransport/GDTCORLibrary/Private/GDTCORMetricsController.h; sourceTree = ""; }; BD2A38A82BDAEF6EEE6DF2A688D52F19 /* FIRCLSReportManager.m */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.objc; name = FIRCLSReportManager.m; path = Crashlytics/Crashlytics/Controllers/FIRCLSReportManager.m; sourceTree = ""; }; @@ -3212,15 +3214,15 @@ BF0FCB200957B4F395870BC56C4B6146 /* FIRBundleUtil.m */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.objc; name = FIRBundleUtil.m; path = FirebaseCore/Sources/FIRBundleUtil.m; sourceTree = ""; }; BF260E0124F0364D2B9C6C61D0F22862 /* GIDGoogleUser.h */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.h; name = GIDGoogleUser.h; path = GoogleSignIn/Sources/Public/GoogleSignIn/GIDGoogleUser.h; sourceTree = ""; }; BF51892389BC7587AA13E79D101AB090 /* OIDExternalUserAgentIOSCustomBrowser.m */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.objc; name = OIDExternalUserAgentIOSCustomBrowser.m; path = Source/AppAuth/iOS/OIDExternalUserAgentIOSCustomBrowser.m; sourceTree = ""; }; - BFE257BF0B994E7F5C7BDE0B1F341FC9 /* RLMMongoCollection.mm */ = {isa = PBXFileReference; includeInIndex = 1; name = RLMMongoCollection.mm; path = Realm/RLMMongoCollection.mm; sourceTree = ""; }; + BFE257BF0B994E7F5C7BDE0B1F341FC9 /* RLMMongoCollection.mm */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.cpp.objcpp; name = RLMMongoCollection.mm; path = Realm/RLMMongoCollection.mm; sourceTree = ""; }; BFF980C1A28CE807AA2E16824557E22B /* TransitionOperation.swift */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.swift; name = TransitionOperation.swift; path = Sources/Pageboy/Transitioning/TransitionOperation.swift; sourceTree = ""; }; C01E05A42876371D341009737B8A0082 /* GIDAuthentication.h */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.h; name = GIDAuthentication.h; path = GoogleSignIn/Sources/GIDAuthentication.h; sourceTree = ""; }; C03EDB9C9BE8A494F48380089BC9B5F3 /* FormatIndicatedCacheSerializer.swift */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.swift; name = FormatIndicatedCacheSerializer.swift; path = Sources/Cache/FormatIndicatedCacheSerializer.swift; sourceTree = ""; }; C078DFF033237AC62D2B57D450DCE1B0 /* UIApplication+SafeShared.swift */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.swift; name = "UIApplication+SafeShared.swift"; path = "Sources/Pageboy/Utilities/Extensions/UIApplication+SafeShared.swift"; sourceTree = ""; }; C095B36B5EA76A736199E986B2F85C83 /* PersistedProperty.swift */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.swift; name = PersistedProperty.swift; path = RealmSwift/PersistedProperty.swift; sourceTree = ""; }; - C11F7CB33BF421F3A624EC9C28F57E2D /* PrivacyInfo.xcprivacy */ = {isa = PBXFileReference; includeInIndex = 1; name = PrivacyInfo.xcprivacy; path = GoogleUtilities/Privacy/Resources/PrivacyInfo.xcprivacy; sourceTree = ""; }; + C11F7CB33BF421F3A624EC9C28F57E2D /* PrivacyInfo.xcprivacy */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = text.xml; name = PrivacyInfo.xcprivacy; path = GoogleUtilities/Privacy/Resources/PrivacyInfo.xcprivacy; sourceTree = ""; }; C13E053AABDE5E1C1E2C9A8BBA404B2A /* NetworkInfo.swift */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.swift; name = NetworkInfo.swift; path = FirebaseSessions/Sources/NetworkInfo.swift; sourceTree = ""; }; - C1998E0D8085221AD87F89B614C10E52 /* GTMSessionFetcher */ = {isa = PBXFileReference; explicitFileType = wrapper.framework; includeInIndex = 0; name = GTMSessionFetcher; path = GTMSessionFetcher.framework; sourceTree = BUILT_PRODUCTS_DIR; }; + C1998E0D8085221AD87F89B614C10E52 /* GTMSessionFetcher.framework */ = {isa = PBXFileReference; explicitFileType = wrapper.framework; includeInIndex = 0; path = GTMSessionFetcher.framework; sourceTree = BUILT_PRODUCTS_DIR; }; C19BBE674DC4CD41CB73ACF41FA09C47 /* FIRCLSByteUtility.h */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.h; name = FIRCLSByteUtility.h; path = Crashlytics/Shared/FIRCLSByteUtility.h; sourceTree = ""; }; C1AAC4D2B5F206233B9F7A09D600B19A /* SortDescriptor.swift */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.swift; name = SortDescriptor.swift; path = RealmSwift/SortDescriptor.swift; sourceTree = ""; }; C1E76A4E7295D5620E2EE23CF588A86B /* FIRVersion.h */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.h; name = FIRVersion.h; path = FirebaseCore/Sources/Public/FirebaseCore/FIRVersion.h; sourceTree = ""; }; @@ -3230,21 +3232,21 @@ C211C9366DB57BCC39DEAE838C27403D /* FBLPromise+Delay.m */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.objc; name = "FBLPromise+Delay.m"; path = "Sources/FBLPromises/FBLPromise+Delay.m"; sourceTree = ""; }; C223B1F0C366B807D67A068905CF6E7B /* GIDConfiguration.m */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.objc; name = GIDConfiguration.m; path = GoogleSignIn/Sources/GIDConfiguration.m; sourceTree = ""; }; C2269879581C488F140BD9874D110A98 /* FIRInstallationsAPIService.h */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.h; name = FIRInstallationsAPIService.h; path = FirebaseInstallations/Source/Library/InstallationsAPI/FIRInstallationsAPIService.h; sourceTree = ""; }; - C266389B9826CEF3C96E03728981C617 /* da.lproj */ = {isa = PBXFileReference; includeInIndex = 1; name = da.lproj; path = GoogleSignIn/Sources/Strings/da.lproj; sourceTree = ""; }; + C266389B9826CEF3C96E03728981C617 /* da.lproj */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = folder; name = da.lproj; path = GoogleSignIn/Sources/Strings/da.lproj; sourceTree = ""; }; C2BE1D39CEC08FF26105D013517D05C0 /* FIRCLSUUID.h */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.h; name = FIRCLSUUID.h; path = Crashlytics/Shared/FIRCLSUUID.h; sourceTree = ""; }; C2E34F7CC7748C8A80AFD761B3CF54A7 /* sessions.nanopb.h */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.h; name = sessions.nanopb.h; path = FirebaseSessions/SourcesObjC/Protogen/nanopb/sessions.nanopb.h; sourceTree = ""; }; C31898BA1DF63CBFF9136B20AF1BB717 /* TabmanViewController.swift */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.swift; name = TabmanViewController.swift; path = Sources/Tabman/TabmanViewController.swift; sourceTree = ""; }; - C335C962D167D30CA3860059D033318F /* es.lproj */ = {isa = PBXFileReference; includeInIndex = 1; name = es.lproj; path = GoogleSignIn/Sources/Strings/es.lproj; sourceTree = ""; }; + C335C962D167D30CA3860059D033318F /* es.lproj */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = folder; name = es.lproj; path = GoogleSignIn/Sources/Strings/es.lproj; sourceTree = ""; }; C33FAAA98B7A840E0BF1BB19D7D7F265 /* FIRCLSFeatures.h */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.h; name = FIRCLSFeatures.h; path = Crashlytics/Crashlytics/Helpers/FIRCLSFeatures.h; sourceTree = ""; }; - C354799697C3C44DC806501D0149721F /* RLMApp.mm */ = {isa = PBXFileReference; includeInIndex = 1; name = RLMApp.mm; path = Realm/RLMApp.mm; sourceTree = ""; }; + C354799697C3C44DC806501D0149721F /* RLMApp.mm */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.cpp.objcpp; name = RLMApp.mm; path = Realm/RLMApp.mm; sourceTree = ""; }; C368797EAE6C2D488C9179F95920955B /* google@3x.png */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = image.png; name = "google@3x.png"; path = "GoogleSignIn/Sources/Resources/google@3x.png"; sourceTree = ""; }; C3A0A859C6AEB6E615BC05B7D4DC455B /* Kingfisher-umbrella.h */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.h; path = "Kingfisher-umbrella.h"; sourceTree = ""; }; C3D13F41F1E2895E888453578D1AD050 /* AppAuthCore.h */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.h; name = AppAuthCore.h; path = Source/AppAuthCore.h; sourceTree = ""; }; - C3F44C782D64D7EB20B61CE3844EBFAD /* Kingfisher */ = {isa = PBXFileReference; explicitFileType = wrapper.framework; includeInIndex = 0; name = Kingfisher; path = Kingfisher.framework; sourceTree = BUILT_PRODUCTS_DIR; }; + C3F44C782D64D7EB20B61CE3844EBFAD /* Kingfisher.framework */ = {isa = PBXFileReference; explicitFileType = wrapper.framework; includeInIndex = 0; path = Kingfisher.framework; sourceTree = BUILT_PRODUCTS_DIR; }; C423481B6A4D4289551B4B7713130D15 /* nanopb.debug.xcconfig */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = text.xcconfig; path = nanopb.debug.xcconfig; sourceTree = ""; }; C459CFE260B0FD260A4EE561AF81DC29 /* FBLPromise+Then.h */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.h; name = "FBLPromise+Then.h"; path = "Sources/FBLPromises/include/FBLPromise+Then.h"; sourceTree = ""; }; C464045DBB3B085685C9413C72AF3D32 /* GIDSignInPreferences.h */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.h; name = GIDSignInPreferences.h; path = GoogleSignIn/Sources/GIDSignInPreferences.h; sourceTree = ""; }; - C561CE64156BF3AB8CE15186DD0A9B1D /* FIRCLSUnwind.c */ = {isa = PBXFileReference; includeInIndex = 1; name = FIRCLSUnwind.c; path = Crashlytics/Crashlytics/Unwind/FIRCLSUnwind.c; sourceTree = ""; }; + C561CE64156BF3AB8CE15186DD0A9B1D /* FIRCLSUnwind.c */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.c; name = FIRCLSUnwind.c; path = Crashlytics/Crashlytics/Unwind/FIRCLSUnwind.c; sourceTree = ""; }; C5895DB5602365D15A43C701D2107CB5 /* GULNSData+zlib.h */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.h; name = "GULNSData+zlib.h"; path = "GoogleUtilities/NSData+zlib/Public/GoogleUtilities/GULNSData+zlib.h"; sourceTree = ""; }; C58AF4CB3C7EBE0731E7A736F4B8C72C /* OIDAuthState.m */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.objc; name = OIDAuthState.m; path = Source/AppAuthCore/OIDAuthState.m; sourceTree = ""; }; C5905CCAD8418A07160BFD461B9015F7 /* Kingfisher-Info.plist */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = text.plist.xml; path = "Kingfisher-Info.plist"; sourceTree = ""; }; @@ -3276,9 +3278,9 @@ C97D2785E63873631156EFDFC3E9F877 /* FIRCLSRecordHost.m */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.objc; name = FIRCLSRecordHost.m; path = Crashlytics/Crashlytics/Models/Record/FIRCLSRecordHost.m; sourceTree = ""; }; C9A1D35C31B61F7695B1849B07BB84EF /* FirebaseCrashlytics.h */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.h; name = FirebaseCrashlytics.h; path = Crashlytics/Crashlytics/Public/FirebaseCrashlytics/FirebaseCrashlytics.h; sourceTree = ""; }; C9BEE9B5D93FA857355F3617E570D8E0 /* KFImage.swift */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.swift; name = KFImage.swift; path = Sources/SwiftUI/KFImage.swift; sourceTree = ""; }; - C9D12B64018843E62C7FE6B4C07AD205 /* ja.lproj */ = {isa = PBXFileReference; includeInIndex = 1; name = ja.lproj; path = GoogleSignIn/Sources/Strings/ja.lproj; sourceTree = ""; }; - CA3B6E14FBB7B230DD6DC51950677D47 /* vi.lproj */ = {isa = PBXFileReference; includeInIndex = 1; name = vi.lproj; path = GoogleSignIn/Sources/Strings/vi.lproj; sourceTree = ""; }; - CAD2A97095F6923B669552A2A6AD07F0 /* RLMDecimal128.mm */ = {isa = PBXFileReference; includeInIndex = 1; name = RLMDecimal128.mm; path = Realm/RLMDecimal128.mm; sourceTree = ""; }; + C9D12B64018843E62C7FE6B4C07AD205 /* ja.lproj */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = folder; name = ja.lproj; path = GoogleSignIn/Sources/Strings/ja.lproj; sourceTree = ""; }; + CA3B6E14FBB7B230DD6DC51950677D47 /* vi.lproj */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = folder; name = vi.lproj; path = GoogleSignIn/Sources/Strings/vi.lproj; sourceTree = ""; }; + CAD2A97095F6923B669552A2A6AD07F0 /* RLMDecimal128.mm */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.cpp.objcpp; name = RLMDecimal128.mm; path = Realm/RLMDecimal128.mm; sourceTree = ""; }; CB244C4B17FB82973A42D417A2382BCA /* FIRInstallationsIIDTokenStore.h */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.h; name = FIRInstallationsIIDTokenStore.h; path = FirebaseInstallations/Source/Library/IIDMigration/FIRInstallationsIIDTokenStore.h; sourceTree = ""; }; CB8D068E27E583652ECD1A1E924E794F /* FIRCLSReportManager_Private.h */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.h; name = FIRCLSReportManager_Private.h; path = Crashlytics/Crashlytics/Controllers/FIRCLSReportManager_Private.h; sourceTree = ""; }; CBAAA0405EE667378B0877884E76FDEF /* GDTCORLifecycle.m */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.objc; name = GDTCORLifecycle.m; path = GoogleDataTransport/GDTCORLibrary/GDTCORLifecycle.m; sourceTree = ""; }; @@ -3315,9 +3317,9 @@ D1CBC8C232B19412C16EBA73D041CF70 /* ParameterEncoder.swift */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.swift; name = ParameterEncoder.swift; path = Source/ParameterEncoder.swift; sourceTree = ""; }; D2067F44CFF3D5F2FD2539A44D8DFB6B /* FBLPromises.h */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.h; name = FBLPromises.h; path = Sources/FBLPromises/include/FBLPromises.h; sourceTree = ""; }; D288F924C6C97B93ABBC65EDFC411543 /* HTTPHeaders.swift */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.swift; name = HTTPHeaders.swift; path = Source/HTTPHeaders.swift; sourceTree = ""; }; - D2C8FA05452026D3737414D1E722A223 /* ru.lproj */ = {isa = PBXFileReference; includeInIndex = 1; name = ru.lproj; path = GoogleSignIn/Sources/Strings/ru.lproj; sourceTree = ""; }; + D2C8FA05452026D3737414D1E722A223 /* ru.lproj */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = folder; name = ru.lproj; path = GoogleSignIn/Sources/Strings/ru.lproj; sourceTree = ""; }; D305C4911213823A4EAC77D2DE409722 /* RLMUser_Private.h */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.h; name = RLMUser_Private.h; path = include/RLMUser_Private.h; sourceTree = ""; }; - D30DC69FF574842074E91B9ED44E6902 /* RLMObjectSchema.mm */ = {isa = PBXFileReference; includeInIndex = 1; name = RLMObjectSchema.mm; path = Realm/RLMObjectSchema.mm; sourceTree = ""; }; + D30DC69FF574842074E91B9ED44E6902 /* RLMObjectSchema.mm */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.cpp.objcpp; name = RLMObjectSchema.mm; path = Realm/RLMObjectSchema.mm; sourceTree = ""; }; D311E5D00287F2ADE390A2553D29CF64 /* GDTCORTransformer.h */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.h; name = GDTCORTransformer.h; path = GoogleDataTransport/GDTCORLibrary/Private/GDTCORTransformer.h; sourceTree = ""; }; D321C8DB0CF23841C882C456F3BF0220 /* GIDSignInInternalOptions.h */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.h; name = GIDSignInInternalOptions.h; path = GoogleSignIn/Sources/GIDSignInInternalOptions.h; sourceTree = ""; }; D34D635D859B2581145C66E13C0820B2 /* GIDSignInButton.h */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.h; name = GIDSignInButton.h; path = GoogleSignIn/Sources/Public/GoogleSignIn/GIDSignInButton.h; sourceTree = ""; }; @@ -3330,21 +3332,21 @@ D48D572147DCF32B2D91453346B48049 /* FIRBundleUtil.h */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.h; name = FIRBundleUtil.h; path = FirebaseCore/Sources/FIRBundleUtil.h; sourceTree = ""; }; D49AC486560EC5A54C9B6D7467CEB185 /* GoogleSignIn-dummy.m */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.objc; path = "GoogleSignIn-dummy.m"; sourceTree = ""; }; D49DADA4F2F070588427E8FCC6CE9EB5 /* FIRCLSURLBuilder.m */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.objc; name = FIRCLSURLBuilder.m; path = Crashlytics/Shared/FIRCLSNetworking/FIRCLSURLBuilder.m; sourceTree = ""; }; - D4A7351431A260886B0935832FBF9B91 /* RLMAsyncTask.mm */ = {isa = PBXFileReference; includeInIndex = 1; name = RLMAsyncTask.mm; path = Realm/RLMAsyncTask.mm; sourceTree = ""; }; + D4A7351431A260886B0935832FBF9B91 /* RLMAsyncTask.mm */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.cpp.objcpp; name = RLMAsyncTask.mm; path = Realm/RLMAsyncTask.mm; sourceTree = ""; }; D4BB65EB911532CEF50A2A548D692C64 /* Promise+Timeout.swift */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.swift; name = "Promise+Timeout.swift"; path = "Sources/Promises/Promise+Timeout.swift"; sourceTree = ""; }; - D4DCB609E3BD33D1C3EE2C8BFE17D878 /* en.lproj */ = {isa = PBXFileReference; includeInIndex = 1; name = en.lproj; path = GoogleSignIn/Sources/Strings/en.lproj; sourceTree = ""; }; + D4DCB609E3BD33D1C3EE2C8BFE17D878 /* en.lproj */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = folder; name = en.lproj; path = GoogleSignIn/Sources/Strings/en.lproj; sourceTree = ""; }; D4DEF7082687F6F99A398769879FC68D /* GULSceneDelegateSwizzler.h */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.h; name = GULSceneDelegateSwizzler.h; path = GoogleUtilities/AppDelegateSwizzler/Public/GoogleUtilities/GULSceneDelegateSwizzler.h; sourceTree = ""; }; D4E7F7EA9F57CA2565BF8BCD18ABF6C4 /* OIDFieldMapping.m */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.objc; name = OIDFieldMapping.m; path = Source/AppAuthCore/OIDFieldMapping.m; sourceTree = ""; }; D4F111E8B54A24CA65E91B80199B109A /* GTMAppAuth.h */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.h; name = GTMAppAuth.h; path = GTMAppAuth/Sources/Public/GTMAppAuth/GTMAppAuth.h; sourceTree = ""; }; D52415CFF314D068FFD62D5168B56FFF /* FIRCLSFABHost.h */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.h; name = FIRCLSFABHost.h; path = Crashlytics/Shared/FIRCLSFABHost.h; sourceTree = ""; }; - D53EE2BC720BA3959560DC4F231B2F51 /* realm-monorepo.xcframework */ = {isa = PBXFileReference; includeInIndex = 1; name = "realm-monorepo.xcframework"; path = "core/realm-monorepo.xcframework"; sourceTree = ""; }; - D57493D99DC3BD06118308AF346018AE /* PrivacyInfo.xcprivacy */ = {isa = PBXFileReference; includeInIndex = 1; name = PrivacyInfo.xcprivacy; path = Sources/Promises/Resources/PrivacyInfo.xcprivacy; sourceTree = ""; }; + D53EE2BC720BA3959560DC4F231B2F51 /* realm-monorepo.xcframework */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = wrapper.xcframework; name = "realm-monorepo.xcframework"; path = "core/realm-monorepo.xcframework"; sourceTree = ""; }; + D57493D99DC3BD06118308AF346018AE /* PrivacyInfo.xcprivacy */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = text.xml; name = PrivacyInfo.xcprivacy; path = Sources/Promises/Resources/PrivacyInfo.xcprivacy; sourceTree = ""; }; D58F39A57931497A01FE25F9BABF1BFF /* FIRCLSDataCollectionArbiter.m */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.objc; name = FIRCLSDataCollectionArbiter.m; path = Crashlytics/Crashlytics/DataCollection/FIRCLSDataCollectionArbiter.m; sourceTree = ""; }; D5980F1796E0567022E150764F028FF4 /* GULAppEnvironmentUtil.h */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.h; name = GULAppEnvironmentUtil.h; path = GoogleUtilities/Environment/Public/GoogleUtilities/GULAppEnvironmentUtil.h; sourceTree = ""; }; D5CB68C724AFFE5793C8FA4C2646CA33 /* Pods-pochakTests.modulemap */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.module; path = "Pods-pochakTests.modulemap"; sourceTree = ""; }; D5F4BB0C7A4DFF88D0742B0DFB0F5167 /* _ObjC_HeartbeatController.swift */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.swift; name = _ObjC_HeartbeatController.swift; path = FirebaseCore/Internal/Sources/HeartbeatLogging/_ObjC_HeartbeatController.swift; sourceTree = ""; }; D608AC6DAE12F59D21B7B4437650F064 /* FIRCLSSettingsManager.m */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.objc; name = FIRCLSSettingsManager.m; path = Crashlytics/Crashlytics/Settings/FIRCLSSettingsManager.m; sourceTree = ""; }; - D628C7745CE2550427B985D7BD89A907 /* ms.lproj */ = {isa = PBXFileReference; includeInIndex = 1; name = ms.lproj; path = GoogleSignIn/Sources/Strings/ms.lproj; sourceTree = ""; }; + D628C7745CE2550427B985D7BD89A907 /* ms.lproj */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = folder; name = ms.lproj; path = GoogleSignIn/Sources/Strings/ms.lproj; sourceTree = ""; }; D641CF4E1BC547C6648F88FCD39CD2A0 /* PropertyAccessors.swift */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.swift; name = PropertyAccessors.swift; path = RealmSwift/Impl/PropertyAccessors.swift; sourceTree = ""; }; D647EA2E242A43204FBB2304CBB0F261 /* GoogleSignInButton.swift */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.swift; name = GoogleSignInButton.swift; path = GoogleSignInSwift/Sources/GoogleSignInButton.swift; sourceTree = ""; }; D6D8FDA65D8ADB338B5066797E8068AA /* GULHeartbeatDateStorable.h */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.h; name = GULHeartbeatDateStorable.h; path = GoogleUtilities/Environment/Public/GoogleUtilities/GULHeartbeatDateStorable.h; sourceTree = ""; }; @@ -3357,26 +3359,26 @@ D823C8B80AB7AB0AC4E8FA85FAC1DA83 /* TMBar+Templates.swift */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.swift; name = "TMBar+Templates.swift"; path = "Sources/Tabman/Bar/TMBar+Templates.swift"; sourceTree = ""; }; D8463EDC988539BDB7D73830036B5F9C /* TMSystemBar.swift */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.swift; name = TMSystemBar.swift; path = Sources/Tabman/Bar/BarExtensions/SystemBar/TMSystemBar.swift; sourceTree = ""; }; D853C2CE4D9FA0DF905A43218328823E /* Pods-pochak-pochakUITests-umbrella.h */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.h; path = "Pods-pochak-pochakUITests-umbrella.h"; sourceTree = ""; }; - D8BF30B817BC0B516ED1CF603772B71D /* ca.lproj */ = {isa = PBXFileReference; includeInIndex = 1; name = ca.lproj; path = GoogleSignIn/Sources/Strings/ca.lproj; sourceTree = ""; }; - D9169059198BC8940078EDE4ABDC6C4B /* RLMObject.mm */ = {isa = PBXFileReference; includeInIndex = 1; name = RLMObject.mm; path = Realm/RLMObject.mm; sourceTree = ""; }; + D8BF30B817BC0B516ED1CF603772B71D /* ca.lproj */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = folder; name = ca.lproj; path = GoogleSignIn/Sources/Strings/ca.lproj; sourceTree = ""; }; + D9169059198BC8940078EDE4ABDC6C4B /* RLMObject.mm */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.cpp.objcpp; name = RLMObject.mm; path = Realm/RLMObject.mm; sourceTree = ""; }; D9312C6D969959936F1F970ED825D5B3 /* FBLPromiseError.h */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.h; name = FBLPromiseError.h; path = Sources/FBLPromises/include/FBLPromiseError.h; sourceTree = ""; }; D9452EE047C6A5ED5C795D5743F48FFD /* PromiseError.swift */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.swift; name = PromiseError.swift; path = Sources/Promises/PromiseError.swift; sourceTree = ""; }; D9617C8FFD5F3A9150F42018EEACD5D6 /* PromisesSwift-prefix.pch */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.h; path = "PromisesSwift-prefix.pch"; sourceTree = ""; }; D98872BF0F876951A063A20968BC888F /* pb_common.h */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.h; path = pb_common.h; sourceTree = ""; }; D9D852C1D9F4331AC230EDCAEA7AE3DA /* FIRLogger.h */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.h; name = FIRLogger.h; path = FirebaseCore/Extension/FIRLogger.h; sourceTree = ""; }; - DA0E1784D6BC8C64C2C1CC48838D3F87 /* RLMUtil.mm */ = {isa = PBXFileReference; includeInIndex = 1; name = RLMUtil.mm; path = Realm/RLMUtil.mm; sourceTree = ""; }; + DA0E1784D6BC8C64C2C1CC48838D3F87 /* RLMUtil.mm */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.cpp.objcpp; name = RLMUtil.mm; path = Realm/RLMUtil.mm; sourceTree = ""; }; DA25C14C5500C9954BCDE54EE48C2BE9 /* AutoInsetter.swift */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.swift; name = AutoInsetter.swift; path = Sources/Tabman/AutoInsetter/AutoInsetter.swift; sourceTree = ""; }; DA2864BDA82ABDEF9F353CEF13CEAE3A /* Pageboy.debug.xcconfig */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = text.xcconfig; path = Pageboy.debug.xcconfig; sourceTree = ""; }; DA43C95995F3EAE6A4E4E19258566210 /* RealmSwift.debug.xcconfig */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = text.xcconfig; path = RealmSwift.debug.xcconfig; sourceTree = ""; }; DA5DE26336ED5AB92C92F9964E1964AD /* FIRStackFrame_Private.h */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.h; name = FIRStackFrame_Private.h; path = Crashlytics/Crashlytics/Private/FIRStackFrame_Private.h; sourceTree = ""; }; DAC09FFC5140B6E468768AC70F8DBD14 /* GULKeychainStorage.h */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.h; name = GULKeychainStorage.h; path = GoogleUtilities/Environment/Public/GoogleUtilities/GULKeychainStorage.h; sourceTree = ""; }; - DB044703EF94320EA65C02557FBD869A /* Pods-pochakTests */ = {isa = PBXFileReference; explicitFileType = wrapper.framework; includeInIndex = 0; name = "Pods-pochakTests"; path = Pods_pochakTests.framework; sourceTree = BUILT_PRODUCTS_DIR; }; + DB044703EF94320EA65C02557FBD869A /* Pods_pochakTests.framework */ = {isa = PBXFileReference; explicitFileType = wrapper.framework; includeInIndex = 0; path = Pods_pochakTests.framework; sourceTree = BUILT_PRODUCTS_DIR; }; DB18670C881180CE3282436750C79D8A /* FIRDependency.m */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.objc; name = FIRDependency.m; path = FirebaseCore/Sources/FIRDependency.m; sourceTree = ""; }; DB6E69E9D70C7DB81512607DEE056C79 /* FIRCLSMachOBinary.m */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.objc; name = FIRCLSMachOBinary.m; path = Crashlytics/Shared/FIRCLSMachO/FIRCLSMachOBinary.m; sourceTree = ""; }; - DBABD7EB88DB93CCBADB7166B4261F33 /* GoogleAppMeasurement.xcframework */ = {isa = PBXFileReference; includeInIndex = 1; name = GoogleAppMeasurement.xcframework; path = Frameworks/GoogleAppMeasurement.xcframework; sourceTree = ""; }; + DBABD7EB88DB93CCBADB7166B4261F33 /* GoogleAppMeasurement.xcframework */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = wrapper.xcframework; name = GoogleAppMeasurement.xcframework; path = Frameworks/GoogleAppMeasurement.xcframework; sourceTree = ""; }; DC2F84CD9ACB9AAFEAE8085B22877E95 /* Alamofire.swift */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.swift; name = Alamofire.swift; path = Source/Alamofire.swift; sourceTree = ""; }; - DC699E56ED10DD28E4347A4B7647FA6A /* th.lproj */ = {isa = PBXFileReference; includeInIndex = 1; name = th.lproj; path = GoogleSignIn/Sources/Strings/th.lproj; sourceTree = ""; }; - DC7C98C16DCA2959B0A7F51A8C78DBA8 /* FIRCLSThreadState.c */ = {isa = PBXFileReference; includeInIndex = 1; name = FIRCLSThreadState.c; path = Crashlytics/Crashlytics/Helpers/FIRCLSThreadState.c; sourceTree = ""; }; + DC699E56ED10DD28E4347A4B7647FA6A /* th.lproj */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = folder; name = th.lproj; path = GoogleSignIn/Sources/Strings/th.lproj; sourceTree = ""; }; + DC7C98C16DCA2959B0A7F51A8C78DBA8 /* FIRCLSThreadState.c */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.c; name = FIRCLSThreadState.c; path = Crashlytics/Crashlytics/Helpers/FIRCLSThreadState.c; sourceTree = ""; }; DC89619491121E558B235EF0D2B5D149 /* FIRCLSFABHost.m */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.objc; name = FIRCLSFABHost.m; path = Crashlytics/Shared/FIRCLSFABHost.m; sourceTree = ""; }; DC8994E318D02AD764CCF659F9E464FA /* Tabman-prefix.pch */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.h; path = "Tabman-prefix.pch"; sourceTree = ""; }; DCD24DBC9741C6FDEB0D6378CE46DE7C /* FIRCLSMetricKitManager.m */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.objc; name = FIRCLSMetricKitManager.m; path = Crashlytics/Crashlytics/Controllers/FIRCLSMetricKitManager.m; sourceTree = ""; }; @@ -3392,11 +3394,11 @@ DEC76F69D5C87DED22FD4AAEC594E933 /* FBLPromise+Wrap.m */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.objc; name = "FBLPromise+Wrap.m"; path = "Sources/FBLPromises/FBLPromise+Wrap.m"; sourceTree = ""; }; DED895AEC1FD6152877D0CF04611F5D7 /* GDTCORDirectorySizeTracker.m */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.objc; name = GDTCORDirectorySizeTracker.m; path = GoogleDataTransport/GDTCORLibrary/GDTCORDirectorySizeTracker.m; sourceTree = ""; }; DF0E5FC1120BC5DFC7101930E9D83FF9 /* Tabman-Info.plist */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = text.plist.xml; path = "Tabman-Info.plist"; sourceTree = ""; }; - DF490DB4087B8385B21187A83ADA17D1 /* RLMAnalytics.mm */ = {isa = PBXFileReference; includeInIndex = 1; name = RLMAnalytics.mm; path = Realm/RLMAnalytics.mm; sourceTree = ""; }; + DF490DB4087B8385B21187A83ADA17D1 /* RLMAnalytics.mm */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.cpp.objcpp; name = RLMAnalytics.mm; path = Realm/RLMAnalytics.mm; sourceTree = ""; }; DF83D3486F736F1538D7EA66EC86FD19 /* RolloutAssignment.swift */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.swift; name = RolloutAssignment.swift; path = FirebaseRemoteConfig/Interop/RolloutAssignment.swift; sourceTree = ""; }; DFC88C5D3B1549E1FB28A4165B2BE27F /* Filter.swift */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.swift; name = Filter.swift; path = Sources/Image/Filter.swift; sourceTree = ""; }; E01516911DB27EA2D6785F77B643CBB4 /* KFImageRenderer.swift */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.swift; name = KFImageRenderer.swift; path = Sources/SwiftUI/KFImageRenderer.swift; sourceTree = ""; }; - E061EF592CF6B6E48A765ED69278D5D3 /* pb_decode.c */ = {isa = PBXFileReference; includeInIndex = 1; path = pb_decode.c; sourceTree = ""; }; + E061EF592CF6B6E48A765ED69278D5D3 /* pb_decode.c */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.c; path = pb_decode.c; sourceTree = ""; }; E0E34DE1D316E8EDAFDC5AB0AF18D130 /* GoogleSignIn.release.xcconfig */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = text.xcconfig; path = GoogleSignIn.release.xcconfig; sourceTree = ""; }; E19C81FDDA6D2DBE2E796AC2C5623DEF /* Pods-pochak-pochakUITests-dummy.m */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.objc; path = "Pods-pochak-pochakUITests-dummy.m"; sourceTree = ""; }; E1B8FEA34988230436D41D64B3922443 /* ImageView+Kingfisher.swift */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.swift; name = "ImageView+Kingfisher.swift"; path = "Sources/Extensions/ImageView+Kingfisher.swift"; sourceTree = ""; }; @@ -3407,8 +3409,8 @@ E2444BD018F1EF1F2C4445D650C24A37 /* OperationQueue+Alamofire.swift */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.swift; name = "OperationQueue+Alamofire.swift"; path = "Source/OperationQueue+Alamofire.swift"; sourceTree = ""; }; E26D48C185182491FA0665C1E71D4CBB /* FBLPromise+Recover.h */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.h; name = "FBLPromise+Recover.h"; path = "Sources/FBLPromises/include/FBLPromise+Recover.h"; sourceTree = ""; }; E2A2D80BD2C1B308C1628BBDB1408214 /* TMAnimation.swift */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.swift; name = TMAnimation.swift; path = Sources/Tabman/Bar/TMAnimation.swift; sourceTree = ""; }; - E2B63D462DB7F827C4B11FD51E4F8E2D /* FirebaseCore */ = {isa = PBXFileReference; explicitFileType = wrapper.framework; includeInIndex = 0; name = FirebaseCore; path = FirebaseCore.framework; sourceTree = BUILT_PRODUCTS_DIR; }; - E2BFA7A7384C05FEF203586887A431CE /* PrivacyInfo.xcprivacy */ = {isa = PBXFileReference; includeInIndex = 1; name = PrivacyInfo.xcprivacy; path = FirebaseCore/Sources/Resources/PrivacyInfo.xcprivacy; sourceTree = ""; }; + E2B63D462DB7F827C4B11FD51E4F8E2D /* FirebaseCore.framework */ = {isa = PBXFileReference; explicitFileType = wrapper.framework; includeInIndex = 0; path = FirebaseCore.framework; sourceTree = BUILT_PRODUCTS_DIR; }; + E2BFA7A7384C05FEF203586887A431CE /* PrivacyInfo.xcprivacy */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = text.xml; name = PrivacyInfo.xcprivacy; path = FirebaseCore/Sources/Resources/PrivacyInfo.xcprivacy; sourceTree = ""; }; E30192AF78CFEC3C215DDB1FC9E9FBDC /* NavigationDirection.swift */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.swift; name = NavigationDirection.swift; path = Sources/Pageboy/Model/NavigationDirection.swift; sourceTree = ""; }; E303AF9FFABE8C63652D039F8FBEE3B1 /* RLMSwiftCollectionBase.h */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.h; name = RLMSwiftCollectionBase.h; path = include/RLMSwiftCollectionBase.h; sourceTree = ""; }; E3175885EC9C4C0EA6733DC09B799E89 /* OIDAuthorizationService+IOS.m */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.objc; name = "OIDAuthorizationService+IOS.m"; path = "Source/AppAuth/iOS/OIDAuthorizationService+IOS.m"; sourceTree = ""; }; @@ -3417,19 +3419,19 @@ E3D921EFB4D2BC8331E0F0B6CF2DEC53 /* OIDErrorUtilities.m */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.objc; name = OIDErrorUtilities.m; path = Source/AppAuthCore/OIDErrorUtilities.m; sourceTree = ""; }; E408EA3795752A74F3EB5224B583F6D7 /* Promise+Race.swift */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.swift; name = "Promise+Race.swift"; path = "Sources/Promises/Promise+Race.swift"; sourceTree = ""; }; E44478DF8BAA89B31A40C511BF58D204 /* GDTCOREventDropReason.h */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.h; name = GDTCOREventDropReason.h; path = GoogleDataTransport/GDTCORLibrary/Internal/GDTCOREventDropReason.h; sourceTree = ""; }; - E464A0D19319427931E4845AD5768085 /* fr_CA.lproj */ = {isa = PBXFileReference; includeInIndex = 1; name = fr_CA.lproj; path = GoogleSignIn/Sources/Strings/fr_CA.lproj; sourceTree = ""; }; + E464A0D19319427931E4845AD5768085 /* fr_CA.lproj */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = folder; name = fr_CA.lproj; path = GoogleSignIn/Sources/Strings/fr_CA.lproj; sourceTree = ""; }; E4820F8BF2B485F6EBA455DE3A5E054D /* GTMSessionFetcherLogging.h */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.h; name = GTMSessionFetcherLogging.h; path = Sources/Core/Public/GTMSessionFetcher/GTMSessionFetcherLogging.h; sourceTree = ""; }; E5065378382C7C0740860F489DCF9FC6 /* GIDSignInPreferences.m */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.objc; name = GIDSignInPreferences.m; path = GoogleSignIn/Sources/GIDSignInPreferences.m; sourceTree = ""; }; E5196D7729352BB552C9C5C661FCBF16 /* RLMApp.h */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.h; name = RLMApp.h; path = include/RLMApp.h; sourceTree = ""; }; E59592604D5CCB70F11EB2FBA336DCDD /* GDTCORMetrics+GDTCCTSupport.m */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.objc; name = "GDTCORMetrics+GDTCCTSupport.m"; path = "GoogleDataTransport/GDTCCTLibrary/GDTCORMetrics+GDTCCTSupport.m"; sourceTree = ""; }; E5A7A0832F5C8AC0A1FB4EC662C0E16F /* RLMSupport.swift */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.swift; name = RLMSupport.swift; path = Realm/Swift/RLMSupport.swift; sourceTree = ""; }; - E5BA41B7F2E1FE47F9ABCAC27C9E4281 /* GoogleSignIn-GoogleSignIn */ = {isa = PBXFileReference; explicitFileType = wrapper.cfbundle; includeInIndex = 0; name = "GoogleSignIn-GoogleSignIn"; path = GoogleSignIn.bundle; sourceTree = BUILT_PRODUCTS_DIR; }; + E5BA41B7F2E1FE47F9ABCAC27C9E4281 /* GoogleSignIn.bundle */ = {isa = PBXFileReference; explicitFileType = wrapper.cfbundle; includeInIndex = 0; path = GoogleSignIn.bundle; sourceTree = BUILT_PRODUCTS_DIR; }; E5C75315FAF75CD910866ABB5BAC25AC /* OIDURLSessionProvider.h */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.h; name = OIDURLSessionProvider.h; path = Source/AppAuthCore/OIDURLSessionProvider.h; sourceTree = ""; }; E5CAF7DF3D308DB218F33D79C4436A5B /* Storage.swift */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.swift; name = Storage.swift; path = FirebaseCore/Internal/Sources/HeartbeatLogging/Storage.swift; sourceTree = ""; }; E60B40B980FA9088C3EB85FEB344D1D0 /* OIDServiceConfiguration.m */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.objc; name = OIDServiceConfiguration.m; path = Source/AppAuthCore/OIDServiceConfiguration.m; sourceTree = ""; }; E64BED20C218391602095F00071177E4 /* GDTCORTransport.h */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.h; name = GDTCORTransport.h; path = GoogleDataTransport/GDTCORLibrary/Public/GoogleDataTransport/GDTCORTransport.h; sourceTree = ""; }; - E66E540B59762E6A255A4B1D377A9201 /* RLMSyncConfiguration.mm */ = {isa = PBXFileReference; includeInIndex = 1; name = RLMSyncConfiguration.mm; path = Realm/RLMSyncConfiguration.mm; sourceTree = ""; }; - E6B05EFBF9AF154B4D5826B8A618E0B3 /* hr.lproj */ = {isa = PBXFileReference; includeInIndex = 1; name = hr.lproj; path = GoogleSignIn/Sources/Strings/hr.lproj; sourceTree = ""; }; + E66E540B59762E6A255A4B1D377A9201 /* RLMSyncConfiguration.mm */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.cpp.objcpp; name = RLMSyncConfiguration.mm; path = Realm/RLMSyncConfiguration.mm; sourceTree = ""; }; + E6B05EFBF9AF154B4D5826B8A618E0B3 /* hr.lproj */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = folder; name = hr.lproj; path = GoogleSignIn/Sources/Strings/hr.lproj; sourceTree = ""; }; E6B271CC02A2D866A1B894F8863B7C59 /* PageboyViewControllerDelegate.swift */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.swift; name = PageboyViewControllerDelegate.swift; path = Sources/Pageboy/Protocols/PageboyViewControllerDelegate.swift; sourceTree = ""; }; E6C19CFC72E813820203DB1353F6F168 /* FIRInstallationsLogger.h */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.h; name = FIRInstallationsLogger.h; path = FirebaseInstallations/Source/Library/FIRInstallationsLogger.h; sourceTree = ""; }; E746BA2D48EFF6F2EEDEFE4B3BF58BFB /* GoogleSignIn-Info.plist */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = text.plist.xml; path = "GoogleSignIn-Info.plist"; sourceTree = ""; }; @@ -3437,7 +3439,7 @@ E77F6E8E990881D5189D85A8770A5EDD /* RLMValue.h */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.h; name = RLMValue.h; path = include/RLMValue.h; sourceTree = ""; }; E7914365E2EC1397C021599AE2E6A6B1 /* GIDProfileData_Private.h */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.h; name = GIDProfileData_Private.h; path = GoogleSignIn/Sources/GIDProfileData_Private.h; sourceTree = ""; }; E7A94418E0861FC00959C9871BD2F94B /* FIRCrashlyticsReport.h */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.h; name = FIRCrashlyticsReport.h; path = Crashlytics/Crashlytics/Public/FirebaseCrashlytics/FIRCrashlyticsReport.h; sourceTree = ""; }; - E8329EE4273DECB23F1A48D576EC11BA /* RLMObservation.mm */ = {isa = PBXFileReference; includeInIndex = 1; name = RLMObservation.mm; path = Realm/RLMObservation.mm; sourceTree = ""; }; + E8329EE4273DECB23F1A48D576EC11BA /* RLMObservation.mm */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.cpp.objcpp; name = RLMObservation.mm; path = Realm/RLMObservation.mm; sourceTree = ""; }; E849CF5A6864C187BB6A584ACCB30403 /* FIRComponent.m */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.objc; name = FIRComponent.m; path = FirebaseCore/Sources/FIRComponent.m; sourceTree = ""; }; E88C01CC9516A310E6B02C6A33369236 /* FirebaseCoreExtension.debug.xcconfig */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = text.xcconfig; path = FirebaseCoreExtension.debug.xcconfig; sourceTree = ""; }; E8A9006478E5EBF840510539F2EE00F1 /* FIRCLSNetworkOperation.m */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.objc; name = FIRCLSNetworkOperation.m; path = Crashlytics/Crashlytics/Settings/Operations/FIRCLSNetworkOperation.m; sourceTree = ""; }; @@ -3457,41 +3459,41 @@ EBEE80764983ECFAB8B7AB5E6622BD8F /* RLMObjectSchema.h */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.h; name = RLMObjectSchema.h; path = include/RLMObjectSchema.h; sourceTree = ""; }; EC2E30D393EB04DA25DE52C2417912E4 /* Optional.swift */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.swift; name = Optional.swift; path = RealmSwift/Optional.swift; sourceTree = ""; }; EC4F5506B10ADD7559074FE09E509C6E /* SessionsSubscriber.swift */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.swift; name = SessionsSubscriber.swift; path = FirebaseSessions/Sources/Public/SessionsSubscriber.swift; sourceTree = ""; }; - EC8B563DCE46A462F19DEE8D9B298476 /* FIRCLSCrashedMarkerFile.c */ = {isa = PBXFileReference; includeInIndex = 1; name = FIRCLSCrashedMarkerFile.c; path = Crashlytics/Crashlytics/Components/FIRCLSCrashedMarkerFile.c; sourceTree = ""; }; - ECAC028550A03412C51913B85686D98B /* FirebaseCoreExtension-FirebaseCoreExtension_Privacy */ = {isa = PBXFileReference; explicitFileType = wrapper.cfbundle; includeInIndex = 0; name = "FirebaseCoreExtension-FirebaseCoreExtension_Privacy"; path = FirebaseCoreExtension_Privacy.bundle; sourceTree = BUILT_PRODUCTS_DIR; }; + EC8B563DCE46A462F19DEE8D9B298476 /* FIRCLSCrashedMarkerFile.c */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.c; name = FIRCLSCrashedMarkerFile.c; path = Crashlytics/Crashlytics/Components/FIRCLSCrashedMarkerFile.c; sourceTree = ""; }; + ECAC028550A03412C51913B85686D98B /* FirebaseCoreExtension_Privacy.bundle */ = {isa = PBXFileReference; explicitFileType = wrapper.cfbundle; includeInIndex = 0; path = FirebaseCoreExtension_Privacy.bundle; sourceTree = BUILT_PRODUCTS_DIR; }; ECF54E89173CACB81DF57E1AC6FB5948 /* Promise+Reduce.swift */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.swift; name = "Promise+Reduce.swift"; path = "Sources/Promises/Promise+Reduce.swift"; sourceTree = ""; }; ED298FCBDE380F62D37C0F30FF31396E /* GIDSignInResult_Private.h */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.h; name = GIDSignInResult_Private.h; path = GoogleSignIn/Sources/GIDSignInResult_Private.h; sourceTree = ""; }; ED4BDE31BDFB28D479A61EEEF32DC26B /* GULAppEnvironmentUtil.m */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.objc; name = GULAppEnvironmentUtil.m; path = GoogleUtilities/Environment/GULAppEnvironmentUtil.m; sourceTree = ""; }; ED889F3395B5524BE3432645DC75C617 /* FBLPromise+Any.h */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.h; name = "FBLPromise+Any.h"; path = "Sources/FBLPromises/include/FBLPromise+Any.h"; sourceTree = ""; }; EDF3573908FBCCC07C63FC3CA5F00402 /* FIRCLSOnDemandModel.h */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.h; name = FIRCLSOnDemandModel.h; path = Crashlytics/Crashlytics/Models/FIRCLSOnDemandModel.h; sourceTree = ""; }; - EE52DB13C9D937229C5DB73B670AEE26 /* RLMError.mm */ = {isa = PBXFileReference; includeInIndex = 1; name = RLMError.mm; path = Realm/RLMError.mm; sourceTree = ""; }; + EE52DB13C9D937229C5DB73B670AEE26 /* RLMError.mm */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.cpp.objcpp; name = RLMError.mm; path = Realm/RLMError.mm; sourceTree = ""; }; EE5670BBC4141190067EF38340996F4A /* GULNetworkLoggerProtocol.h */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.h; name = GULNetworkLoggerProtocol.h; path = GoogleUtilities/Network/Public/GoogleUtilities/GULNetworkLoggerProtocol.h; sourceTree = ""; }; EEF2AF7E92B351B4068AA8778FB8FA6F /* GULNSData+zlib.m */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.objc; name = "GULNSData+zlib.m"; path = "GoogleUtilities/NSData+zlib/GULNSData+zlib.m"; sourceTree = ""; }; EEFA289146C4ABBF5678861FF10D6BDF /* FIRVersion.m */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.objc; name = FIRVersion.m; path = FirebaseCore/Sources/FIRVersion.m; sourceTree = ""; }; EF0191631A3C67B8526FEDE5DB18D1B7 /* WKInterfaceImage+Kingfisher.swift */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.swift; name = "WKInterfaceImage+Kingfisher.swift"; path = "Sources/Extensions/WKInterfaceImage+Kingfisher.swift"; sourceTree = ""; }; - EF5A476446395801C72F1BC977EAB12E /* FIRCLSSignal.c */ = {isa = PBXFileReference; includeInIndex = 1; name = FIRCLSSignal.c; path = Crashlytics/Crashlytics/Handlers/FIRCLSSignal.c; sourceTree = ""; }; + EF5A476446395801C72F1BC977EAB12E /* FIRCLSSignal.c */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.c; name = FIRCLSSignal.c; path = Crashlytics/Crashlytics/Handlers/FIRCLSSignal.c; sourceTree = ""; }; EF5B2859B7C4AD37966BC28B7B92139B /* MultipartFormData.swift */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.swift; name = MultipartFormData.swift; path = Source/MultipartFormData.swift; sourceTree = ""; }; EFD5ECBFA4874105EA8976C335BE6A48 /* GULNetworkInternal.h */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.h; name = GULNetworkInternal.h; path = GoogleUtilities/Network/GULNetworkInternal.h; sourceTree = ""; }; F0772D7148A0E297AEAA451B2626EB75 /* GIDSignIn.m */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.objc; name = GIDSignIn.m; path = GoogleSignIn/Sources/GIDSignIn.m; sourceTree = ""; }; F0C669EA198ED25761E8F226E0323684 /* FIRInstallationsBackoffController.m */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.objc; name = FIRInstallationsBackoffController.m; path = FirebaseInstallations/Source/Library/InstallationsIDController/FIRInstallationsBackoffController.m; sourceTree = ""; }; F11D6D13D4F52BEC2DAA1572355186D1 /* FIRCLSSettings.m */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.objc; name = FIRCLSSettings.m; path = Crashlytics/Crashlytics/Models/FIRCLSSettings.m; sourceTree = ""; }; - F1A6533589FB9129E1F2BF365596CA95 /* RLMPredicateUtil.mm */ = {isa = PBXFileReference; includeInIndex = 1; name = RLMPredicateUtil.mm; path = Realm/RLMPredicateUtil.mm; sourceTree = ""; }; + F1A6533589FB9129E1F2BF365596CA95 /* RLMPredicateUtil.mm */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.cpp.objcpp; name = RLMPredicateUtil.mm; path = Realm/RLMPredicateUtil.mm; sourceTree = ""; }; F1EE6D5ED74DB320558156A5494D4D0B /* FIRCrashlytics.m */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.objc; name = FIRCrashlytics.m; path = Crashlytics/Crashlytics/FIRCrashlytics.m; sourceTree = ""; }; F20B5ABFD7BE397267E1CEAC424C539A /* GTMSessionFetcherService.h */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.h; name = GTMSessionFetcherService.h; path = Sources/Core/Public/GTMSessionFetcher/GTMSessionFetcherService.h; sourceTree = ""; }; F20F144988645FC13D13CE6BF3F7CCC1 /* RingBuffer.swift */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.swift; name = RingBuffer.swift; path = FirebaseCore/Internal/Sources/HeartbeatLogging/RingBuffer.swift; sourceTree = ""; }; - F2A2152AEEEB6047176A7C04CD2365D9 /* FIRCLSMachException.c */ = {isa = PBXFileReference; includeInIndex = 1; name = FIRCLSMachException.c; path = Crashlytics/Crashlytics/Handlers/FIRCLSMachException.c; sourceTree = ""; }; + F2A2152AEEEB6047176A7C04CD2365D9 /* FIRCLSMachException.c */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.c; name = FIRCLSMachException.c; path = Crashlytics/Crashlytics/Handlers/FIRCLSMachException.c; sourceTree = ""; }; F2CDD2FDD5974E0176D6A616577BF91B /* Concurrency.swift */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.swift; name = Concurrency.swift; path = Source/Concurrency.swift; sourceTree = ""; }; F2CEA6A894B68C1B13E987B930C9AA50 /* Pageboy.modulemap */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.module; path = Pageboy.modulemap; sourceTree = ""; }; F315CF487691AE6F3A6950EC7EE63CB6 /* FIRCLSOnDemandModel_Private.h */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.h; name = FIRCLSOnDemandModel_Private.h; path = Crashlytics/Crashlytics/Private/FIRCLSOnDemandModel_Private.h; sourceTree = ""; }; F38851B7A9A96943A9061808E96BDCD1 /* FIRCLSDownloadAndSaveSettingsOperation.m */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.objc; name = FIRCLSDownloadAndSaveSettingsOperation.m; path = Crashlytics/Crashlytics/Settings/Operations/FIRCLSDownloadAndSaveSettingsOperation.m; sourceTree = ""; }; - F3C0A3CADE0B19F375B1AD407591423C /* zh_CN.lproj */ = {isa = PBXFileReference; includeInIndex = 1; name = zh_CN.lproj; path = GoogleSignIn/Sources/Strings/zh_CN.lproj; sourceTree = ""; }; + F3C0A3CADE0B19F375B1AD407591423C /* zh_CN.lproj */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = folder; name = zh_CN.lproj; path = GoogleSignIn/Sources/Strings/zh_CN.lproj; sourceTree = ""; }; F4110EF042A34812A630C04C3096D64C /* GIDGoogleUser.m */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.objc; name = GIDGoogleUser.m; path = GoogleSignIn/Sources/GIDGoogleUser.m; sourceTree = ""; }; F425BAF7F99FF8442C4A37899D2D97EA /* FirebaseCoreInternal.h */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.h; name = FirebaseCoreInternal.h; path = FirebaseCore/Extension/FirebaseCoreInternal.h; sourceTree = ""; }; F44C26969191872E5EFD5F3949B4E616 /* FIRCLSDownloadAndSaveSettingsOperation.h */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.h; name = FIRCLSDownloadAndSaveSettingsOperation.h; path = Crashlytics/Crashlytics/Settings/Operations/FIRCLSDownloadAndSaveSettingsOperation.h; sourceTree = ""; }; F460301F05676617AE042C519F60BC6F /* FIRHeartbeatLogger.h */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.h; name = FIRHeartbeatLogger.h; path = FirebaseCore/Extension/FIRHeartbeatLogger.h; sourceTree = ""; }; F479863BE3E285FD99614BC24849DF16 /* PageboyViewController+Management.swift */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.swift; name = "PageboyViewController+Management.swift"; path = "Sources/Pageboy/PageboyViewController+Management.swift"; sourceTree = ""; }; F4D85BB18AB5587E99345CAEC2C21F8A /* FirebaseSessions.modulemap */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.module; path = FirebaseSessions.modulemap; sourceTree = ""; }; - F527D303F24992D043D13BB5FB89AD32 /* pt_PT.lproj */ = {isa = PBXFileReference; includeInIndex = 1; name = pt_PT.lproj; path = GoogleSignIn/Sources/Strings/pt_PT.lproj; sourceTree = ""; }; + F527D303F24992D043D13BB5FB89AD32 /* pt_PT.lproj */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = folder; name = pt_PT.lproj; path = GoogleSignIn/Sources/Strings/pt_PT.lproj; sourceTree = ""; }; F606A40A3875EC3968E152DC35B0F01C /* OIDExternalUserAgentIOS.h */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.h; name = OIDExternalUserAgentIOS.h; path = Source/AppAuth/iOS/OIDExternalUserAgentIOS.h; sourceTree = ""; }; F616AD5810F369BBB6F83B124A28F648 /* FIRCLSReportAdapter.m */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.objc; name = FIRCLSReportAdapter.m; path = Crashlytics/Crashlytics/Models/Record/FIRCLSReportAdapter.m; sourceTree = ""; }; F61AF29A74401C7577AEC71F72891722 /* FIRCLSThreadArrayOperation.h */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.h; name = FIRCLSThreadArrayOperation.h; path = Crashlytics/Crashlytics/Operations/Symbolication/FIRCLSThreadArrayOperation.h; sourceTree = ""; }; @@ -3499,19 +3501,19 @@ F65471F96FF52FEC773EE2E0868185D2 /* SessionsDependencies.swift */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.swift; name = SessionsDependencies.swift; path = FirebaseSessions/Sources/Public/SessionsDependencies.swift; sourceTree = ""; }; F6C71005F47A730B5E491FBADA088B4F /* FIRInstallationsErrors.h */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.h; name = FIRInstallationsErrors.h; path = FirebaseInstallations/Source/Library/Public/FirebaseInstallations/FIRInstallationsErrors.h; sourceTree = ""; }; F6C8D0E505898195B09684BF19EC22FD /* KingfisherError.swift */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.swift; name = KingfisherError.swift; path = Sources/General/KingfisherError.swift; sourceTree = ""; }; - F73AA961F4AEFF2B46B00AE435DF6BE3 /* GoogleDataTransport-GoogleDataTransport_Privacy */ = {isa = PBXFileReference; explicitFileType = wrapper.cfbundle; includeInIndex = 0; name = "GoogleDataTransport-GoogleDataTransport_Privacy"; path = GoogleDataTransport_Privacy.bundle; sourceTree = BUILT_PRODUCTS_DIR; }; - F75E78BB7CD45582DEF19DA891239572 /* ro.lproj */ = {isa = PBXFileReference; includeInIndex = 1; name = ro.lproj; path = GoogleSignIn/Sources/Strings/ro.lproj; sourceTree = ""; }; + F73AA961F4AEFF2B46B00AE435DF6BE3 /* GoogleDataTransport_Privacy.bundle */ = {isa = PBXFileReference; explicitFileType = wrapper.cfbundle; includeInIndex = 0; path = GoogleDataTransport_Privacy.bundle; sourceTree = BUILT_PRODUCTS_DIR; }; + F75E78BB7CD45582DEF19DA891239572 /* ro.lproj */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = folder; name = ro.lproj; path = GoogleSignIn/Sources/Strings/ro.lproj; sourceTree = ""; }; F76183B33617D483E0126B0B225F90C8 /* OIDRegistrationRequest.m */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.objc; name = OIDRegistrationRequest.m; path = Source/AppAuthCore/OIDRegistrationRequest.m; sourceTree = ""; }; F76EDDBB6171449C4D09546DF234C40E /* GULNetworkURLSession.h */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.h; name = GULNetworkURLSession.h; path = GoogleUtilities/Network/Public/GoogleUtilities/GULNetworkURLSession.h; sourceTree = ""; }; - F785F1CA8C5A100634976C0FE807B5A7 /* FIRCLSDwarfExpressionMachine.c */ = {isa = PBXFileReference; includeInIndex = 1; name = FIRCLSDwarfExpressionMachine.c; path = Crashlytics/Crashlytics/Unwind/Dwarf/FIRCLSDwarfExpressionMachine.c; sourceTree = ""; }; + F785F1CA8C5A100634976C0FE807B5A7 /* FIRCLSDwarfExpressionMachine.c */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.c; name = FIRCLSDwarfExpressionMachine.c; path = Crashlytics/Crashlytics/Unwind/Dwarf/FIRCLSDwarfExpressionMachine.c; sourceTree = ""; }; F78701EC9A6834F5A57E35A1ECB1C076 /* OIDGrantTypes.m */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.objc; name = OIDGrantTypes.m; path = Source/AppAuthCore/OIDGrantTypes.m; sourceTree = ""; }; F7C6D0DE6EB4DCD2BD7377A43B20BA19 /* GULLoggerCodes.h */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.h; name = GULLoggerCodes.h; path = GoogleUtilities/Common/GULLoggerCodes.h; sourceTree = ""; }; - F8286C07D7947915E6E7DBA8CE9BE2A6 /* FIRCLSDataParsing.c */ = {isa = PBXFileReference; includeInIndex = 1; name = FIRCLSDataParsing.c; path = Crashlytics/Crashlytics/Unwind/Dwarf/FIRCLSDataParsing.c; sourceTree = ""; }; + F8286C07D7947915E6E7DBA8CE9BE2A6 /* FIRCLSDataParsing.c */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.c; name = FIRCLSDataParsing.c; path = Crashlytics/Crashlytics/Unwind/Dwarf/FIRCLSDataParsing.c; sourceTree = ""; }; F87AB9ABA53D88F336D630C0DE7A9D23 /* GoogleUtilities.debug.xcconfig */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = text.xcconfig; path = GoogleUtilities.debug.xcconfig; sourceTree = ""; }; F89CCF8F0CC237C0C9C47E137C38740C /* OIDAuthorizationService+IOS.h */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.h; name = "OIDAuthorizationService+IOS.h"; path = "Source/AppAuth/iOS/OIDAuthorizationService+IOS.h"; sourceTree = ""; }; - F8A118B5754BC40D1643636A4CBA29D8 /* RLMPushClient.mm */ = {isa = PBXFileReference; includeInIndex = 1; name = RLMPushClient.mm; path = Realm/RLMPushClient.mm; sourceTree = ""; }; - F8C57328DC85A5C7946B17A0DFB052E3 /* RLMUser.mm */ = {isa = PBXFileReference; includeInIndex = 1; name = RLMUser.mm; path = Realm/RLMUser.mm; sourceTree = ""; }; - F8F8F1DB071D5ECE019CCF058B2E4F0F /* PrivacyInfo.xcprivacy */ = {isa = PBXFileReference; includeInIndex = 1; name = PrivacyInfo.xcprivacy; path = spm_resources/PrivacyInfo.xcprivacy; sourceTree = ""; }; + F8A118B5754BC40D1643636A4CBA29D8 /* RLMPushClient.mm */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.cpp.objcpp; name = RLMPushClient.mm; path = Realm/RLMPushClient.mm; sourceTree = ""; }; + F8C57328DC85A5C7946B17A0DFB052E3 /* RLMUser.mm */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.cpp.objcpp; name = RLMUser.mm; path = Realm/RLMUser.mm; sourceTree = ""; }; + F8F8F1DB071D5ECE019CCF058B2E4F0F /* PrivacyInfo.xcprivacy */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = text.xml; name = PrivacyInfo.xcprivacy; path = spm_resources/PrivacyInfo.xcprivacy; sourceTree = ""; }; F908DE1BD919980BB62F4B2E1D66283E /* FirebaseCoreInternal-prefix.pch */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.h; path = "FirebaseCoreInternal-prefix.pch"; sourceTree = ""; }; F939773F93E2B755FA74BD8425748AE9 /* Security.framework */ = {isa = PBXFileReference; lastKnownFileType = wrapper.framework; name = Security.framework; path = Platforms/iPhoneOS.platform/Developer/SDKs/iPhoneOS14.0.sdk/System/Library/Frameworks/Security.framework; sourceTree = DEVELOPER_DIR; }; F981BD1631FC78FA089FFD34A97B57AF /* FIRCLSMultipartMimeStreamEncoder.m */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.objc; name = FIRCLSMultipartMimeStreamEncoder.m; path = Crashlytics/Shared/FIRCLSNetworking/FIRCLSMultipartMimeStreamEncoder.m; sourceTree = ""; }; @@ -3519,7 +3521,7 @@ FAFEA3D2810B3C860627092E4C875259 /* RLMSyncManager.h */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.h; name = RLMSyncManager.h; path = include/RLMSyncManager.h; sourceTree = ""; }; FB146ED15352702E95AD4F3F3EABC06C /* FIRCurrentDateProvider.m */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.objc; name = FIRCurrentDateProvider.m; path = FirebaseInstallations/Source/Library/InstallationsIDController/FIRCurrentDateProvider.m; sourceTree = ""; }; FB563543F540E8631FA23F20C28CCC9F /* TMHidingBar+Triggers.swift */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.swift; name = "TMHidingBar+Triggers.swift"; path = "Sources/Tabman/Bar/BarExtensions/AutoHidingBar/TMHidingBar+Triggers.swift"; sourceTree = ""; }; - FBA42C877B1CBBC5D01FA02759C1CF65 /* RLMNetworkTransport.mm */ = {isa = PBXFileReference; includeInIndex = 1; name = RLMNetworkTransport.mm; path = Realm/RLMNetworkTransport.mm; sourceTree = ""; }; + FBA42C877B1CBBC5D01FA02759C1CF65 /* RLMNetworkTransport.mm */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.cpp.objcpp; name = RLMNetworkTransport.mm; path = Realm/RLMNetworkTransport.mm; sourceTree = ""; }; FBC401A6295F79156AF60F7573E7954D /* crashlytics.nanopb.h */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.h; name = crashlytics.nanopb.h; path = Crashlytics/Protogen/nanopb/crashlytics.nanopb.h; sourceTree = ""; }; FC6A7DAA752E0176F1E7F68A8EE39EF8 /* FIRCLSContextInitData.m */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.objc; name = FIRCLSContextInitData.m; path = Crashlytics/Crashlytics/Helpers/FIRCLSContextInitData.m; sourceTree = ""; }; FC6DECCD38B72DE98C9F29CFB84E2FF8 /* FIRInstallationsAPIService.m */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.objc; name = FIRInstallationsAPIService.m; path = FirebaseInstallations/Source/Library/InstallationsAPI/FIRInstallationsAPIService.m; sourceTree = ""; }; @@ -3527,19 +3529,19 @@ FCBA50D5436117F6C55CC6965E396E3C /* RLMSet_Private.h */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.h; name = RLMSet_Private.h; path = include/RLMSet_Private.h; sourceTree = ""; }; FD1F7D07205AA9E8975B7AF5CEE12E41 /* GIDSignInCallbackSchemes.h */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.h; name = GIDSignInCallbackSchemes.h; path = GoogleSignIn/Sources/GIDSignInCallbackSchemes.h; sourceTree = ""; }; FD3F1D1EDE5E352D9FAFC6F87EBCF7B4 /* FBLPromise+Always.m */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.objc; name = "FBLPromise+Always.m"; path = "Sources/FBLPromises/FBLPromise+Always.m"; sourceTree = ""; }; - FD56AB51475BC5F592781EE2692D1412 /* GoogleSignIn */ = {isa = PBXFileReference; explicitFileType = wrapper.framework; includeInIndex = 0; name = GoogleSignIn; path = GoogleSignIn.framework; sourceTree = BUILT_PRODUCTS_DIR; }; - FD754A75CFAEF38F6AA66A814C0FA5A1 /* PrivacyInfo.xcprivacy */ = {isa = PBXFileReference; includeInIndex = 1; name = PrivacyInfo.xcprivacy; path = GoogleDataTransport/Resources/PrivacyInfo.xcprivacy; sourceTree = ""; }; + FD56AB51475BC5F592781EE2692D1412 /* GoogleSignIn.framework */ = {isa = PBXFileReference; explicitFileType = wrapper.framework; includeInIndex = 0; path = GoogleSignIn.framework; sourceTree = BUILT_PRODUCTS_DIR; }; + FD754A75CFAEF38F6AA66A814C0FA5A1 /* PrivacyInfo.xcprivacy */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = text.xml; name = PrivacyInfo.xcprivacy; path = GoogleDataTransport/Resources/PrivacyInfo.xcprivacy; sourceTree = ""; }; FDCACFA06A661B424ED5D34B3C18C5B7 /* Realm-prefix.pch */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.h; path = "Realm-prefix.pch"; sourceTree = ""; }; FDDFB8E8F02C91B49C7EFDC731D3D00A /* FIRCLSUnwind_x86.h */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.h; name = FIRCLSUnwind_x86.h; path = Crashlytics/Crashlytics/Unwind/FIRCLSUnwind_x86.h; sourceTree = ""; }; FDE6DCAB466B3A2682EA206805A06BC5 /* String+MD5.swift */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.swift; name = "String+MD5.swift"; path = "Sources/Utility/String+MD5.swift"; sourceTree = ""; }; FDE7076AC6B4C0784BF82C296DF01897 /* KFImageProtocol.swift */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.swift; name = KFImageProtocol.swift; path = Sources/SwiftUI/KFImageProtocol.swift; sourceTree = ""; }; - FE1F3593CFEB70B251F5C4E2D6A9827F /* sessions.nanopb.c */ = {isa = PBXFileReference; includeInIndex = 1; name = sessions.nanopb.c; path = FirebaseSessions/SourcesObjC/Protogen/nanopb/sessions.nanopb.c; sourceTree = ""; }; + FE1F3593CFEB70B251F5C4E2D6A9827F /* sessions.nanopb.c */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.c; name = sessions.nanopb.c; path = FirebaseSessions/SourcesObjC/Protogen/nanopb/sessions.nanopb.c; sourceTree = ""; }; FE6D60BFB4DBFCBD19A9715B8DBE91E2 /* Alamofire.modulemap */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.module; path = Alamofire.modulemap; sourceTree = ""; }; FEF95F4CE1F22BE85B322A2CDFCD3785 /* Pods-pochakTests-umbrella.h */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.h; path = "Pods-pochakTests-umbrella.h"; sourceTree = ""; }; FF03336B8456F71B5AB1E785B54D7A17 /* Tabman-umbrella.h */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.h; path = "Tabman-umbrella.h"; sourceTree = ""; }; FF2FB0AE91DF2746E84B8E6F6D3F3688 /* RLMCollection.h */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.h; name = RLMCollection.h; path = include/RLMCollection.h; sourceTree = ""; }; FF788049B50C7CA458CB28E7186110AA /* GULUserDefaults.m */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.objc; name = GULUserDefaults.m; path = GoogleUtilities/UserDefaults/GULUserDefaults.m; sourceTree = ""; }; - FF80E54D3497DD1F0939CA78D894A4CA /* zh_TW.lproj */ = {isa = PBXFileReference; includeInIndex = 1; name = zh_TW.lproj; path = GoogleSignIn/Sources/Strings/zh_TW.lproj; sourceTree = ""; }; + FF80E54D3497DD1F0939CA78D894A4CA /* zh_TW.lproj */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = folder; name = zh_TW.lproj; path = GoogleSignIn/Sources/Strings/zh_TW.lproj; sourceTree = ""; }; FF99209F293BDA808FCF1ACB986B260D /* GDTCCTUploadOperation.h */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.h; name = GDTCCTUploadOperation.h; path = GoogleDataTransport/GDTCCTLibrary/Private/GDTCCTUploadOperation.h; sourceTree = ""; }; FFF3B742DB91CC3C113DD37E825B08DD /* AppAuth.debug.xcconfig */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = text.xcconfig; path = AppAuth.debug.xcconfig; sourceTree = ""; }; /* End PBXFileReference section */ @@ -3870,7 +3872,6 @@ AAF3E732E2AD6C890D914FFBBCEED8A2 /* Support Files */, EAFDDB771661BADF8DC490C0C71917DC /* WithoutAdIdSupport */, ); - name = GoogleAppMeasurement; path = GoogleAppMeasurement; sourceTree = ""; }; @@ -3929,7 +3930,6 @@ FC67084073873D396376D6C0FB4AFB53 /* Resources */, 50D86A9EC731AD474282F30C53A8753F /* Support Files */, ); - name = GoogleSignIn; path = GoogleSignIn; sourceTree = ""; }; @@ -3997,50 +3997,49 @@ 7C7083B5CABB62C12750DDFE6981F09C /* WeakContainer.swift */, 832F65855C2892E34849D090C0749463 /* Support Files */, ); - name = Pageboy; path = Pageboy; sourceTree = ""; }; 2B5D8DEC900E318686070418FBAA4905 /* Products */ = { isa = PBXGroup; children = ( - 5D797E9A5C5782CE845840781FA1CC81 /* Alamofire */, - 3FD1B4C1246D643E9476438C28048FA8 /* AppAuth */, - E2B63D462DB7F827C4B11FD51E4F8E2D /* FirebaseCore */, - 8BB937B1C0DFFCF92F41861C2BC54DDA /* FirebaseCore-FirebaseCore_Privacy */, - AEF1DC80F0EB62580B81D18786BAF924 /* FirebaseCoreExtension */, - ECAC028550A03412C51913B85686D98B /* FirebaseCoreExtension-FirebaseCoreExtension_Privacy */, - 148D0F9E8C7373FEAF40D800FC5F1BAA /* FirebaseCoreInternal */, - 4DB03FD262B678178A44272143846563 /* FirebaseCoreInternal-FirebaseCoreInternal_Privacy */, - 86375444C196BA272DDBB8165BF64A15 /* FirebaseCrashlytics */, - 859AE0302B28BD8AE67A780BFCAEE082 /* FirebaseCrashlytics-FirebaseCrashlytics_Privacy */, - 13C8C8B254851998F9289F71229B28A2 /* FirebaseInstallations */, - 47C581450CDB4A6111CB97EEE0711A8C /* FirebaseInstallations-FirebaseInstallations_Privacy */, - 3CB3BCF1390F1406B03BC8DB4735D727 /* FirebaseRemoteConfigInterop */, - 83F5CCB22EE126A829F2A8820798DC8D /* FirebaseSessions */, - 856B5CD56F194FAD26EA91620B66D614 /* GoogleDataTransport */, - F73AA961F4AEFF2B46B00AE435DF6BE3 /* GoogleDataTransport-GoogleDataTransport_Privacy */, - FD56AB51475BC5F592781EE2692D1412 /* GoogleSignIn */, - E5BA41B7F2E1FE47F9ABCAC27C9E4281 /* GoogleSignIn-GoogleSignIn */, - 84754CE45676593DFB7E6D58EB8623CB /* GoogleSignInSwiftSupport */, - B43874C6CBB50E7134FBEC24BABFE14F /* GoogleUtilities */, - 44E291D18340EAC3F761346198515323 /* GoogleUtilities-GoogleUtilities_Privacy */, - 6FD122EA0AB9AB2A8FFA5F676C795DF0 /* GTMAppAuth */, - C1998E0D8085221AD87F89B614C10E52 /* GTMSessionFetcher */, - C3F44C782D64D7EB20B61CE3844EBFAD /* Kingfisher */, - 06FC5C9CF96D60C50FCD47D339C91951 /* nanopb */, - 3227F3FC45681D7CEE5D1355A532398A /* nanopb-nanopb_Privacy */, - 23D5CD291D18F2187712FE6F84B6F1C6 /* Pageboy */, - 6CAF48A3F91722C8FDACC5B65D92F53A /* Pods-pochak */, - 978DE789DE51F9EEE984BCA62AF4D9C4 /* Pods-pochak-pochakUITests */, - DB044703EF94320EA65C02557FBD869A /* Pods-pochakTests */, - 3347A1AB6546F0A3977529B8F199DC41 /* PromisesObjC */, - 3F238BB22C5201CE689CAF2F766AED95 /* PromisesObjC-FBLPromises_Privacy */, - 379E5319BC6B4AE5613DFF7EEEAA6905 /* PromisesSwift */, - 067CED0F0662BBE6DC889AEC6DAB3049 /* PromisesSwift-Promises_Privacy */, - 921BE4A82C4A7A5C72A0C6F8B8FEF200 /* Realm */, - 437919EE08EC6BFCCBAC3BD346309742 /* RealmSwift */, - 4D4799138F8AC5FFF2497DCB60AF4CBB /* Tabman */, + 5D797E9A5C5782CE845840781FA1CC81 /* Alamofire.framework */, + 3FD1B4C1246D643E9476438C28048FA8 /* AppAuth.framework */, + E2B63D462DB7F827C4B11FD51E4F8E2D /* FirebaseCore.framework */, + 8BB937B1C0DFFCF92F41861C2BC54DDA /* FirebaseCore_Privacy.bundle */, + AEF1DC80F0EB62580B81D18786BAF924 /* FirebaseCoreExtension.framework */, + ECAC028550A03412C51913B85686D98B /* FirebaseCoreExtension_Privacy.bundle */, + 148D0F9E8C7373FEAF40D800FC5F1BAA /* FirebaseCoreInternal.framework */, + 4DB03FD262B678178A44272143846563 /* FirebaseCoreInternal_Privacy.bundle */, + 86375444C196BA272DDBB8165BF64A15 /* FirebaseCrashlytics.framework */, + 859AE0302B28BD8AE67A780BFCAEE082 /* FirebaseCrashlytics_Privacy.bundle */, + 13C8C8B254851998F9289F71229B28A2 /* FirebaseInstallations.framework */, + 47C581450CDB4A6111CB97EEE0711A8C /* FirebaseInstallations_Privacy.bundle */, + 3CB3BCF1390F1406B03BC8DB4735D727 /* FirebaseRemoteConfigInterop.framework */, + 83F5CCB22EE126A829F2A8820798DC8D /* FirebaseSessions.framework */, + 856B5CD56F194FAD26EA91620B66D614 /* GoogleDataTransport.framework */, + F73AA961F4AEFF2B46B00AE435DF6BE3 /* GoogleDataTransport_Privacy.bundle */, + FD56AB51475BC5F592781EE2692D1412 /* GoogleSignIn.framework */, + E5BA41B7F2E1FE47F9ABCAC27C9E4281 /* GoogleSignIn.bundle */, + 84754CE45676593DFB7E6D58EB8623CB /* GoogleSignInSwift.framework */, + B43874C6CBB50E7134FBEC24BABFE14F /* GoogleUtilities.framework */, + 44E291D18340EAC3F761346198515323 /* GoogleUtilities_Privacy.bundle */, + 6FD122EA0AB9AB2A8FFA5F676C795DF0 /* GTMAppAuth.framework */, + C1998E0D8085221AD87F89B614C10E52 /* GTMSessionFetcher.framework */, + C3F44C782D64D7EB20B61CE3844EBFAD /* Kingfisher.framework */, + 06FC5C9CF96D60C50FCD47D339C91951 /* nanopb.framework */, + 3227F3FC45681D7CEE5D1355A532398A /* nanopb_Privacy.bundle */, + 23D5CD291D18F2187712FE6F84B6F1C6 /* Pageboy.framework */, + 6CAF48A3F91722C8FDACC5B65D92F53A /* Pods_pochak.framework */, + 978DE789DE51F9EEE984BCA62AF4D9C4 /* Pods_pochak_pochakUITests.framework */, + DB044703EF94320EA65C02557FBD869A /* Pods_pochakTests.framework */, + 3347A1AB6546F0A3977529B8F199DC41 /* FBLPromises.framework */, + 3F238BB22C5201CE689CAF2F766AED95 /* FBLPromises_Privacy.bundle */, + 379E5319BC6B4AE5613DFF7EEEAA6905 /* Promises.framework */, + 067CED0F0662BBE6DC889AEC6DAB3049 /* Promises_Privacy.bundle */, + 921BE4A82C4A7A5C72A0C6F8B8FEF200 /* Realm.framework */, + 437919EE08EC6BFCCBAC3BD346309742 /* RealmSwift.framework */, + 4D4799138F8AC5FFF2497DCB60AF4CBB /* Tabman.framework */, ); name = Products; sourceTree = ""; @@ -4084,7 +4083,6 @@ 747A6A6F6A8DA628ACBB98C8B74DCC4F /* AdIdSupport */, C16874E6D2948B52C427F9AF5D287127 /* Support Files */, ); - name = FirebaseAnalytics; path = FirebaseAnalytics; sourceTree = ""; }; @@ -4172,7 +4170,6 @@ 34930DDA72921A668A286EE6BDA1E984 /* WeakContainer.swift */, 71F9CFFDB67B1315F4F45931038BAAA8 /* Support Files */, ); - name = Tabman; path = Tabman; sourceTree = ""; }; @@ -4403,7 +4400,6 @@ EA0BDA77FCD6C97CFE9D3DDEB55F7491 /* Resources */, 95C23AA7F0A3202D33DEDC02919E53C2 /* Support Files */, ); - name = FirebaseCrashlytics; path = FirebaseCrashlytics; sourceTree = ""; }; @@ -4414,7 +4410,6 @@ 6782EAF78198C21A1996C5257860FC36 /* ExternalUserAgent */, 7D0D0ACE4BC0B50073EAE50FD8239039 /* Support Files */, ); - name = AppAuth; path = AppAuth; sourceTree = ""; }; @@ -4428,7 +4423,6 @@ 3091DFEEBA65B8C5A1A6C9643C5A6631 /* GoogleSignInButtonViewModel.swift */, A96DCD65DD60E546A72F2C29EB6AFC53 /* Support Files */, ); - name = GoogleSignInSwiftSupport; path = GoogleSignInSwiftSupport; sourceTree = ""; }; @@ -4495,7 +4489,6 @@ A802E1B182017241E6E86BA4C105D9F4 /* Resources */, F085F5D6CE43C8D532DA2583C5B7312A /* Support Files */, ); - name = FirebaseCoreInternal; path = FirebaseCoreInternal; sourceTree = ""; }; @@ -4554,7 +4547,6 @@ 74A2E94EA8D4B400D316598DB3FB6C28 /* Resources */, 575261E183092F520D16625CCD4D9423 /* Support Files */, ); - name = FirebaseInstallations; path = FirebaseInstallations; sourceTree = ""; }; @@ -4608,7 +4600,6 @@ 978646D0E6D97DCC0D30E5DDC686DCB6 /* Resources */, A35E90D2A14DA6324F8C5BEC1A460C21 /* Support Files */, ); - name = FirebaseCoreExtension; path = FirebaseCoreExtension; sourceTree = ""; }; @@ -4776,7 +4767,6 @@ EF0191631A3C67B8526FEDE5DB18D1B7 /* WKInterfaceImage+Kingfisher.swift */, 5DF2D0AE27505E212B6F33ED7D227560 /* Support Files */, ); - name = Kingfisher; path = Kingfisher; sourceTree = ""; }; @@ -4898,7 +4888,6 @@ 2FF54DAB6EFB6FAC47D07D6F707775ED /* Time.swift */, ABB4CEF5FD669CD5207709FEDDAB3F74 /* Support Files */, ); - name = FirebaseSessions; path = FirebaseSessions; sourceTree = ""; }; @@ -5127,7 +5116,6 @@ A8D4EA071749FBB0AD2EDBD1BDB703C9 /* Util.swift */, 4E037CF0F4056BBEAE3EE53E44058A03 /* Support Files */, ); - name = RealmSwift; path = RealmSwift; sourceTree = ""; }; @@ -5282,7 +5270,6 @@ EFB02D7DA0EDAA56A8CE95BE23EF1AFB /* Headers */, E031739AF1B2B41A854362B14E8DD7AB /* Support Files */, ); - name = Realm; path = Realm; sourceTree = ""; }; @@ -5327,7 +5314,6 @@ D90AFBD479DD02ACE019E802B081DB49 /* Resources */, 7BBAD4EA40FC02F7BA2BD2EC6032BD99 /* Support Files */, ); - name = nanopb; path = nanopb; sourceTree = ""; }; @@ -5470,7 +5456,6 @@ C705264BFA03A65E5A6CEBE0D548E026 /* Validation.swift */, E4A47C43BC5794FB8A026FCC464DAB8C /* Support Files */, ); - name = Alamofire; path = Alamofire; sourceTree = ""; }; @@ -5488,7 +5473,6 @@ 2CB572F3B2BAD74F3E55C71FD08E837E /* Support Files */, BC11D5EE05BE7CFCA5895B796FE27C06 /* UserDefaults */, ); - name = GoogleUtilities; path = GoogleUtilities; sourceTree = ""; }; @@ -5563,7 +5547,6 @@ D5DCA2DEC22D7BE359C2B7D75787DADB /* Resources */, 558ADAC8892C2A4A58DE08854C509D1D /* Support Files */, ); - name = PromisesObjC; path = PromisesObjC; sourceTree = ""; }; @@ -5597,7 +5580,6 @@ 0607C5D0A015353481286E2913482CA9 /* GTMOAuth2KeychainCompatibility.m */, 8F192F69C5CCD9C7136C225EF052E624 /* Support Files */, ); - name = GTMAppAuth; path = GTMAppAuth; sourceTree = ""; }; @@ -5641,7 +5623,6 @@ CA1A365ED561BB14BF12E3A016533995 /* Resources */, AAB099E54F154550835921ABD602063C /* Support Files */, ); - name = PromisesSwift; path = PromisesSwift; sourceTree = ""; }; @@ -5765,7 +5746,6 @@ 947CCF93F00E0EE90BA81ABAE2E5B292 /* Resources */, FB1C3B709D073022C2CE6F4BED97C3C0 /* Support Files */, ); - name = GoogleDataTransport; path = GoogleDataTransport; sourceTree = ""; }; @@ -5791,7 +5771,6 @@ D1EAF21780C1D8D5A533B4CFE511AC86 /* Core */, E4502192DEF874C6708B6FD033194725 /* Support Files */, ); - name = GTMSessionFetcher; path = GTMSessionFetcher; sourceTree = ""; }; @@ -5910,7 +5889,6 @@ 8694C479479E3655B49CB12EC4121912 /* Resources */, 6A1C36763F3EE283322FBAA549A92FCD /* Support Files */, ); - name = FirebaseCore; path = FirebaseCore; sourceTree = ""; }; @@ -5923,7 +5901,6 @@ 65ED589EEEFEC981A6B625678B863C40 /* RolloutsStateSubscriber.swift */, 7AAB543604C44FD90DAD17DF233776D8 /* Support Files */, ); - name = FirebaseRemoteConfigInterop; path = FirebaseRemoteConfigInterop; sourceTree = ""; }; @@ -6677,7 +6654,7 @@ ); name = Pageboy; productName = Pageboy; - productReference = 23D5CD291D18F2187712FE6F84B6F1C6 /* Pageboy */; + productReference = 23D5CD291D18F2187712FE6F84B6F1C6 /* Pageboy.framework */; productType = "com.apple.product-type.framework"; }; 1001C16510D946B47CFF8B19DBC0B787 /* FirebaseCore-FirebaseCore_Privacy */ = { @@ -6694,7 +6671,7 @@ ); name = "FirebaseCore-FirebaseCore_Privacy"; productName = FirebaseCore_Privacy; - productReference = 8BB937B1C0DFFCF92F41861C2BC54DDA /* FirebaseCore-FirebaseCore_Privacy */; + productReference = 8BB937B1C0DFFCF92F41861C2BC54DDA /* FirebaseCore_Privacy.bundle */; productType = "com.apple.product-type.bundle"; }; 17CBCC6221F62B870268E935098B7D7D /* FirebaseCrashlytics-FirebaseCrashlytics_Privacy */ = { @@ -6711,7 +6688,7 @@ ); name = "FirebaseCrashlytics-FirebaseCrashlytics_Privacy"; productName = FirebaseCrashlytics_Privacy; - productReference = 859AE0302B28BD8AE67A780BFCAEE082 /* FirebaseCrashlytics-FirebaseCrashlytics_Privacy */; + productReference = 859AE0302B28BD8AE67A780BFCAEE082 /* FirebaseCrashlytics_Privacy.bundle */; productType = "com.apple.product-type.bundle"; }; 1BFBEDBF7E03729D43C96530EE190825 /* PromisesObjC-FBLPromises_Privacy */ = { @@ -6728,7 +6705,7 @@ ); name = "PromisesObjC-FBLPromises_Privacy"; productName = FBLPromises_Privacy; - productReference = 3F238BB22C5201CE689CAF2F766AED95 /* PromisesObjC-FBLPromises_Privacy */; + productReference = 3F238BB22C5201CE689CAF2F766AED95 /* FBLPromises_Privacy.bundle */; productType = "com.apple.product-type.bundle"; }; 20FC1B51113917B9CE7D07F12BF26C0A /* Pods-pochakTests */ = { @@ -6747,7 +6724,7 @@ ); name = "Pods-pochakTests"; productName = Pods_pochakTests; - productReference = DB044703EF94320EA65C02557FBD869A /* Pods-pochakTests */; + productReference = DB044703EF94320EA65C02557FBD869A /* Pods_pochakTests.framework */; productType = "com.apple.product-type.framework"; }; 230F5EE18ECBB227C09ED2C571AFA319 /* PromisesSwift-Promises_Privacy */ = { @@ -6764,7 +6741,7 @@ ); name = "PromisesSwift-Promises_Privacy"; productName = Promises_Privacy; - productReference = 067CED0F0662BBE6DC889AEC6DAB3049 /* PromisesSwift-Promises_Privacy */; + productReference = 067CED0F0662BBE6DC889AEC6DAB3049 /* Promises_Privacy.bundle */; productType = "com.apple.product-type.bundle"; }; 25E9E9A17BC3F670357D7385C521E48E /* FirebaseCoreInternal */ = { @@ -6784,7 +6761,7 @@ ); name = FirebaseCoreInternal; productName = FirebaseCoreInternal; - productReference = 148D0F9E8C7373FEAF40D800FC5F1BAA /* FirebaseCoreInternal */; + productReference = 148D0F9E8C7373FEAF40D800FC5F1BAA /* FirebaseCoreInternal.framework */; productType = "com.apple.product-type.framework"; }; 25FDC1F65BC4FBDB6E073AC39090B849 /* Pods-pochak */ = { @@ -6827,7 +6804,7 @@ ); name = "Pods-pochak"; productName = Pods_pochak; - productReference = 6CAF48A3F91722C8FDACC5B65D92F53A /* Pods-pochak */; + productReference = 6CAF48A3F91722C8FDACC5B65D92F53A /* Pods_pochak.framework */; productType = "com.apple.product-type.framework"; }; 2949783F7EDB27AD4666B5427B63DC79 /* FirebaseCoreInternal-FirebaseCoreInternal_Privacy */ = { @@ -6844,7 +6821,7 @@ ); name = "FirebaseCoreInternal-FirebaseCoreInternal_Privacy"; productName = FirebaseCoreInternal_Privacy; - productReference = 4DB03FD262B678178A44272143846563 /* FirebaseCoreInternal-FirebaseCoreInternal_Privacy */; + productReference = 4DB03FD262B678178A44272143846563 /* FirebaseCoreInternal_Privacy.bundle */; productType = "com.apple.product-type.bundle"; }; 2BBF7206D7FAC92C82A042A99C4A98F8 /* PromisesObjC */ = { @@ -6863,7 +6840,7 @@ ); name = PromisesObjC; productName = FBLPromises; - productReference = 3347A1AB6546F0A3977529B8F199DC41 /* PromisesObjC */; + productReference = 3347A1AB6546F0A3977529B8F199DC41 /* FBLPromises.framework */; productType = "com.apple.product-type.framework"; }; 328CC04F43300C6CAB81659260A3799D /* FirebaseRemoteConfigInterop */ = { @@ -6881,7 +6858,7 @@ ); name = FirebaseRemoteConfigInterop; productName = FirebaseRemoteConfigInterop; - productReference = 3CB3BCF1390F1406B03BC8DB4735D727 /* FirebaseRemoteConfigInterop */; + productReference = 3CB3BCF1390F1406B03BC8DB4735D727 /* FirebaseRemoteConfigInterop.framework */; productType = "com.apple.product-type.framework"; }; 3EB14444A17F9D4F1F697F7C1FF32245 /* FirebaseInstallations-FirebaseInstallations_Privacy */ = { @@ -6898,7 +6875,7 @@ ); name = "FirebaseInstallations-FirebaseInstallations_Privacy"; productName = FirebaseInstallations_Privacy; - productReference = 47C581450CDB4A6111CB97EEE0711A8C /* FirebaseInstallations-FirebaseInstallations_Privacy */; + productReference = 47C581450CDB4A6111CB97EEE0711A8C /* FirebaseInstallations_Privacy.bundle */; productType = "com.apple.product-type.bundle"; }; 3EF26018CD886BA3143044A409D6D0B9 /* Tabman */ = { @@ -6917,7 +6894,7 @@ ); name = Tabman; productName = Tabman; - productReference = 4D4799138F8AC5FFF2497DCB60AF4CBB /* Tabman */; + productReference = 4D4799138F8AC5FFF2497DCB60AF4CBB /* Tabman.framework */; productType = "com.apple.product-type.framework"; }; 3F8EC37C78673149F2B94E8BD9AA8737 /* FirebaseSessions */ = { @@ -6942,7 +6919,7 @@ ); name = FirebaseSessions; productName = FirebaseSessions; - productReference = 83F5CCB22EE126A829F2A8820798DC8D /* FirebaseSessions */; + productReference = 83F5CCB22EE126A829F2A8820798DC8D /* FirebaseSessions.framework */; productType = "com.apple.product-type.framework"; }; 4402AFF83DBDC4DD07E198685FDC2DF2 /* FirebaseCore */ = { @@ -6963,7 +6940,7 @@ ); name = FirebaseCore; productName = FirebaseCore; - productReference = E2B63D462DB7F827C4B11FD51E4F8E2D /* FirebaseCore */; + productReference = E2B63D462DB7F827C4B11FD51E4F8E2D /* FirebaseCore.framework */; productType = "com.apple.product-type.framework"; }; 526C4398D095B3704EB933DADBC30093 /* FirebaseCrashlytics */ = { @@ -6990,7 +6967,7 @@ ); name = FirebaseCrashlytics; productName = FirebaseCrashlytics; - productReference = 86375444C196BA272DDBB8165BF64A15 /* FirebaseCrashlytics */; + productReference = 86375444C196BA272DDBB8165BF64A15 /* FirebaseCrashlytics.framework */; productType = "com.apple.product-type.framework"; }; 55522A91938FF505CFEBEAD2DD85AE2D /* nanopb-nanopb_Privacy */ = { @@ -7007,7 +6984,7 @@ ); name = "nanopb-nanopb_Privacy"; productName = nanopb_Privacy; - productReference = 3227F3FC45681D7CEE5D1355A532398A /* nanopb-nanopb_Privacy */; + productReference = 3227F3FC45681D7CEE5D1355A532398A /* nanopb_Privacy.bundle */; productType = "com.apple.product-type.bundle"; }; 5C0371EE948D0357B8EE0E34ABB44BF0 /* GoogleDataTransport */ = { @@ -7029,7 +7006,7 @@ ); name = GoogleDataTransport; productName = GoogleDataTransport; - productReference = 856B5CD56F194FAD26EA91620B66D614 /* GoogleDataTransport */; + productReference = 856B5CD56F194FAD26EA91620B66D614 /* GoogleDataTransport.framework */; productType = "com.apple.product-type.framework"; }; 5C642AA10FB29936669CC269F42079C6 /* AppAuth */ = { @@ -7047,7 +7024,7 @@ ); name = AppAuth; productName = AppAuth; - productReference = 3FD1B4C1246D643E9476438C28048FA8 /* AppAuth */; + productReference = 3FD1B4C1246D643E9476438C28048FA8 /* AppAuth.framework */; productType = "com.apple.product-type.framework"; }; 5FF1A58DEEC5DB749FCD6C120B97CC82 /* GoogleUtilities-GoogleUtilities_Privacy */ = { @@ -7064,7 +7041,7 @@ ); name = "GoogleUtilities-GoogleUtilities_Privacy"; productName = GoogleUtilities_Privacy; - productReference = 44E291D18340EAC3F761346198515323 /* GoogleUtilities-GoogleUtilities_Privacy */; + productReference = 44E291D18340EAC3F761346198515323 /* GoogleUtilities_Privacy.bundle */; productType = "com.apple.product-type.bundle"; }; 627FB10F6F73AA122CAD5E738500ABFD /* Pods-pochak-pochakUITests */ = { @@ -7107,7 +7084,7 @@ ); name = "Pods-pochak-pochakUITests"; productName = Pods_pochak_pochakUITests; - productReference = 978DE789DE51F9EEE984BCA62AF4D9C4 /* Pods-pochak-pochakUITests */; + productReference = 978DE789DE51F9EEE984BCA62AF4D9C4 /* Pods_pochak_pochakUITests.framework */; productType = "com.apple.product-type.framework"; }; 68494F30B4A13F8E5E88BCCAEC25B0A4 /* Realm */ = { @@ -7129,7 +7106,7 @@ ); name = Realm; productName = Realm; - productReference = 921BE4A82C4A7A5C72A0C6F8B8FEF200 /* Realm */; + productReference = 921BE4A82C4A7A5C72A0C6F8B8FEF200 /* Realm.framework */; productType = "com.apple.product-type.framework"; }; 782725687624F8665247B84AB581BEB1 /* RealmSwift */ = { @@ -7148,7 +7125,7 @@ ); name = RealmSwift; productName = RealmSwift; - productReference = 437919EE08EC6BFCCBAC3BD346309742 /* RealmSwift */; + productReference = 437919EE08EC6BFCCBAC3BD346309742 /* RealmSwift.framework */; productType = "com.apple.product-type.framework"; }; 7DFA91ED3A3D0BC020C3C843A3D1EB38 /* GoogleSignIn-GoogleSignIn */ = { @@ -7165,7 +7142,7 @@ ); name = "GoogleSignIn-GoogleSignIn"; productName = GoogleSignIn; - productReference = E5BA41B7F2E1FE47F9ABCAC27C9E4281 /* GoogleSignIn-GoogleSignIn */; + productReference = E5BA41B7F2E1FE47F9ABCAC27C9E4281 /* GoogleSignIn.bundle */; productType = "com.apple.product-type.bundle"; }; 8627999EF1D5E93E13DAFF580DA8CDCF /* GTMAppAuth */ = { @@ -7185,7 +7162,7 @@ ); name = GTMAppAuth; productName = GTMAppAuth; - productReference = 6FD122EA0AB9AB2A8FFA5F676C795DF0 /* GTMAppAuth */; + productReference = 6FD122EA0AB9AB2A8FFA5F676C795DF0 /* GTMAppAuth.framework */; productType = "com.apple.product-type.framework"; }; 87803597EB3F20FC46472B85392EC4FD /* FirebaseInstallations */ = { @@ -7207,7 +7184,7 @@ ); name = FirebaseInstallations; productName = FirebaseInstallations; - productReference = 13C8C8B254851998F9289F71229B28A2 /* FirebaseInstallations */; + productReference = 13C8C8B254851998F9289F71229B28A2 /* FirebaseInstallations.framework */; productType = "com.apple.product-type.framework"; }; 8D7F5D5DD528D21A72DC87ADA5B12E2D /* GoogleUtilities */ = { @@ -7227,7 +7204,7 @@ ); name = GoogleUtilities; productName = GoogleUtilities; - productReference = B43874C6CBB50E7134FBEC24BABFE14F /* GoogleUtilities */; + productReference = B43874C6CBB50E7134FBEC24BABFE14F /* GoogleUtilities.framework */; productType = "com.apple.product-type.framework"; }; 9C4575D64B2B6264CF6AB60FB03302AA /* FirebaseCoreExtension-FirebaseCoreExtension_Privacy */ = { @@ -7244,7 +7221,7 @@ ); name = "FirebaseCoreExtension-FirebaseCoreExtension_Privacy"; productName = FirebaseCoreExtension_Privacy; - productReference = ECAC028550A03412C51913B85686D98B /* FirebaseCoreExtension-FirebaseCoreExtension_Privacy */; + productReference = ECAC028550A03412C51913B85686D98B /* FirebaseCoreExtension_Privacy.bundle */; productType = "com.apple.product-type.bundle"; }; A979F9D3632CD5F2F7518F9A362CBAE3 /* PromisesSwift */ = { @@ -7264,7 +7241,7 @@ ); name = PromisesSwift; productName = Promises; - productReference = 379E5319BC6B4AE5613DFF7EEEAA6905 /* PromisesSwift */; + productReference = 379E5319BC6B4AE5613DFF7EEEAA6905 /* Promises.framework */; productType = "com.apple.product-type.framework"; }; CAD3534FC55B0333104E5117C0A9A324 /* GoogleSignIn */ = { @@ -7286,7 +7263,7 @@ ); name = GoogleSignIn; productName = GoogleSignIn; - productReference = FD56AB51475BC5F592781EE2692D1412 /* GoogleSignIn */; + productReference = FD56AB51475BC5F592781EE2692D1412 /* GoogleSignIn.framework */; productType = "com.apple.product-type.framework"; }; D2B5E7DCCBBFB32341D857D01211A1A3 /* nanopb */ = { @@ -7305,7 +7282,7 @@ ); name = nanopb; productName = nanopb; - productReference = 06FC5C9CF96D60C50FCD47D339C91951 /* nanopb */; + productReference = 06FC5C9CF96D60C50FCD47D339C91951 /* nanopb.framework */; productType = "com.apple.product-type.framework"; }; D676E21115185671D7258A56944ABE98 /* GTMSessionFetcher */ = { @@ -7323,7 +7300,7 @@ ); name = GTMSessionFetcher; productName = GTMSessionFetcher; - productReference = C1998E0D8085221AD87F89B614C10E52 /* GTMSessionFetcher */; + productReference = C1998E0D8085221AD87F89B614C10E52 /* GTMSessionFetcher.framework */; productType = "com.apple.product-type.framework"; }; DD0D41A9315A48004E57F4F0E54095F1 /* GoogleDataTransport-GoogleDataTransport_Privacy */ = { @@ -7340,7 +7317,7 @@ ); name = "GoogleDataTransport-GoogleDataTransport_Privacy"; productName = GoogleDataTransport_Privacy; - productReference = F73AA961F4AEFF2B46B00AE435DF6BE3 /* GoogleDataTransport-GoogleDataTransport_Privacy */; + productReference = F73AA961F4AEFF2B46B00AE435DF6BE3 /* GoogleDataTransport_Privacy.bundle */; productType = "com.apple.product-type.bundle"; }; E7914CE264D9911F6B955E38A3DC9CC4 /* GoogleSignInSwiftSupport */ = { @@ -7359,7 +7336,7 @@ ); name = GoogleSignInSwiftSupport; productName = GoogleSignInSwift; - productReference = 84754CE45676593DFB7E6D58EB8623CB /* GoogleSignInSwiftSupport */; + productReference = 84754CE45676593DFB7E6D58EB8623CB /* GoogleSignInSwift.framework */; productType = "com.apple.product-type.framework"; }; E8022D22FAA6690B5E1C379C1BCE1491 /* Kingfisher */ = { @@ -7377,7 +7354,7 @@ ); name = Kingfisher; productName = Kingfisher; - productReference = C3F44C782D64D7EB20B61CE3844EBFAD /* Kingfisher */; + productReference = C3F44C782D64D7EB20B61CE3844EBFAD /* Kingfisher.framework */; productType = "com.apple.product-type.framework"; }; EAAA1AD3A8A1B59AB91319EE40752C6D /* Alamofire */ = { @@ -7395,7 +7372,7 @@ ); name = Alamofire; productName = Alamofire; - productReference = 5D797E9A5C5782CE845840781FA1CC81 /* Alamofire */; + productReference = 5D797E9A5C5782CE845840781FA1CC81 /* Alamofire.framework */; productType = "com.apple.product-type.framework"; }; FE1DE31D91C32501251AE9687CDC2E0F /* FirebaseCoreExtension */ = { @@ -7415,7 +7392,7 @@ ); name = FirebaseCoreExtension; productName = FirebaseCoreExtension; - productReference = AEF1DC80F0EB62580B81D18786BAF924 /* FirebaseCoreExtension */; + productReference = AEF1DC80F0EB62580B81D18786BAF924 /* FirebaseCoreExtension.framework */; productType = "com.apple.product-type.framework"; }; /* End PBXNativeTarget section */ @@ -7540,7 +7517,7 @@ isa = PBXResourcesBuildPhase; buildActionMask = 2147483647; files = ( - C80E6A729D4A289850B7EFF27521998D /* GoogleSignIn-GoogleSignIn in Resources */, + C80E6A729D4A289850B7EFF27521998D /* GoogleSignIn.bundle in Resources */, ); runOnlyForDeploymentPostprocessing = 0; }; @@ -7555,7 +7532,7 @@ isa = PBXResourcesBuildPhase; buildActionMask = 2147483647; files = ( - DAF62FE91CBC43EBB75F089ED76161A4 /* FirebaseCore-FirebaseCore_Privacy in Resources */, + DAF62FE91CBC43EBB75F089ED76161A4 /* FirebaseCore_Privacy.bundle in Resources */, ); runOnlyForDeploymentPostprocessing = 0; }; @@ -7594,7 +7571,7 @@ isa = PBXResourcesBuildPhase; buildActionMask = 2147483647; files = ( - 800DF30A0C95155BEED83637391A907E /* GoogleDataTransport-GoogleDataTransport_Privacy in Resources */, + 800DF30A0C95155BEED83637391A907E /* GoogleDataTransport_Privacy.bundle in Resources */, ); runOnlyForDeploymentPostprocessing = 0; }; @@ -7631,7 +7608,7 @@ isa = PBXResourcesBuildPhase; buildActionMask = 2147483647; files = ( - EBF5412238AF0A9C462A5975F2F8A41F /* GoogleUtilities-GoogleUtilities_Privacy in Resources */, + EBF5412238AF0A9C462A5975F2F8A41F /* GoogleUtilities_Privacy.bundle in Resources */, ); runOnlyForDeploymentPostprocessing = 0; }; @@ -7646,7 +7623,7 @@ isa = PBXResourcesBuildPhase; buildActionMask = 2147483647; files = ( - C79EECCFFA6D323EBC9109D0EB2D99B3 /* PromisesObjC-FBLPromises_Privacy in Resources */, + C79EECCFFA6D323EBC9109D0EB2D99B3 /* FBLPromises_Privacy.bundle in Resources */, ); runOnlyForDeploymentPostprocessing = 0; }; @@ -7654,7 +7631,7 @@ isa = PBXResourcesBuildPhase; buildActionMask = 2147483647; files = ( - 41969B630F7BB8483850BE6CE61EB1A7 /* FirebaseCoreExtension-FirebaseCoreExtension_Privacy in Resources */, + 41969B630F7BB8483850BE6CE61EB1A7 /* FirebaseCoreExtension_Privacy.bundle in Resources */, ); runOnlyForDeploymentPostprocessing = 0; }; @@ -7662,7 +7639,7 @@ isa = PBXResourcesBuildPhase; buildActionMask = 2147483647; files = ( - 002C4B90D97BC502D2EDFB977EBECBF2 /* nanopb-nanopb_Privacy in Resources */, + 002C4B90D97BC502D2EDFB977EBECBF2 /* nanopb_Privacy.bundle in Resources */, ); runOnlyForDeploymentPostprocessing = 0; }; @@ -7678,7 +7655,7 @@ isa = PBXResourcesBuildPhase; buildActionMask = 2147483647; files = ( - 8856A14B17D6F639AA63120DE3F4B6CB /* PromisesSwift-Promises_Privacy in Resources */, + 8856A14B17D6F639AA63120DE3F4B6CB /* Promises_Privacy.bundle in Resources */, ); runOnlyForDeploymentPostprocessing = 0; }; @@ -7686,7 +7663,7 @@ isa = PBXResourcesBuildPhase; buildActionMask = 2147483647; files = ( - 3E7C9F2E9D8989060B94B397BAC576C7 /* FirebaseCrashlytics-FirebaseCrashlytics_Privacy in Resources */, + 3E7C9F2E9D8989060B94B397BAC576C7 /* FirebaseCrashlytics_Privacy.bundle in Resources */, ); runOnlyForDeploymentPostprocessing = 0; }; @@ -7765,7 +7742,7 @@ isa = PBXResourcesBuildPhase; buildActionMask = 2147483647; files = ( - 47BC67E1B06D23BFE3B37EAD72CB15EB /* FirebaseCoreInternal-FirebaseCoreInternal_Privacy in Resources */, + 47BC67E1B06D23BFE3B37EAD72CB15EB /* FirebaseCoreInternal_Privacy.bundle in Resources */, ); runOnlyForDeploymentPostprocessing = 0; }; @@ -7831,7 +7808,7 @@ isa = PBXResourcesBuildPhase; buildActionMask = 2147483647; files = ( - C2A199DC8F50EB4A931BAF930A197460 /* FirebaseInstallations-FirebaseInstallations_Privacy in Resources */, + C2A199DC8F50EB4A931BAF930A197460 /* FirebaseInstallations_Privacy.bundle in Resources */, ); runOnlyForDeploymentPostprocessing = 0; }; @@ -9660,6 +9637,7 @@ GCC_PREFIX_HEADER = "Target Support Files/Realm/Realm-prefix.pch"; INFOPLIST_FILE = "Target Support Files/Realm/Realm-Info.plist"; INSTALL_PATH = "$(LOCAL_LIBRARY_DIR)/Frameworks"; + IPHONEOS_DEPLOYMENT_TARGET = 9.0; LD_RUNPATH_SEARCH_PATHS = ( "$(inherited)", "@executable_path/Frameworks", @@ -10209,6 +10187,7 @@ GCC_PREFIX_HEADER = "Target Support Files/Realm/Realm-prefix.pch"; INFOPLIST_FILE = "Target Support Files/Realm/Realm-Info.plist"; INSTALL_PATH = "$(LOCAL_LIBRARY_DIR)/Frameworks"; + IPHONEOS_DEPLOYMENT_TARGET = 9.0; LD_RUNPATH_SEARCH_PATHS = ( "$(inherited)", "@executable_path/Frameworks", @@ -10520,6 +10499,7 @@ GCC_PREFIX_HEADER = "Target Support Files/RealmSwift/RealmSwift-prefix.pch"; INFOPLIST_FILE = "Target Support Files/RealmSwift/RealmSwift-Info.plist"; INSTALL_PATH = "$(LOCAL_LIBRARY_DIR)/Frameworks"; + IPHONEOS_DEPLOYMENT_TARGET = 9.0; LD_RUNPATH_SEARCH_PATHS = ( "$(inherited)", "@executable_path/Frameworks", @@ -10915,6 +10895,7 @@ GCC_PREFIX_HEADER = "Target Support Files/RealmSwift/RealmSwift-prefix.pch"; INFOPLIST_FILE = "Target Support Files/RealmSwift/RealmSwift-Info.plist"; INSTALL_PATH = "$(LOCAL_LIBRARY_DIR)/Frameworks"; + IPHONEOS_DEPLOYMENT_TARGET = 9.0; LD_RUNPATH_SEARCH_PATHS = ( "$(inherited)", "@executable_path/Frameworks", diff --git a/pochak/pochak.xcodeproj/project.pbxproj b/pochak/pochak.xcodeproj/project.pbxproj index 744c37ef..42261643 100644 --- a/pochak/pochak.xcodeproj/project.pbxproj +++ b/pochak/pochak.xcodeproj/project.pbxproj @@ -138,6 +138,13 @@ 374E46452CAACD33008AE361 /* BlockListAPI.swift in Sources */ = {isa = PBXBuildFile; fileRef = 374E46442CAACD33008AE361 /* BlockListAPI.swift */; }; 374E46472CAACE4C008AE361 /* BlockListRequest.swift in Sources */ = {isa = PBXBuildFile; fileRef = 374E46462CAACE4C008AE361 /* BlockListRequest.swift */; }; 374E46492CAACE53008AE361 /* BlockListResponse.swift in Sources */ = {isa = PBXBuildFile; fileRef = 374E46482CAACE53008AE361 /* BlockListResponse.swift */; }; + 3759CF2F2CAAE42600408A4E /* UnfollowAPI.swift in Sources */ = {isa = PBXBuildFile; fileRef = 3759CF2E2CAAE42600408A4E /* UnfollowAPI.swift */; }; + 3759CF312CAAE4C600408A4E /* UnfollowRequest.swift in Sources */ = {isa = PBXBuildFile; fileRef = 3759CF302CAAE4C600408A4E /* UnfollowRequest.swift */; }; + 3759CF332CAAE4CE00408A4E /* UnfollowResponse.swift in Sources */ = {isa = PBXBuildFile; fileRef = 3759CF322CAAE4CE00408A4E /* UnfollowResponse.swift */; }; + 3759CF352CAAE79000408A4E /* FollowerRetrievalAPI.swift in Sources */ = {isa = PBXBuildFile; fileRef = 3759CF342CAAE79000408A4E /* FollowerRetrievalAPI.swift */; }; + 3759CF372CAAE79F00408A4E /* FollowingRetrievalAPI.swift in Sources */ = {isa = PBXBuildFile; fileRef = 3759CF362CAAE79F00408A4E /* FollowingRetrievalAPI.swift */; }; + 3759CF392CAAE7E900408A4E /* FollowListRequest.swift in Sources */ = {isa = PBXBuildFile; fileRef = 3759CF382CAAE7E900408A4E /* FollowListRequest.swift */; }; + 3759CF3B2CAAE80700408A4E /* FollowListResponse.swift in Sources */ = {isa = PBXBuildFile; fileRef = 3759CF3A2CAAE80700408A4E /* FollowListResponse.swift */; }; 3766F4022C3706DC001DD239 /* BlockedUserTableViewCell.xib in Resources */ = {isa = PBXBuildFile; fileRef = 3766F4012C3706DC001DD239 /* BlockedUserTableViewCell.xib */; }; 3766F4032C3706DC001DD239 /* BlockedUserTableViewCell.swift in Sources */ = {isa = PBXBuildFile; fileRef = 3766F4002C3706DC001DD239 /* BlockedUserTableViewCell.swift */; }; 3766F4062C370A7C001DD239 /* BlockedUserListDataManager.swift in Sources */ = {isa = PBXBuildFile; fileRef = 3766F4052C370A7C001DD239 /* BlockedUserListDataManager.swift */; }; @@ -398,6 +405,13 @@ 374E46462CAACE4C008AE361 /* BlockListRequest.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = BlockListRequest.swift; sourceTree = ""; }; 374E46482CAACE53008AE361 /* BlockListResponse.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = BlockListResponse.swift; sourceTree = ""; }; 3750669E2C3BB1660036E264 /* pochak.entitlements */ = {isa = PBXFileReference; lastKnownFileType = text.plist.entitlements; path = pochak.entitlements; sourceTree = ""; }; + 3759CF2E2CAAE42600408A4E /* UnfollowAPI.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = UnfollowAPI.swift; sourceTree = ""; }; + 3759CF302CAAE4C600408A4E /* UnfollowRequest.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = UnfollowRequest.swift; sourceTree = ""; }; + 3759CF322CAAE4CE00408A4E /* UnfollowResponse.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = UnfollowResponse.swift; sourceTree = ""; }; + 3759CF342CAAE79000408A4E /* FollowerRetrievalAPI.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = FollowerRetrievalAPI.swift; sourceTree = ""; }; + 3759CF362CAAE79F00408A4E /* FollowingRetrievalAPI.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = FollowingRetrievalAPI.swift; sourceTree = ""; }; + 3759CF382CAAE7E900408A4E /* FollowListRequest.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = FollowListRequest.swift; sourceTree = ""; }; + 3759CF3A2CAAE80700408A4E /* FollowListResponse.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = FollowListResponse.swift; sourceTree = ""; }; 3766F4002C3706DC001DD239 /* BlockedUserTableViewCell.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = BlockedUserTableViewCell.swift; sourceTree = ""; }; 3766F4012C3706DC001DD239 /* BlockedUserTableViewCell.xib */ = {isa = PBXFileReference; lastKnownFileType = file.xib; path = BlockedUserTableViewCell.xib; sourceTree = ""; }; 3766F4052C370A7C001DD239 /* BlockedUserListDataManager.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = BlockedUserListDataManager.swift; sourceTree = ""; }; @@ -620,6 +634,9 @@ isa = PBXGroup; children = ( 0822A04E2CA1980200F87E2C /* FollowAPI.swift */, + 3759CF2E2CAAE42600408A4E /* UnfollowAPI.swift */, + 3759CF342CAAE79000408A4E /* FollowerRetrievalAPI.swift */, + 3759CF362CAAE79F00408A4E /* FollowingRetrievalAPI.swift */, 374E463A2CAAC762008AE361 /* BlockAPI.swift */, 374E463E2CAAC931008AE361 /* UnblockAPI.swift */, 374E46442CAACD33008AE361 /* BlockListAPI.swift */, @@ -649,6 +666,10 @@ isa = PBXGroup; children = ( 0822A0592CA1983C00F87E2C /* FollowResponse.swift */, + 3759CF302CAAE4C600408A4E /* UnfollowRequest.swift */, + 3759CF322CAAE4CE00408A4E /* UnfollowResponse.swift */, + 3759CF382CAAE7E900408A4E /* FollowListRequest.swift */, + 3759CF3A2CAAE80700408A4E /* FollowListResponse.swift */, 374E463C2CAAC82E008AE361 /* BlockResponse.swift */, 374E46402CAAC9AE008AE361 /* UnblockRequest.swift */, 374E46422CAAC9B5008AE361 /* UnblockResponse.swift */, @@ -889,7 +910,7 @@ path = LikesDataManager; sourceTree = ""; }; - 373235452B68F9180042EF94 /* FollowAPI */ = { + 373235452B68F9180042EF94 /* FollowAPI_fin */ = { isa = PBXGroup; children = ( 373235462B68F93E0042EF94 /* FollowListDataManager.swift */, @@ -899,7 +920,7 @@ 373235532B692C6D0042EF94 /* DeleteFollowerDataManager.swift */, 373235552B692C790042EF94 /* DeleteFollowerDataModel.swift */, ); - path = FollowAPI; + path = FollowAPI_fin; sourceTree = ""; }; 373815142A89E6BE0032066A /* Login */ = { @@ -1070,7 +1091,7 @@ isa = PBXGroup; children = ( 3769D6C02B3C39EA00294CD1 /* cell */, - 373235452B68F9180042EF94 /* FollowAPI */, + 373235452B68F9180042EF94 /* FollowAPI_fin */, 3769D6BA2B3C347000294CD1 /* FollowListViewController.swift */, 3769D6BC2B3C348800294CD1 /* FollowerListTabmanViewController.swift */, 3769D6BE2B3C349D00294CD1 /* FollowingListTabmanViewController.swift */, @@ -1105,8 +1126,8 @@ 376EA12D2CAAAE6800FEFB63 /* ProfileRetrievalRequest.swift */, 376EA12B2CAAAE5600FEFB63 /* ProfileRetrievalResponse.swift */, 374E46222CAABB31008AE361 /* PochakPostRetrievalResponse.swift */, - 374E46242CAABE07008AE361 /* ProfileUpdateResponse.swift */, 374E462A2CAABF7A008AE361 /* ProfileUpdateRequest.swift */, + 374E46242CAABE07008AE361 /* ProfileUpdateResponse.swift */, ); path = Profile; sourceTree = ""; @@ -1759,6 +1780,7 @@ EA2CD6482C5F5B0700644EFE /* HomeRequest.swift in Sources */, 37C3AF4B2B3CB49E00B4C79C /* MyProfilePostDataManager.swift in Sources */, EA7E14672C858F0F001DA769 /* CameraAPI.swift in Sources */, + 3759CF392CAAE7E900408A4E /* FollowListRequest.swift in Sources */, 0822A02D2CA196DF00F87E2C /* PostCollectionViewCell.swift in Sources */, EA2CD63F2C5F585400644EFE /* HTTPHeaderType.swift in Sources */, 3769D6CE2B3C563A00294CD1 /* PostListViewController.swift in Sources */, @@ -1770,6 +1792,7 @@ 376EA12C2CAAAE5600FEFB63 /* ProfileRetrievalResponse.swift in Sources */, EA0107A72A5CF73900A3AE85 /* AlarmViewController.swift in Sources */, 08EB99B72C53EA8500FAC08A /* TaggedUsersTableViewCell.swift in Sources */, + 3759CF332CAAE4CE00408A4E /* UnfollowResponse.swift in Sources */, EACF0F6E2C3044C000C0016C /* TagSearchTableViewCell.swift in Sources */, 08B679632B528D7500F8D585 /* CommentTableViewFooterView.swift in Sources */, EA2CD6442C5F5A0E00644EFE /* HomeAPI.swift in Sources */, @@ -1799,6 +1822,7 @@ EA17182C2A5912A7009168E6 /* UploadViewController.swift in Sources */, 089E27B72C4E8C2D00828F4C /* AlarmType.swift in Sources */, 3769D6B22B3C300D00294CD1 /* GoogleLoginModel.swift in Sources */, + 3759CF2F2CAAE42600408A4E /* UnfollowAPI.swift in Sources */, EA96D04C2C8F10C700D80562 /* TagPreviewResponse.swift in Sources */, 0822A06B2CA1983C00F87E2C /* ChildCommentGetResponse.swift in Sources */, 0822A0352CA196DF00F87E2C /* ExploreTabViewController.swift in Sources */, @@ -1815,6 +1839,7 @@ 374E46292CAABE50008AE361 /* ProfileUpdateAPI.swift in Sources */, 0844D7EF2BF219F6001154AC /* DeleteViewCell.swift in Sources */, 374E463D2CAAC82E008AE361 /* BlockResponse.swift in Sources */, + 3759CF3B2CAAE80700408A4E /* FollowListResponse.swift in Sources */, 374261742C3092B900B67886 /* UnblockDataModel.swift in Sources */, EA2CD63B2C5F463700644EFE /* NetworkService.swift in Sources */, 373235542B692C6D0042EF94 /* DeleteFollowerDataManager.swift in Sources */, @@ -1859,6 +1884,7 @@ 08C02EF82BF394B800627C21 /* UIAlertController+.swift in Sources */, 089E27B92C4E8CB800828F4C /* AlertType.swift in Sources */, EAE69F442C315009005762B7 /* UIVIew+.swift in Sources */, + 3759CF312CAAE4C600408A4E /* UnfollowRequest.swift in Sources */, 0876E23E2C274256008DE88F /* NoPostCollectionViewCell.swift in Sources */, EA96D0502C8F15E000D80562 /* TagPreviewAPI.swift in Sources */, 0822A0482CA197E700F87E2C /* PostDeleteAPI.swift in Sources */, @@ -1871,6 +1897,7 @@ 0801765E2A74F4B0005E6953 /* UITextView+Extension.swift in Sources */, 081228C62A69624000DFA094 /* PostLikesViewController.swift in Sources */, EA01079B2A59556800A3AE85 /* HomeTabViewController.swift in Sources */, + 3759CF352CAAE79000408A4E /* FollowerRetrievalAPI.swift in Sources */, 373235492B68F9A60042EF94 /* FollowListDataModel.swift in Sources */, 0822A0332CA196DF00F87E2C /* RecentSearchViewController.swift in Sources */, 0822A06E2CA1983C00F87E2C /* CommentPostResponse.swift in Sources */, @@ -1918,6 +1945,7 @@ 3769D6D02B3C569C00294CD1 /* PochakedPostTabmanViewController.swift in Sources */, 374261642C2FEF5F00B67886 /* ProfileMenuViewController.swift in Sources */, 3742617F2C359D6D00B67886 /* CheckHandleDuplicationDataModel.swift in Sources */, + 3759CF372CAAE79F00408A4E /* FollowingRetrievalAPI.swift in Sources */, EAC582742C3074EA006F44AF /* UIColor+.swift in Sources */, 3769D6BB2B3C347000294CD1 /* FollowListViewController.swift in Sources */, 3769D6B42B3C301B00294CD1 /* JoinDataManager.swift in Sources */, @@ -2118,7 +2146,7 @@ CODE_SIGN_STYLE = Automatic; CURRENT_PROJECT_VERSION = 1; DEBUG_INFORMATION_FORMAT = "dwarf-with-dsym"; - DEVELOPMENT_TEAM = JU9BM2NXCW; + DEVELOPMENT_TEAM = 2285AK4JY4; GENERATE_INFOPLIST_FILE = YES; INFOPLIST_FILE = pochak/Info.plist; INFOPLIST_KEY_CFBundleDisplayName = Pochak; @@ -2158,7 +2186,7 @@ CODE_SIGN_STYLE = Automatic; CURRENT_PROJECT_VERSION = 1; DEBUG_INFORMATION_FORMAT = "dwarf-with-dsym"; - DEVELOPMENT_TEAM = JU9BM2NXCW; + DEVELOPMENT_TEAM = 2285AK4JY4; GENERATE_INFOPLIST_FILE = YES; INFOPLIST_FILE = pochak/Info.plist; INFOPLIST_KEY_CFBundleDisplayName = Pochak; diff --git a/pochak/pochak/Network/APIs/Authentication/LogOutAPI.swift b/pochak/pochak/Network/APIs/Authentication/LogOutAPI.swift index d149050c..83679c09 100644 --- a/pochak/pochak/Network/APIs/Authentication/LogOutAPI.swift +++ b/pochak/pochak/Network/APIs/Authentication/LogOutAPI.swift @@ -9,7 +9,7 @@ import Foundation import Alamofire enum LogOutAPI { - case logOut() + case logOut } extension LogOutAPI: BaseAPI { @@ -24,7 +24,7 @@ extension LogOutAPI: BaseAPI { var path: String { switch self { - case .logOut(): return "/v2/logout" + case .logOut: return "/v2/logout" } } } diff --git a/pochak/pochak/Network/APIs/Authentication/SignOutAPI.swift b/pochak/pochak/Network/APIs/Authentication/SignOutAPI.swift index bb48d0c1..558c9632 100644 --- a/pochak/pochak/Network/APIs/Authentication/SignOutAPI.swift +++ b/pochak/pochak/Network/APIs/Authentication/SignOutAPI.swift @@ -9,7 +9,7 @@ import Foundation import Alamofire enum SignOutAPI { - case signOut() + case signOut } extension SignOutAPI: BaseAPI { @@ -24,7 +24,7 @@ extension SignOutAPI: BaseAPI { var path: String { switch self { - case .signOut(): return "/v2/signout" + case .signOut: return "/v2/signout" } } } diff --git a/pochak/pochak/Network/APIs/Profile/ProfileUpdateAPI.swift b/pochak/pochak/Network/APIs/Profile/ProfileUpdateAPI.swift index 267ec985..fa46e1a9 100644 --- a/pochak/pochak/Network/APIs/Profile/ProfileUpdateAPI.swift +++ b/pochak/pochak/Network/APIs/Profile/ProfileUpdateAPI.swift @@ -19,7 +19,7 @@ extension ProfileUpdateAPI: BaseAPI { var method: HTTPMethod { switch self { - case .updateProfile: return .post + case .updateProfile: return .put } } diff --git a/pochak/pochak/Network/APIs/User/FollowerRetrievalAPI.swift b/pochak/pochak/Network/APIs/User/FollowerRetrievalAPI.swift new file mode 100644 index 00000000..b799cf4c --- /dev/null +++ b/pochak/pochak/Network/APIs/User/FollowerRetrievalAPI.swift @@ -0,0 +1,36 @@ +// +// FollowerRetrievalAPI.swift +// pochak +// +// Created by Seo Cindy on 9/30/24. +// + +import Foundation +import Alamofire + +enum FollowerRetrievalAPI { + case getFollowers(handle: String, request: FollowListRequest) +} + +extension FollowerRetrievalAPI: BaseAPI { + + typealias Response = FollowListResponse + + var method: HTTPMethod { + switch self { + case .getFollowers: return .get + } + } + + var path: String { + switch self { + case .getFollowers(let handle, _): return "/v2/members/\(handle)/follower" + } + } + + var parameters: RequestParams? { + switch self { + case .getFollowers(_, let request): return .query(request) + } + } +} diff --git a/pochak/pochak/Network/APIs/User/FollowingRetrievalAPI.swift b/pochak/pochak/Network/APIs/User/FollowingRetrievalAPI.swift new file mode 100644 index 00000000..78dc4d79 --- /dev/null +++ b/pochak/pochak/Network/APIs/User/FollowingRetrievalAPI.swift @@ -0,0 +1,36 @@ +// +// FollowingRetrievalAPI.swift +// pochak +// +// Created by Seo Cindy on 9/30/24. +// + +import Foundation +import Alamofire + +enum FollowingRetrievalAPI { + case getFollowings(handle: String, request: FollowListRequest) +} + +extension FollowingRetrievalAPI: BaseAPI { + + typealias Response = FollowListResponse + + var method: HTTPMethod { + switch self { + case .getFollowings: return .get + } + } + + var path: String { + switch self { + case .getFollowings(let handle, _): return "/v2/members/\(handle)/following" + } + } + + var parameters: RequestParams? { + switch self { + case .getFollowings(_, let request): return .query(request) + } + } +} diff --git a/pochak/pochak/Network/APIs/User/UnblockAPI.swift b/pochak/pochak/Network/APIs/User/UnblockAPI.swift index c39966cf..ac551c8d 100644 --- a/pochak/pochak/Network/APIs/User/UnblockAPI.swift +++ b/pochak/pochak/Network/APIs/User/UnblockAPI.swift @@ -9,12 +9,12 @@ import Foundation import Alamofire enum UnblockAPI { - case unblockUser(handle: String, request: ProfileRetrievalRequest) + case unblockUser(handle: String, request: UnblockRequest) } extension UnblockAPI: BaseAPI { - typealias Response = BlockResponse + typealias Response = UnblockResponse var method: HTTPMethod { switch self { diff --git a/pochak/pochak/Network/APIs/User/UnfollowAPI.swift b/pochak/pochak/Network/APIs/User/UnfollowAPI.swift new file mode 100644 index 00000000..4bf0018c --- /dev/null +++ b/pochak/pochak/Network/APIs/User/UnfollowAPI.swift @@ -0,0 +1,36 @@ +// +// UnfollowAPI.swift +// pochak +// +// Created by Seo Cindy on 9/30/24. +// + +import Foundation +import Alamofire + +enum UnfollowAPI { + case unfollowUser(handle: String, request: UnfollowRequest) +} + +extension UnfollowAPI: BaseAPI { + + typealias Response = FollowResponse + + var method: HTTPMethod { + switch self { + case .unfollowUser: return .delete + } + } + + var path: String { + switch self { + case .unfollowUser(let handle, _): return "/v2/members/\(handle)/follower" + } + } + + var parameters: RequestParams? { + switch self { + case .unfollowUser(_, let request): return .query(request) + } + } +} diff --git a/pochak/pochak/Network/Models/User/FollowListRequest.swift b/pochak/pochak/Network/Models/User/FollowListRequest.swift new file mode 100644 index 00000000..36800a41 --- /dev/null +++ b/pochak/pochak/Network/Models/User/FollowListRequest.swift @@ -0,0 +1,13 @@ +// +// FollowListRequest.swift +// pochak +// +// Created by Seo Cindy on 9/30/24. +// + +import Foundation + + +struct FollowListRequest: Encodable { + let page: Int +} diff --git a/pochak/pochak/Network/Models/User/FollowListResponse.swift b/pochak/pochak/Network/Models/User/FollowListResponse.swift new file mode 100644 index 00000000..86fabc49 --- /dev/null +++ b/pochak/pochak/Network/Models/User/FollowListResponse.swift @@ -0,0 +1,35 @@ +// +// FollowListResponse.swift +// pochak +// +// Created by Seo Cindy on 9/30/24. +// + +import Foundation + +struct FollowListResponse: Codable { + let isSuccess: Bool + let code: String + let message: String + let result: FollowListResult +} + +struct FollowListResult: Codable { + var pageInfo: FollowListPageInfo + var memberList: [MemberListData] +} + +struct FollowListPageInfo: Codable { + var lastPage : Bool + var totalPages : Int + var totalElements : Int + var size : Int +} + +struct MemberListData: Codable { + var memberId: Int + var profileImage: String + var handle: String + var name: String + var isFollow: Bool? +} diff --git a/pochak/pochak/Network/Models/User/UnfollowRequest.swift b/pochak/pochak/Network/Models/User/UnfollowRequest.swift new file mode 100644 index 00000000..d68114ff --- /dev/null +++ b/pochak/pochak/Network/Models/User/UnfollowRequest.swift @@ -0,0 +1,12 @@ +// +// UnfollowRequest.swift +// pochak +// +// Created by Seo Cindy on 9/30/24. +// + +import Foundation + +struct UnfollowRequest: Encodable { + let followerHandle: String +} diff --git a/pochak/pochak/Network/Models/User/UnfollowResponse.swift b/pochak/pochak/Network/Models/User/UnfollowResponse.swift new file mode 100644 index 00000000..7610afd2 --- /dev/null +++ b/pochak/pochak/Network/Models/User/UnfollowResponse.swift @@ -0,0 +1,14 @@ +// +// UnfollowResponse.swift +// pochak +// +// Created by Seo Cindy on 9/30/24. +// + +import Foundation + +struct UnfollowResponse: Codable { + let isSuccess: Bool + let code: String + let message: String +} diff --git a/pochak/pochak/Network/Services/AuthenticationService.swift b/pochak/pochak/Network/Services/AuthenticationService.swift index 84218454..b0eb7ec6 100644 --- a/pochak/pochak/Network/Services/AuthenticationService.swift +++ b/pochak/pochak/Network/Services/AuthenticationService.swift @@ -12,7 +12,7 @@ struct AuthenticationService { /// - completion: 통신 후 핸들러 (뷰컨트롤러에 있음) static func signOut( completion: @escaping (_ succeed: SignOutResponse?, _ failed: NetworkError?) -> Void) { - NetworkService.shared.request(SignOutAPI.signOut()) { response in + NetworkService.shared.request(SignOutAPI.signOut) { response in switch response { case .success(let data): completion(data, nil) @@ -26,7 +26,7 @@ struct AuthenticationService { static func logOut( completion: @escaping (_ succeed: LogOutResponse?, _ failed: NetworkError?) -> Void) { - NetworkService.shared.request(LogOutAPI.logOut()) { response in + NetworkService.shared.request(LogOutAPI.logOut) { response in switch response { case .success(let data): completion(data, nil) diff --git a/pochak/pochak/Network/Services/ProfileService.swift b/pochak/pochak/Network/Services/ProfileService.swift index 1c53f3bd..fdb25b5e 100644 --- a/pochak/pochak/Network/Services/ProfileService.swift +++ b/pochak/pochak/Network/Services/ProfileService.swift @@ -29,7 +29,7 @@ struct ProfileService { static func getProfilePochakPosts( handle: String, - request: PochakPostRetrievalRequest, + request: ProfileRetrievalRequest, completion: @escaping (_ succeed: PochakPostRetrievalResponse?, _ failed: NetworkError?) -> Void) { NetworkService.shared.request(PochakPostRetrievalAPI.getPochakPost(handle: handle, request: request)) { response in switch response { diff --git a/pochak/pochak/Network/Services/UserService.swift b/pochak/pochak/Network/Services/UserService.swift index 674c7875..26b86990 100644 --- a/pochak/pochak/Network/Services/UserService.swift +++ b/pochak/pochak/Network/Services/UserService.swift @@ -28,6 +28,62 @@ struct UserService { } } + /// 팔로우 요청 혹은 취소하기 + /// - Parameters: + /// - handle: 팔로우 요청 혹은 취소하려는 사용자의 핸들 (아이디) + /// - completion: 통신 후 핸들러 (뷰컨트롤러) + static func unfollowUser( + handle: String, + request: UnfollowRequest, + completion: @escaping (_ succeed: FollowResponse?, _ failed: NetworkError?) -> Void) { + NetworkService.shared.request(UnfollowAPI.unfollowUser(handle: handle, request: request)) { response in + switch response { + case .success(let data): + completion(data, nil) + case .failure(let error): + print("=== unfollowUser service error ===") + print(error.localizedDescription) + completion(nil, error) + } + } + } + + /// 팔로우 요청 혹은 취소하기 + /// - Parameters: + /// - handle: 팔로우 요청 혹은 취소하려는 사용자의 핸들 (아이디) + /// - completion: 통신 후 핸들러 (뷰컨트롤러) + static func getFollowers( + handle: String, + request: FollowListRequest, + completion: @escaping (_ succeed: FollowListResponse?, _ failed: NetworkError?) -> Void) { + NetworkService.shared.request(FollowerRetrievalAPI.getFollowers(handle: handle, request: request)) { response in + switch response { + case .success(let data): + completion(data, nil) + case .failure(let error): + print("=== getFollowers service error ===") + print(error.localizedDescription) + completion(nil, error) + } + } + } + + static func getFollowings( + handle: String, + request: FollowListRequest, + completion: @escaping (_ succeed: FollowListResponse?, _ failed: NetworkError?) -> Void) { + NetworkService.shared.request(FollowingRetrievalAPI.getFollowings(handle: handle, request: request)) { response in + switch response { + case .success(let data): + completion(data, nil) + case .failure(let error): + print("=== getFollowings service error ===") + print(error.localizedDescription) + completion(nil, error) + } + } + } + /// 팔로우 요청 혹은 취소하기 /// - Parameters: /// - handle: 팔로우 요청 혹은 취소하려는 사용자의 핸들 (아이디) diff --git a/pochak/pochak/UI/Profile/MyProfile/FollowListTabman/FollowAPI/DeleteFollowerDataManager.swift b/pochak/pochak/UI/Profile/MyProfile/FollowListTabman/FollowAPI/DeleteFollowerDataManager.swift deleted file mode 100644 index a9ac3618..00000000 --- a/pochak/pochak/UI/Profile/MyProfile/FollowListTabman/FollowAPI/DeleteFollowerDataManager.swift +++ /dev/null @@ -1,34 +0,0 @@ -// -// DeleteFollowerDataManager.swift -// pochak -// -// Created by Seo Cindy on 1/30/24. -// - -import Foundation -import Alamofire - -class DeleteFollowerDataManager { - - static let shared = DeleteFollowerDataManager() - - func deleteFollowerDataManager(_ handle : String, _ selectedHandle : String, _ completion: @escaping (DeleteFollowerDataResponse) -> Void) { - - let url = "\(APIConstants.baseURL)/api/v2/members/\(handle)/follower?followerHandle=\(selectedHandle)" - - AF.request(url, - method: .delete, - encoding: URLEncoding.default, - interceptor: RequestInterceptor.getRequestInterceptor()) - .validate() - .responseDecodable(of: DeleteFollowerDataResponse.self) { response in - switch response.result { - case .success(let result): - completion(result) - case .failure(let error): - print("Request Fail : deleteFollowerDataManager") - print(error) - } - } - } -} diff --git a/pochak/pochak/UI/Profile/MyProfile/FollowListTabman/FollowAPI/DeleteFollowerDataModel.swift b/pochak/pochak/UI/Profile/MyProfile/FollowListTabman/FollowAPI/DeleteFollowerDataModel.swift deleted file mode 100644 index 398777b4..00000000 --- a/pochak/pochak/UI/Profile/MyProfile/FollowListTabman/FollowAPI/DeleteFollowerDataModel.swift +++ /dev/null @@ -1,12 +0,0 @@ -// -// DeleteFollowerDataModel.swift -// pochak -// -// Created by Seo Cindy on 1/30/24. -// - -struct DeleteFollowerDataResponse: Codable { - let isSuccess: Bool - let code: String - let message: String -} diff --git a/pochak/pochak/UI/Profile/MyProfile/FollowListTabman/FollowAPI/FollowListDataManager.swift b/pochak/pochak/UI/Profile/MyProfile/FollowListTabman/FollowAPI/FollowListDataManager.swift deleted file mode 100644 index c6f5cec7..00000000 --- a/pochak/pochak/UI/Profile/MyProfile/FollowListTabman/FollowAPI/FollowListDataManager.swift +++ /dev/null @@ -1,67 +0,0 @@ -// -// FollowDataManager.swift -// pochak -// -// Created by Seo Cindy on 1/30/24. -// - -import Foundation -import Alamofire - -class FollowListDataManager { - - static let shared = FollowListDataManager() - - func followerDataManager(_ handle : String, _ page : Int, _ completion: @escaping (FollowListDataModel) -> Void) { - - let url = "\(APIConstants.baseURL)/api/v2/members/\(handle)/follower?page=\(page)" - - AF.request(url, - method: .get, - encoding: URLEncoding.default, - interceptor: RequestInterceptor.getRequestInterceptor()) - .validate() - .responseDecodable(of: FollowListDataResponse.self) { response in - switch response.result { - case .success(let result): - if let data = response.data, let errorMessage = String(data: data, encoding: .utf8) { - print("Success Data for followerDataManager: \(errorMessage)") - } - let resultData = result.result - print(resultData) - completion(resultData) - case .failure(let error): - if let data = response.data, let errorMessage = String(data: data, encoding: .utf8) { - print("Failure Data for followerDataManager: \(errorMessage)") - } - print("Request Fail : followerDataManager") - print(error) - } - } - } - - func followingDataManager(_ handle : String, _ page : Int, _ completion: @escaping (FollowListDataModel) -> Void) { - - let url = "\(APIConstants.baseURLv2)/api/v2/members/\(handle)/following?page=\(page)" - - AF.request(url, - method: .get, - encoding: URLEncoding.default, - interceptor: RequestInterceptor.getRequestInterceptor()) - .validate() - .responseDecodable(of: FollowListDataResponse.self) { response in - print(response) - switch response.result { - case .success(let result): - let resultData = result.result - completion(resultData) - case .failure(let error): - if let data = response.data, let errorMessage = String(data: data, encoding: .utf8) { - print("Failure Data for followingDataManager: \(errorMessage)") - } - print("Request Fail : followingDataManager") - print(error) - } - } - } -} diff --git a/pochak/pochak/UI/Profile/MyProfile/FollowListTabman/FollowAPI/FollowListDataModel.swift b/pochak/pochak/UI/Profile/MyProfile/FollowListTabman/FollowAPI/FollowListDataModel.swift deleted file mode 100644 index f765a611..00000000 --- a/pochak/pochak/UI/Profile/MyProfile/FollowListTabman/FollowAPI/FollowListDataModel.swift +++ /dev/null @@ -1,26 +0,0 @@ -// -// FollowDataModel.swift -// pochak -// -// Created by Seo Cindy on 1/30/24. -// - -struct FollowListDataResponse: Codable { - let isSuccess: Bool - let code: String - let message: String - let result: FollowListDataModel -} - -struct FollowListDataModel: Codable { - var pageInfo: PageDataModel - var memberList: [MemberListDataModel] -} - -struct MemberListDataModel: Codable { - var memberId: Int - var profileImage: String - var handle: String - var name: String - var isFollow: Bool? -} diff --git a/pochak/pochak/UI/Profile/MyProfile/FollowListTabman/FollowAPI/FollowToggleDataManager.swift b/pochak/pochak/UI/Profile/MyProfile/FollowListTabman/FollowAPI/FollowToggleDataManager.swift deleted file mode 100644 index 2b98a5e5..00000000 --- a/pochak/pochak/UI/Profile/MyProfile/FollowListTabman/FollowAPI/FollowToggleDataManager.swift +++ /dev/null @@ -1,34 +0,0 @@ -// -// FollowToggleDataManager.swift -// pochak -// -// Created by Seo Cindy on 1/30/24. -// - -import Foundation -import Alamofire - -class FollowToggleDataManager { - - static let shared = FollowToggleDataManager() - - func followToggleDataManager(_ handle : String, _ completion: @escaping (FollowToggleDataResponse) -> Void) { - - let url = "\(APIConstants.baseURL)/api/v2/members/\(handle)/follow" - - AF.request(url, - method: .post, - encoding: URLEncoding.default, - interceptor: RequestInterceptor.getRequestInterceptor()) - .validate() - .responseDecodable(of: FollowToggleDataResponse.self) { response in - switch response.result { - case .success(let result): - completion(result) - case .failure(let error): - print("Request Fail : followToggleDataManager") - print(error) - } - } - } -} diff --git a/pochak/pochak/UI/Profile/MyProfile/FollowListTabman/FollowAPI/FollowToggleDataModel.swift b/pochak/pochak/UI/Profile/MyProfile/FollowListTabman/FollowAPI/FollowToggleDataModel.swift deleted file mode 100644 index 8aa86b75..00000000 --- a/pochak/pochak/UI/Profile/MyProfile/FollowListTabman/FollowAPI/FollowToggleDataModel.swift +++ /dev/null @@ -1,12 +0,0 @@ -// -// FollowToggleDataModel.swift -// pochak -// -// Created by Seo Cindy on 1/30/24. -// - -struct FollowToggleDataResponse: Codable { - let isSuccess: Bool - let code: String - let message: String -} diff --git a/pochak/pochak/UI/Profile/MyProfile/FollowListTabman/FollowAPI_fin/DeleteFollowerDataManager.swift b/pochak/pochak/UI/Profile/MyProfile/FollowListTabman/FollowAPI_fin/DeleteFollowerDataManager.swift new file mode 100644 index 00000000..9b5c6cd0 --- /dev/null +++ b/pochak/pochak/UI/Profile/MyProfile/FollowListTabman/FollowAPI_fin/DeleteFollowerDataManager.swift @@ -0,0 +1,34 @@ +//// +//// DeleteFollowerDataManager.swift +//// pochak +//// +//// Created by Seo Cindy on 1/30/24. +//// +// +//import Foundation +//import Alamofire +// +//class DeleteFollowerDataManager { +// +// static let shared = DeleteFollowerDataManager() +// +// func deleteFollowerDataManager(_ handle : String, _ selectedHandle : String, _ completion: @escaping (DeleteFollowerDataResponse) -> Void) { +// +// let url = "\(APIConstants.baseURL)/api/v2/members/\(handle)/follower?followerHandle=\(selectedHandle)" +// +// AF.request(url, +// method: .delete, +// encoding: URLEncoding.default, +// interceptor: RequestInterceptor.getRequestInterceptor()) +// .validate() +// .responseDecodable(of: DeleteFollowerDataResponse.self) { response in +// switch response.result { +// case .success(let result): +// completion(result) +// case .failure(let error): +// print("Request Fail : deleteFollowerDataManager") +// print(error) +// } +// } +// } +//} diff --git a/pochak/pochak/UI/Profile/MyProfile/FollowListTabman/FollowAPI_fin/DeleteFollowerDataModel.swift b/pochak/pochak/UI/Profile/MyProfile/FollowListTabman/FollowAPI_fin/DeleteFollowerDataModel.swift new file mode 100644 index 00000000..e24c01ac --- /dev/null +++ b/pochak/pochak/UI/Profile/MyProfile/FollowListTabman/FollowAPI_fin/DeleteFollowerDataModel.swift @@ -0,0 +1,12 @@ +//// +//// DeleteFollowerDataModel.swift +//// pochak +//// +//// Created by Seo Cindy on 1/30/24. +//// +// +//struct DeleteFollowerDataResponse: Codable { +// let isSuccess: Bool +// let code: String +// let message: String +//} diff --git a/pochak/pochak/UI/Profile/MyProfile/FollowListTabman/FollowAPI_fin/FollowListDataManager.swift b/pochak/pochak/UI/Profile/MyProfile/FollowListTabman/FollowAPI_fin/FollowListDataManager.swift new file mode 100644 index 00000000..ec433b1e --- /dev/null +++ b/pochak/pochak/UI/Profile/MyProfile/FollowListTabman/FollowAPI_fin/FollowListDataManager.swift @@ -0,0 +1,67 @@ +//// +//// FollowDataManager.swift +//// pochak +//// +//// Created by Seo Cindy on 1/30/24. +//// +// +//import Foundation +//import Alamofire +// +//class FollowListDataManager { +// +// static let shared = FollowListDataManager() +// +// func followerDataManager(_ handle : String, _ page : Int, _ completion: @escaping (FollowListDataModel) -> Void) { +// +// let url = "\(APIConstants.baseURL)/api/v2/members/\(handle)/follower?page=\(page)" +// +// AF.request(url, +// method: .get, +// encoding: URLEncoding.default, +// interceptor: RequestInterceptor.getRequestInterceptor()) +// .validate() +// .responseDecodable(of: FollowListDataResponse.self) { response in +// switch response.result { +// case .success(let result): +// if let data = response.data, let errorMessage = String(data: data, encoding: .utf8) { +// print("Success Data for followerDataManager: \(errorMessage)") +// } +// let resultData = result.result +// print(resultData) +// completion(resultData) +// case .failure(let error): +// if let data = response.data, let errorMessage = String(data: data, encoding: .utf8) { +// print("Failure Data for followerDataManager: \(errorMessage)") +// } +// print("Request Fail : followerDataManager") +// print(error) +// } +// } +// } +// +// func followingDataManager(_ handle : String, _ page : Int, _ completion: @escaping (FollowListDataModel) -> Void) { +// +// let url = "\(APIConstants.baseURLv2)/api/v2/members/\(handle)/following?page=\(page)" +// +// AF.request(url, +// method: .get, +// encoding: URLEncoding.default, +// interceptor: RequestInterceptor.getRequestInterceptor()) +// .validate() +// .responseDecodable(of: FollowListDataResponse.self) { response in +// print(response) +// switch response.result { +// case .success(let result): +// let resultData = result.result +// completion(resultData) +// case .failure(let error): +// if let data = response.data, let errorMessage = String(data: data, encoding: .utf8) { +// print("Failure Data for followingDataManager: \(errorMessage)") +// } +// print("Request Fail : followingDataManager") +// print(error) +// } +// } +// } +//} diff --git a/pochak/pochak/UI/Profile/MyProfile/FollowListTabman/FollowAPI_fin/FollowListDataModel.swift b/pochak/pochak/UI/Profile/MyProfile/FollowListTabman/FollowAPI_fin/FollowListDataModel.swift new file mode 100644 index 00000000..176c7b9c --- /dev/null +++ b/pochak/pochak/UI/Profile/MyProfile/FollowListTabman/FollowAPI_fin/FollowListDataModel.swift @@ -0,0 +1,26 @@ +// +// FollowDataModel.swift +// pochak +// +// Created by Seo Cindy on 1/30/24. +// + +//struct FollowListDataResponse: Codable { +// let isSuccess: Bool +// let code: String +// let message: String +// let result: FollowListDataModel +//} +// +//struct FollowListDataModel: Codable { +// var pageInfo: PageDataModel +// var memberList: [MemberListDataModel] +//} +// +//struct MemberListDataModel: Codable { +// var memberId: Int +// var profileImage: String +// var handle: String +// var name: String +// var isFollow: Bool? +//} diff --git a/pochak/pochak/UI/Profile/MyProfile/FollowListTabman/FollowAPI_fin/FollowToggleDataManager.swift b/pochak/pochak/UI/Profile/MyProfile/FollowListTabman/FollowAPI_fin/FollowToggleDataManager.swift new file mode 100644 index 00000000..4fe0ff70 --- /dev/null +++ b/pochak/pochak/UI/Profile/MyProfile/FollowListTabman/FollowAPI_fin/FollowToggleDataManager.swift @@ -0,0 +1,34 @@ +//// +//// FollowToggleDataManager.swift +//// pochak +//// +//// Created by Seo Cindy on 1/30/24. +//// +// +//import Foundation +//import Alamofire +// +//class FollowToggleDataManager { +// +// static let shared = FollowToggleDataManager() +// +// func followToggleDataManager(_ handle : String, _ completion: @escaping (FollowToggleDataResponse) -> Void) { +// +// let url = "\(APIConstants.baseURL)/api/v2/members/\(handle)/follow" +// +// AF.request(url, +// method: .post, +// encoding: URLEncoding.default, +// interceptor: RequestInterceptor.getRequestInterceptor()) +// .validate() +// .responseDecodable(of: FollowToggleDataResponse.self) { response in +// switch response.result { +// case .success(let result): +// completion(result) +// case .failure(let error): +// print("Request Fail : followToggleDataManager") +// print(error) +// } +// } +// } +//} diff --git a/pochak/pochak/UI/Profile/MyProfile/FollowListTabman/FollowAPI_fin/FollowToggleDataModel.swift b/pochak/pochak/UI/Profile/MyProfile/FollowListTabman/FollowAPI_fin/FollowToggleDataModel.swift new file mode 100644 index 00000000..f54c9577 --- /dev/null +++ b/pochak/pochak/UI/Profile/MyProfile/FollowListTabman/FollowAPI_fin/FollowToggleDataModel.swift @@ -0,0 +1,12 @@ +//// +//// FollowToggleDataModel.swift +//// pochak +//// +//// Created by Seo Cindy on 1/30/24. +//// +// +//struct FollowToggleDataResponse: Codable { +// let isSuccess: Bool +// let code: String +// let message: String +//} diff --git a/pochak/pochak/UI/Profile/MyProfile/FollowListTabman/FollowerListTabmanViewController.swift b/pochak/pochak/UI/Profile/MyProfile/FollowListTabman/FollowerListTabmanViewController.swift index 8d0b2627..47b644aa 100644 --- a/pochak/pochak/UI/Profile/MyProfile/FollowListTabman/FollowerListTabmanViewController.swift +++ b/pochak/pochak/UI/Profile/MyProfile/FollowListTabman/FollowerListTabmanViewController.swift @@ -16,7 +16,7 @@ class FollowerListTabmanViewController: UIViewController { // MARK: - Properties - var imageArray: [MemberListDataModel] = [] + var imageArray: [MemberListData] = [] var receivedHandle: String? var cellIndexPath: IndexPath? var cellHandle: String? @@ -59,7 +59,7 @@ class FollowerListTabmanViewController: UIViewController { followerCollectionView.delegate = self followerCollectionView.dataSource = self followerCollectionView.register( - UINib(nibName: HomeCollectionViewCell.identifier, bundle: nil), + UINib(nibName: FollowerCollectionViewCell.identifier, bundle: nil), forCellWithReuseIdentifier: FollowerCollectionViewCell.identifier) } @@ -70,31 +70,72 @@ class FollowerListTabmanViewController: UIViewController { } private func setUpData() { - FollowListDataManager.shared.followerDataManager(receivedHandle ?? "",currentFetchingPage,{resultData in - - let newMembers = resultData.memberList - let startIndex = resultData.memberList.count + let request = FollowListRequest(page: currentFetchingPage) + UserService.getFollowers(handle: receivedHandle ?? "", request: request) { [weak self] data, failed in + guard let data = data else { + // 에러가 난 경우, alert 창 present + switch failed { + case .disconnected: + self?.present(UIAlertController.networkErrorAlert(title: failed!.localizedDescription), animated: true) + case .serverError: + self?.present(UIAlertController.networkErrorAlert(title: failed!.localizedDescription), animated: true) + case .unknownError: + self?.present(UIAlertController.networkErrorAlert(title: failed!.localizedDescription), animated: true) + default: + self?.present(UIAlertController.networkErrorAlert(title: "요청에 실패하였습니다."), animated: true) + } + return + } + let newMembers = data.result.memberList + let startIndex = data.result.memberList.count print("startIndex : \(startIndex)") let endIndex = startIndex + newMembers.count print("endIndex : \(endIndex)") let newIndexPaths = (startIndex..>>>>>> Follower is currently reloading!!!!!!!") } else { - self.followerCollectionView.insertItems(at: newIndexPaths) + self?.followerCollectionView.insertItems(at: newIndexPaths) print(">>>>>>> Follower is currently fethcing!!!!!!!") } - self.isCurrentlyFetching = false - self.currentFetchingPage += 1; + self?.isCurrentlyFetching = false + self?.currentFetchingPage += 1; } - }) + + } + // FollowListDataManager.shared.followerDataManager(receivedHandle ?? "",currentFetchingPage,{resultData in + // + // let newMembers = resultData.memberList + // let startIndex = resultData.memberList.count + // print("startIndex : \(startIndex)") + // let endIndex = startIndex + newMembers.count + // print("endIndex : \(endIndex)") + // let newIndexPaths = (startIndex..>>>>>> Follower is currently reloading!!!!!!!") + // } else { + // self.followerCollectionView.insertItems(at: newIndexPaths) + // print(">>>>>>> Follower is currently fethcing!!!!!!!") + // } + // self.isCurrentlyFetching = false + // self.currentFetchingPage += 1; + // } + // }) + // } } } @@ -107,6 +148,7 @@ extension FollowerListTabmanViewController : UICollectionViewDelegate, UICollect } func collectionView(_ collectionView: UICollectionView, cellForItemAt indexPath: IndexPath) -> UICollectionViewCell { + guard let cell = collectionView.dequeueReusableCell( withReuseIdentifier: FollowerCollectionViewCell.identifier, for: indexPath) as? FollowerCollectionViewCell else { @@ -163,11 +205,32 @@ extension FollowerListTabmanViewController: RemoveImageDelegate { extension FollowerListTabmanViewController : CustomAlertDelegate { func confirmAction() { - DeleteFollowerDataManager.shared.deleteFollowerDataManager(receivedHandle ?? "", cellHandle ?? "", { resultData in - print(resultData.message) - self.imageArray.remove(at: self.cellIndexPath!.row) - self.followerCollectionView.reloadData() - }) + let request = UnfollowRequest(followerHandle: cellHandle ?? "") + UserService.unfollowUser(handle: receivedHandle ?? "", request: request) { [weak self] data, failed in + guard let data = data else { + // 에러가 난 경우, alert 창 present + switch failed { + case .disconnected: + self?.present(UIAlertController.networkErrorAlert(title: failed!.localizedDescription), animated: true) + case .serverError: + self?.present(UIAlertController.networkErrorAlert(title: failed!.localizedDescription), animated: true) + case .unknownError: + self?.present(UIAlertController.networkErrorAlert(title: failed!.localizedDescription), animated: true) + default: + self?.present(UIAlertController.networkErrorAlert(title: "요청에 실패하였습니다."), animated: true) + } + return + } + + print(data.message) + self?.imageArray.remove(at: self?.cellIndexPath?.row ?? 10000) + self?.followerCollectionView.reloadData() + } +// DeleteFollowerDataManager.shared.deleteFollowerDataManager(receivedHandle ?? "", cellHandle ?? "", { resultData in +// print(resultData.message) +// self.imageArray.remove(at: self.cellIndexPath!.row) +// self.followerCollectionView.reloadData() +// }) } func cancel() { diff --git a/pochak/pochak/UI/Profile/MyProfile/FollowListTabman/FollowingListTabmanViewController.swift b/pochak/pochak/UI/Profile/MyProfile/FollowListTabman/FollowingListTabmanViewController.swift index bbfcfe4f..92ee5ecd 100644 --- a/pochak/pochak/UI/Profile/MyProfile/FollowListTabman/FollowingListTabmanViewController.swift +++ b/pochak/pochak/UI/Profile/MyProfile/FollowListTabman/FollowingListTabmanViewController.swift @@ -11,7 +11,7 @@ class FollowingListTabmanViewController: UIViewController { // MARK: - Properties - var imageArray: [MemberListDataModel] = [] + var imageArray: [MemberListData] = [] var receivedHandle: String? private var isLastPage: Bool = false private var isCurrentlyFetching: Bool = false @@ -62,30 +62,70 @@ class FollowingListTabmanViewController: UIViewController { } private func setUpData() { - FollowListDataManager.shared.followingDataManager(receivedHandle ?? "", currentFetchingPage, { resultData in - let newMembers = resultData.memberList - let startIndex = resultData.memberList.count + let request = FollowListRequest(page: currentFetchingPage) + UserService.getFollowings(handle: receivedHandle ?? "", request: request) { [weak self] data, failed in + guard let data = data else { + // 에러가 난 경우, alert 창 present + switch failed { + case .disconnected: + self?.present(UIAlertController.networkErrorAlert(title: failed!.localizedDescription), animated: true) + case .serverError: + self?.present(UIAlertController.networkErrorAlert(title: failed!.localizedDescription), animated: true) + case .unknownError: + self?.present(UIAlertController.networkErrorAlert(title: failed!.localizedDescription), animated: true) + default: + self?.present(UIAlertController.networkErrorAlert(title: "요청에 실패하였습니다."), animated: true) + } + return + } + + let newMembers = data.result.memberList + let startIndex = data.result.memberList.count print("startIndex : \(startIndex)") let endIndex = startIndex + newMembers.count print("endIndex : \(endIndex)") let newIndexPaths = (startIndex..>>>>>> Follower is currently reloading!!!!!!!") } else { - self.followingCollectionView.insertItems(at: newIndexPaths) + self?.followingCollectionView.insertItems(at: newIndexPaths) print(">>>>>>> Follower is currently fethcing!!!!!!!") } - self.isCurrentlyFetching = false - self.currentFetchingPage += 1; + self?.isCurrentlyFetching = false + self?.currentFetchingPage += 1; } - }) + } + // FollowListDataManager.shared.followingDataManager(receivedHandle ?? "", currentFetchingPage, { resultData in + // let newMembers = resultData.memberList + // let startIndex = resultData.memberList.count + // print("startIndex : \(startIndex)") + // let endIndex = startIndex + newMembers.count + // print("endIndex : \(endIndex)") + // let newIndexPaths = (startIndex..>>>>>> Follower is currently reloading!!!!!!!") + // } else { + // self.followingCollectionView.insertItems(at: newIndexPaths) + // print(">>>>>>> Follower is currently fethcing!!!!!!!") + // } + // self.isCurrentlyFetching = false + // self.currentFetchingPage += 1; + // } + // }) } } diff --git a/pochak/pochak/UI/Profile/MyProfile/FollowListTabman/cell/FollowerCollectionViewCell.swift b/pochak/pochak/UI/Profile/MyProfile/FollowListTabman/cell/FollowerCollectionViewCell.swift index 5cdfeb54..a0e55aa3 100644 --- a/pochak/pochak/UI/Profile/MyProfile/FollowListTabman/cell/FollowerCollectionViewCell.swift +++ b/pochak/pochak/UI/Profile/MyProfile/FollowListTabman/cell/FollowerCollectionViewCell.swift @@ -48,9 +48,14 @@ class FollowerCollectionViewCell: UICollectionViewCell { } @objc func toggleFollowBtn(_ sender: UIButton) { - FollowToggleDataManager.shared.followToggleDataManager(cellHandle, { resultData in - var resultCode = resultData.code - print(resultData.message) + UserService.postFollowRequest(handle: cellHandle) { data, failed in + guard let data = data else { + print("error") + return + } + + var resultCode = data.code + print(data.message) if resultCode == "FOLLOW2002" { sender.setTitle("팔로우", for: .normal) sender.backgroundColor = UIColor(named: "yellow00") @@ -58,7 +63,19 @@ class FollowerCollectionViewCell: UICollectionViewCell { sender.setTitle("팔로잉", for: .normal) sender.backgroundColor = UIColor(named: "gray03") } - }) + + } +// FollowToggleDataManager.shared.followToggleDataManager(cellHandle, { resultData in +// var resultCode = resultData.code +// print(resultData.message) +// if resultCode == "FOLLOW2002" { +// sender.setTitle("팔로우", for: .normal) +// sender.backgroundColor = UIColor(named: "yellow00") +// } else if resultCode == "FOLLOW2001" { +// sender.setTitle("팔로잉", for: .normal) +// sender.backgroundColor = UIColor(named: "gray03") +// } +// }) } // MARK: - Functions @@ -72,7 +89,7 @@ class FollowerCollectionViewCell: UICollectionViewCell { followBtn.isHidden = false } - func setUpCellData(_ memberDataModel : MemberListDataModel) { + func setUpCellData(_ memberDataModel : MemberListData) { let imageURL = memberDataModel.profileImage if let url = URL(string: imageURL) { profileImageBtn.kf.setImage(with: url, for: .normal, completionHandler: { result in diff --git a/pochak/pochak/UI/Profile/MyProfile/FollowListTabman/cell/FollowingCollectionViewCell.swift b/pochak/pochak/UI/Profile/MyProfile/FollowListTabman/cell/FollowingCollectionViewCell.swift index 2b4fe1d6..ab39d21a 100644 --- a/pochak/pochak/UI/Profile/MyProfile/FollowListTabman/cell/FollowingCollectionViewCell.swift +++ b/pochak/pochak/UI/Profile/MyProfile/FollowListTabman/cell/FollowingCollectionViewCell.swift @@ -32,16 +32,30 @@ class FollowingCollectionViewCell: UICollectionViewCell { // MARK: - Actions @objc func toggleFollowBtn(_ sender: UIButton) { - FollowToggleDataManager.shared.followToggleDataManager(cellHandle, { resultData in - print(resultData.message) - if resultData.message == "성공적으로 팔로우를 취소하였습니다." { + UserService.postFollowRequest(handle: cellHandle) { data, failed in + guard let data = data else { + print("error") + return + } + print(data.message) + if data.message == "성공적으로 팔로우를 취소하였습니다." { sender.setTitle("팔로우", for: .normal) sender.backgroundColor = UIColor(named: "yellow00") - } else if resultData.message == "성공적으로 팔로우하였습니다."{ + } else if data.message == "성공적으로 팔로우하였습니다."{ sender.setTitle("팔로잉", for: .normal) sender.backgroundColor = UIColor(named: "gray03") } - }) + } +// FollowToggleDataManager.shared.followToggleDataManager(cellHandle, { resultData in +// print(resultData.message) +// if resultData.message == "성공적으로 팔로우를 취소하였습니다." { +// sender.setTitle("팔로우", for: .normal) +// sender.backgroundColor = UIColor(named: "yellow00") +// } else if resultData.message == "성공적으로 팔로우하였습니다."{ +// sender.setTitle("팔로잉", for: .normal) +// sender.backgroundColor = UIColor(named: "gray03") +// } +// }) } // MARK: - Functions @@ -54,7 +68,7 @@ class FollowingCollectionViewCell: UICollectionViewCell { followStateToggleBtn.isHidden = false } - func setUpCellData(_ memberDataModel : MemberListDataModel) { + func setUpCellData(_ memberDataModel : MemberListData) { var imageURL = memberDataModel.profileImage if let url = URL(string: imageURL) { profileImageBtn.kf.setImage(with: url, for: .normal) diff --git a/pochak/pochak/UI/Profile/MyProfile/MyProfileTabViewController.swift b/pochak/pochak/UI/Profile/MyProfile/MyProfileTabViewController.swift index 1ff16548..3a5277bb 100644 --- a/pochak/pochak/UI/Profile/MyProfile/MyProfileTabViewController.swift +++ b/pochak/pochak/UI/Profile/MyProfile/MyProfileTabViewController.swift @@ -127,18 +127,18 @@ class MyProfileTabViewController: UIViewController { private func setUpData() { let request = ProfileRetrievalRequest(page: 0) - ProfileService.getProfile(handle: handle, request: request) { [weak self] data, failed in + ProfileService.getProfile(handle: handle, request: request) { data, failed in guard let data = data else { // 에러가 난 경우, alert 창 present switch failed { case .disconnected: - self?.present(UIAlertController.networkErrorAlert(title: failed!.localizedDescription), animated: true) + self.present(UIAlertController.networkErrorAlert(title: failed!.localizedDescription), animated: true) case .serverError: - self?.present(UIAlertController.networkErrorAlert(title: failed!.localizedDescription), animated: true) + self.present(UIAlertController.networkErrorAlert(title: failed!.localizedDescription), animated: true) case .unknownError: - self?.present(UIAlertController.networkErrorAlert(title: failed!.localizedDescription), animated: true) + self.present(UIAlertController.networkErrorAlert(title: failed!.localizedDescription), animated: true) default: - self?.present(UIAlertController.networkErrorAlert(title: "요청에 실패하였습니다."), animated: true) + self.present(UIAlertController.networkErrorAlert(title: "요청에 실패하였습니다."), animated: true) } return } @@ -147,9 +147,8 @@ class MyProfileTabViewController: UIViewController { print("== data: \(data)") // load 프로필 이미지 - var imageURL = data.result.profileImage - if let url = URL(string: (imageURL)) { - profileImage.load(with: url) + if let url = URL(string: data.result.profileImage ?? "") { + self.profileImage.load(with: url) } // 필요한 데이터 뷰에 반영 self.setUpResponseData(data.result) diff --git a/pochak/pochak/UI/Profile/MyProfile/PostListTabman/PochakPostTabmanViewController.swift b/pochak/pochak/UI/Profile/MyProfile/PostListTabman/PochakPostTabmanViewController.swift index 7e97ee02..1604b24a 100644 --- a/pochak/pochak/UI/Profile/MyProfile/PostListTabman/PochakPostTabmanViewController.swift +++ b/pochak/pochak/UI/Profile/MyProfile/PostListTabman/PochakPostTabmanViewController.swift @@ -12,7 +12,7 @@ class PochakPostTabmanViewController: UIViewController { // MARK: - Properties var receivedHandle: String? - var imageArray: [PostDataModel] = [] + var imageArray: [ProfilePostList] = [] private var isLastPage: Bool = false private var isCurrentlyFetching: Bool = false private var currentFetchingPage: Int = 0 @@ -64,7 +64,7 @@ class PochakPostTabmanViewController: UIViewController { private func setUpData() { isCurrentlyFetching = true let request = ProfileRetrievalRequest(page: currentFetchingPage) - ProfileService.getProfilePochakPosts(handle: receivedHandle, request: request) { [weak self] data, failed in + ProfileService.getProfilePochakPosts(handle: receivedHandle ?? "", request: request) { [weak self] data, failed in guard let data = data else { // 에러가 난 경우, alert 창 present switch failed { @@ -87,18 +87,18 @@ class PochakPostTabmanViewController: UIViewController { let startIndex = data.result.postList.count let endIndex = startIndex + newPosts.count let newIndexPaths = (startIndex..>>>>>> PochakPostDataManager is currently reloading!!!!!!!") } else { - self.postCollectionView.insertItems(at: newIndexPaths) + self?.postCollectionView.insertItems(at: newIndexPaths) } - self.isCurrentlyFetching = false - self.currentFetchingPage += 1; + self?.isCurrentlyFetching = false + self?.currentFetchingPage += 1; } } // MyProfilePostDataManager.shared.myProfilePochakPostDataManager(receivedHandle ?? "",currentFetchingPage,{resultData in diff --git a/pochak/pochak/UI/Profile/MyProfile/PostListTabman/PochakedPostTabmanViewController.swift b/pochak/pochak/UI/Profile/MyProfile/PostListTabman/PochakedPostTabmanViewController.swift index cda8ed48..006d7057 100644 --- a/pochak/pochak/UI/Profile/MyProfile/PostListTabman/PochakedPostTabmanViewController.swift +++ b/pochak/pochak/UI/Profile/MyProfile/PostListTabman/PochakedPostTabmanViewController.swift @@ -12,7 +12,7 @@ class PochakedPostTabmanViewController: UIViewController { // MARK: - Properties var receivedHandle: String? - var imageArray: [PostDataModel] = [] + var imageArray: [ProfilePostList] = [] private var isLastPage: Bool = false private var isCurrentlyFetching: Bool = false private var currentFetchingPage: Int = 0 @@ -63,7 +63,7 @@ class PochakedPostTabmanViewController: UIViewController { private func setUpData() { isCurrentlyFetching = true let request = ProfileRetrievalRequest(page: currentFetchingPage) - ProfileService.getProfile(handle: receivedHandle, request: request) { [weak self] data, failed in + ProfileService.getProfile(handle: receivedHandle ?? "", request: request) { [weak self] data, failed in guard let data = data else { // 에러가 난 경우, alert 창 present switch failed { @@ -89,53 +89,54 @@ class PochakedPostTabmanViewController: UIViewController { print("endIndex : \(endIndex)") let newIndexPaths = (startIndex..>>>>>> PochakedPostDataManager is currently reloading!!!!!!!") } else { - self.postCollectionView.insertItems(at: newIndexPaths) + self?.postCollectionView.insertItems(at: newIndexPaths) print(">>>>>>> PochakedPostDataManager is currently fethcing!!!!!!!") } - self.isCurrentlyFetching = false - self.currentFetchingPage += 1; + self?.isCurrentlyFetching = false + self?.currentFetchingPage += 1; } } -// MyProfilePostDataManager.shared.myProfileUserAndPochakedPostDataManager(receivedHandle ?? "", currentFetchingPage, { response in -// switch response { -// case .success(let resultData): -// -// let newPosts = resultData.postList -// let startIndex = resultData.postList.count -// print("startIndex : \(startIndex)") -// let endIndex = startIndex + newPosts.count -// print("endIndex : \(endIndex)") -// let newIndexPaths = (startIndex..>>>>>> PochakedPostDataManager is currently reloading!!!!!!!") -// } else { -// self.postCollectionView.insertItems(at: newIndexPaths) -// print(">>>>>>> PochakedPostDataManager is currently fethcing!!!!!!!") -// } -// self.isCurrentlyFetching = false -// self.currentFetchingPage += 1; -// } -// case .MEMBER4002: -// print("유효하지 않은 멤버의 handle입니다.") -// } -// }) -// } + // MyProfilePostDataManager.shared.myProfileUserAndPochakedPostDataManager(receivedHandle ?? "", currentFetchingPage, { response in + // switch response { + // case .success(let resultData): + // + // let newPosts = resultData.postList + // let startIndex = resultData.postList.count + // print("startIndex : \(startIndex)") + // let endIndex = startIndex + newPosts.count + // print("endIndex : \(endIndex)") + // let newIndexPaths = (startIndex..>>>>>> PochakedPostDataManager is currently reloading!!!!!!!") + // } else { + // self.postCollectionView.insertItems(at: newIndexPaths) + // print(">>>>>>> PochakedPostDataManager is currently fethcing!!!!!!!") + // } + // self.isCurrentlyFetching = false + // self.currentFetchingPage += 1; + // } + // case .MEMBER4002: + // print("유효하지 않은 멤버의 handle입니다.") + // } + // }) + // } + } } // MARK: - Extension : UICollectionViewDelegate, UICollectionViewDataSource, UICollectionViewDelegateFlowLayout, UIScrollViewDelegate diff --git a/pochak/pochak/UI/Profile/MyProfile/PostListTabman/cell/ProfilePostCollectionViewCell.swift b/pochak/pochak/UI/Profile/MyProfile/PostListTabman/cell/ProfilePostCollectionViewCell.swift index 81631014..8e1ab5f4 100644 --- a/pochak/pochak/UI/Profile/MyProfile/PostListTabman/cell/ProfilePostCollectionViewCell.swift +++ b/pochak/pochak/UI/Profile/MyProfile/PostListTabman/cell/ProfilePostCollectionViewCell.swift @@ -26,7 +26,7 @@ class ProfilePostCollectionViewCell: UICollectionViewCell { // MARK: - Functions - func setUpCellData(_ postDataModel : PostDataModel) { + func setUpCellData(_ postDataModel : ProfilePostList) { var imageURL = postDataModel.postImage if let url = URL(string: (imageURL)) { profilePostImage.load(with: url) diff --git a/pochak/pochak/UI/Profile/MyProfile/Setting/BlockedUserList/BlockListAPI_fin/BlockedUserListDataManager.swift b/pochak/pochak/UI/Profile/MyProfile/Setting/BlockedUserList/BlockListAPI_fin/BlockedUserListDataManager.swift index e50e9f38..9b080d2f 100644 --- a/pochak/pochak/UI/Profile/MyProfile/Setting/BlockedUserList/BlockListAPI_fin/BlockedUserListDataManager.swift +++ b/pochak/pochak/UI/Profile/MyProfile/Setting/BlockedUserList/BlockListAPI_fin/BlockedUserListDataManager.swift @@ -1,38 +1,38 @@ +//// +//// BlockedUserListDataManager.swift +//// pochak +//// +//// Created by Seo Cindy on 7/5/24. +//// // -// BlockedUserListDataManager.swift -// pochak +//import Foundation +//import Alamofire // -// Created by Seo Cindy on 7/5/24. -// - -import Foundation -import Alamofire - -class BlockedUserListDataManager{ - - static let shared = BlockedUserListDataManager() - - func blockedUserListDataManager(_ handle : String,_ page : Int, _ completion: @escaping (BlockedUserDataModel) -> Void) { - - let url = "\(APIConstants.baseURL)/api/v2/members/\(handle)/block?page=\(page)" - - AF.request(url, - method: .get, - encoding: URLEncoding.default, - interceptor: RequestInterceptor.getRequestInterceptor()) - .validate() - .responseDecodable(of: BlockedUserDataResponse.self) { response in - switch response.result { - case .success(let result): - let resultData = result.result - print(">>>>> resultData : \(resultData)") - completion(resultData) - case .failure(let error): - print("Request Fail : blockedUserListDataManager") - if let data = response.data, let errorMessage = String(data: data, encoding: .utf8) { - print("Failure Data: \(errorMessage)") - } - } - } - } -} +//class BlockedUserListDataManager{ +// +// static let shared = BlockedUserListDataManager() +// +// func blockedUserListDataManager(_ handle : String,_ page : Int, _ completion: @escaping (BlockedUserDataModel) -> Void) { +// +// let url = "\(APIConstants.baseURL)/api/v2/members/\(handle)/block?page=\(page)" +// +// AF.request(url, +// method: .get, +// encoding: URLEncoding.default, +// interceptor: RequestInterceptor.getRequestInterceptor()) +// .validate() +// .responseDecodable(of: BlockedUserDataResponse.self) { response in +// switch response.result { +// case .success(let result): +// let resultData = result.result +// print(">>>>> resultData : \(resultData)") +// completion(resultData) +// case .failure(let error): +// print("Request Fail : blockedUserListDataManager") +// if let data = response.data, let errorMessage = String(data: data, encoding: .utf8) { +// print("Failure Data: \(errorMessage)") +// } +// } +// } +// } +//} diff --git a/pochak/pochak/UI/Profile/MyProfile/Setting/BlockedUserList/BlockListAPI_fin/BlockedUserListDataModel.swift b/pochak/pochak/UI/Profile/MyProfile/Setting/BlockedUserList/BlockListAPI_fin/BlockedUserListDataModel.swift index ce5fa25d..798f390b 100644 --- a/pochak/pochak/UI/Profile/MyProfile/Setting/BlockedUserList/BlockListAPI_fin/BlockedUserListDataModel.swift +++ b/pochak/pochak/UI/Profile/MyProfile/Setting/BlockedUserList/BlockListAPI_fin/BlockedUserListDataModel.swift @@ -1,33 +1,33 @@ +//// +//// BlockedUserListDataModel.swift +//// pochak +//// +//// Created by Seo Cindy on 7/5/24. +//// // -// BlockedUserListDataModel.swift -// pochak +//import Foundation // -// Created by Seo Cindy on 7/5/24. +//struct BlockedUserDataResponse : Codable { +// var isSuccess: Bool +// var code: String +// var message: String +// var result : BlockedUserDataModel +//} // - -import Foundation - -struct BlockedUserDataResponse : Codable { - var isSuccess: Bool - var code: String - var message: String - var result : BlockedUserDataModel -} - -struct BlockedUserDataModel : Codable { - var pageInfo: BlockedUserPageDataModel - var blockList: [BlockedUserListDataModel] -} - -struct BlockedUserPageDataModel : Codable { - var lastPage : Bool - var totalPages: Int - var totalElements: Int - var size: Int -} - -struct BlockedUserListDataModel : Codable { - var profileImage: String - var handle: String - var name: String -} +//struct BlockedUserDataModel : Codable { +// var pageInfo: BlockedUserPageDataModel +// var blockList: [BlockedUserListDataModel] +//} +// +//struct BlockedUserPageDataModel : Codable { +// var lastPage : Bool +// var totalPages: Int +// var totalElements: Int +// var size: Int +//} +// +//struct BlockedUserListDataModel : Codable { +// var profileImage: String +// var handle: String +// var name: String +//} diff --git a/pochak/pochak/UI/Profile/MyProfile/Setting/BlockedUserList/BlockedUserViewController.swift b/pochak/pochak/UI/Profile/MyProfile/Setting/BlockedUserList/BlockedUserViewController.swift index 0721dd31..0b13524e 100644 --- a/pochak/pochak/UI/Profile/MyProfile/Setting/BlockedUserList/BlockedUserViewController.swift +++ b/pochak/pochak/UI/Profile/MyProfile/Setting/BlockedUserList/BlockedUserViewController.swift @@ -15,7 +15,7 @@ protocol RemoveCellDelegate: AnyObject { class BlockedUserViewController: UIViewController { // MARK: - Properties - var blockedUserList: [BlockedUserListDataModel] = [] + var blockedUserList: [BlockList] = [] var cellIndexPath: IndexPath? var cellHandle: String? private var isLastPage: Bool = false @@ -70,21 +70,21 @@ class BlockedUserViewController: UIViewController { } private func setUpData() { - let handle = UserDefaultsManager.getData(type: String.self, forKey: .handle) ?? "handle not found" isCurrentlyFetching = true + let handle = UserDefaultsManager.getData(type: String.self, forKey: .handle) ?? "handle not found" let request = BlockListRequest(page: currentFetchingPage) - UserService.getBlockUserList(handle: handle, request: request) { [weak self] data, failed in + UserService.getBlockUserList(handle: handle, request: request) { data, failed in guard let data = data else { // 에러가 난 경우, alert 창 present switch failed { case .disconnected: - self?.present(UIAlertController.networkErrorAlert(title: failed!.localizedDescription), animated: true) + self.present(UIAlertController.networkErrorAlert(title: failed!.localizedDescription), animated: true) case .serverError: - self?.present(UIAlertController.networkErrorAlert(title: failed!.localizedDescription), animated: true) + self.present(UIAlertController.networkErrorAlert(title: failed!.localizedDescription), animated: true) case .unknownError: - self?.present(UIAlertController.networkErrorAlert(title: failed!.localizedDescription), animated: true) + self.present(UIAlertController.networkErrorAlert(title: failed!.localizedDescription), animated: true) default: - self?.present(UIAlertController.networkErrorAlert(title: "요청에 실패하였습니다."), animated: true) + self.present(UIAlertController.networkErrorAlert(title: "요청에 실패하였습니다."), animated: true) } return } @@ -167,8 +167,8 @@ extension BlockedUserViewController: RemoveCellDelegate { extension BlockedUserViewController: CustomAlertDelegate { func confirmAction() { - let userHandle = UserDefaultsManager.getData(type: String.self, forKey: .handle) - let request = UnblockRequest(blockedMemberHandle: cellHandle) + let userHandle = UserDefaultsManager.getData(type: String.self, forKey: .handle) ?? "" + let request = UnblockRequest(blockedMemberHandle: cellHandle ?? "") UserService.unblockUser(handle: userHandle, request: request) { [weak self] data, failed in guard let data = data else { // 에러가 난 경우, alert 창 present @@ -185,8 +185,8 @@ extension BlockedUserViewController: CustomAlertDelegate { return } - self.blockedUserList.remove(at: self.cellIndexPath!.row) - self.tableView.reloadData() + self?.blockedUserList.remove(at: self?.cellIndexPath!.row ?? 1000) + self?.tableView.reloadData() } // UnBlockDataManager.shared.unBlockDataManager(userHandle ?? "" , cellHandle ?? "", { resultData in diff --git a/pochak/pochak/UI/Profile/MyProfile/Setting/BlockedUserList/cell/BlockedUserTableViewCell.swift b/pochak/pochak/UI/Profile/MyProfile/Setting/BlockedUserList/cell/BlockedUserTableViewCell.swift index 371a16d4..84651973 100644 --- a/pochak/pochak/UI/Profile/MyProfile/Setting/BlockedUserList/cell/BlockedUserTableViewCell.swift +++ b/pochak/pochak/UI/Profile/MyProfile/Setting/BlockedUserList/cell/BlockedUserTableViewCell.swift @@ -59,7 +59,7 @@ class BlockedUserTableViewCell: UITableViewCell { unblockButton.layer.cornerRadius = 5 } - func setUpCellData(_ blockedUserList : BlockedUserListDataModel) { + func setUpCellData(_ blockedUserList : BlockList) { // load 프로필 이미지 var imageURL = blockedUserList.profileImage if let url = URL(string: (imageURL)) { diff --git a/pochak/pochak/UI/Profile/MyProfile/Setting/SettingsViewController.swift b/pochak/pochak/UI/Profile/MyProfile/Setting/SettingsViewController.swift index 82c0d8a4..2bbc9200 100644 --- a/pochak/pochak/UI/Profile/MyProfile/Setting/SettingsViewController.swift +++ b/pochak/pochak/UI/Profile/MyProfile/Setting/SettingsViewController.swift @@ -151,7 +151,11 @@ extension SettingsViewController: CustomAlertDelegate { func confirmAction() { if selectedBtn == 0 { - AuthenticationService.logOut { [weak self] data, failed in + AuthenticationService.logOut { data, failed in + guard let data = data else { + print(failed) + return + } let message = data.message print(message) } @@ -165,7 +169,11 @@ extension SettingsViewController: CustomAlertDelegate { moveToMainPage() } else if selectedBtn == 1 { - AuthenticationService.signOut { [weak self] data, failed in + AuthenticationService.signOut { data, failed in + guard let data = data else { + print(failed) + return + } let message = data.message print(message) } diff --git a/pochak/pochak/UI/Profile/MyProfile/UpdateProfileViewController.swift b/pochak/pochak/UI/Profile/MyProfile/UpdateProfileViewController.swift index 9dce541e..31cb075a 100644 --- a/pochak/pochak/UI/Profile/MyProfile/UpdateProfileViewController.swift +++ b/pochak/pochak/UI/Profile/MyProfile/UpdateProfileViewController.swift @@ -41,8 +41,7 @@ class UpdateProfileViewController: UIViewController { // UserDefaults에 데이터 추가 guard let name = nameTextField.text else {return} guard let message = messageTextView.text else {return} - guard let profileImage = profileImg.image.jpegData(compressionQuality: 0.2) else {return} - + let profileImage: Data? = profileImg.image?.jpegData(compressionQuality: 0.2) let request = ProfileUpdateRequest(name: name, message: message) var files: [(Data, String, String)] = [] if let profileImage = profileImage { @@ -70,7 +69,7 @@ class UpdateProfileViewController: UIViewController { UserDefaultsManager.setData(value: data.result.message, key: .message) UserDefaultsManager.setData(value: data.result.profileImage, key: .profileImgUrl) // 프로필 화면으로 전환 - self.navigationController?.popViewController(animated: true) + self?.navigationController?.popViewController(animated: true) } // ProfileUpdateDataManager.shared.updateDataManager(name, diff --git a/pochak/pochak/UI/Profile/OtherProfile/OtherUserProfileViewController.swift b/pochak/pochak/UI/Profile/OtherProfile/OtherUserProfileViewController.swift index a9a50a75..7ed129db 100644 --- a/pochak/pochak/UI/Profile/OtherProfile/OtherUserProfileViewController.swift +++ b/pochak/pochak/UI/Profile/OtherProfile/OtherUserProfileViewController.swift @@ -79,9 +79,26 @@ class OtherUserProfileViewController: UIViewController { confirmButtonText: "계속하기" ) } else { - FollowToggleDataManager.shared.followToggleDataManager(self.receivedHandle ?? "", { resultData in - print(resultData.message) - }) + UserService.postFollowRequest(handle: receivedHandle ?? "") { [weak self] data, failed in + guard let data = data else { + // 에러가 난 경우, alert 창 present + switch failed { + case .disconnected: + self?.present(UIAlertController.networkErrorAlert(title: failed!.localizedDescription), animated: true) + case .serverError: + self?.present(UIAlertController.networkErrorAlert(title: failed!.localizedDescription), animated: true) + case .unknownError: + self?.present(UIAlertController.networkErrorAlert(title: failed!.localizedDescription), animated: true) + default: + self?.present(UIAlertController.networkErrorAlert(title: "요청에 실패하였습니다."), animated: true) + } + return + } + print(data.message) + } + // FollowToggleDataManager.shared.followToggleDataManager(self.receivedHandle ?? "", { resultData in + // print(resultData.message) + // }) self.receivedIsFollow = true sender.setTitle("팔로잉", for: .normal) sender.backgroundColor = UIColor(named: "gray03") @@ -169,71 +186,86 @@ class OtherUserProfileViewController: UIViewController { } private func setUpData() { - MyProfilePostDataManager.shared.myProfileUserAndPochakedPostDataManager(receivedHandle ?? "",0,{ - response in - switch response { - case .success(let resultData): - let currentHandle = UserDefaultsManager.getData(type: String.self, forKey: .handle) - let imageURL = resultData.profileImage ?? "" - if let url = URL(string: imageURL) { - self.profileImage.kf.setImage(with: url) { result in - switch result { - case .success(let value): - print("Image successfully loaded: \(value.image)") - case .failure(let error): - print("Image failed to load with error: \(error.localizedDescription)") - } - } + let request = ProfileRetrievalRequest(page: 0) + ProfileService.getProfile(handle: receivedHandle ?? "", request: request) { data, failed in + guard let data = data else { + // 에러가 난 경우, alert 창 present + switch failed { + case .disconnected: + self.present(UIAlertController.networkErrorAlert(title: failed!.localizedDescription), animated: true) + case .serverError: + self.present(UIAlertController.networkErrorAlert(title: failed!.localizedDescription), animated: true) + case .unknownError: + self.present(UIAlertController.networkErrorAlert(title: failed!.localizedDescription), animated: true) + default: + self.present(UIAlertController.networkErrorAlert(title: "요청에 실패하였습니다."), animated: true) } + return + } + + print("=== Profile, setup data succeeded ===") + print("== data: \(data)") + + let currentHandle = UserDefaultsManager.getData(type: String.self, forKey: .handle) + // load 프로필 이미지 + if let url = URL(string: data.result.profileImage ?? "") { + self.profileImage.load(with: url) + } + + // 필요한 데이터 뷰에 반영 + self.setUpResponseData(data.result) + + // 버튼 설정 + if currentHandle == self.receivedHandle{ + /// 내 프로필 조회한 경우 + self.followToggleBtn.layer.isHidden = true + self.updateProfileBtn.layer.isHidden = false + self.postListTabmanView.topAnchor.constraint(equalTo: self.whiteBackground.bottomAnchor, constant: 5).isActive = true + self.moreButton.isHidden = true - // 필요한 데이터 뷰에 반영 - self.userName.text = String(resultData.name ?? "") - self.userMessage.text = String(resultData.message ?? "") - self.postCount.text = String(resultData.totalPostNum ?? 0) - self.followerCount.text = String(resultData.followerCount ?? 0) - self.followingCount.text = String(resultData.followingCount ?? 0) - self.receivedFollowerCount = resultData.followerCount ?? 0 - self.receivedFollowingCount = resultData.followingCount ?? 0 - self.receivedIsFollow = resultData.isFollow + } else { + self.followToggleBtn.setTitleColor(UIColor.white, for: .normal) + self.followToggleBtn.titleLabel?.font = UIFont(name: "Pretendard-Bold", size: 16) // 폰트 설정 + self.followToggleBtn.layer.cornerRadius = 5 - // 버튼 설정 - if currentHandle == self.receivedHandle{ - /// 내 프로필 조회한 경우 - self.followToggleBtn.layer.isHidden = true - self.updateProfileBtn.layer.isHidden = false - self.postListTabmanView.topAnchor.constraint(equalTo: self.whiteBackground.bottomAnchor, constant: 5).isActive = true - self.moreButton.isHidden = true + if data.result.isFollow == true { + /// 팔로우 중인 유저인 경우 + self.followToggleBtn.setTitle("팔로잉", for: .normal) + self.followToggleBtn.backgroundColor = UIColor(named: "gray03") } else { - self.followToggleBtn.setTitleColor(UIColor.white, for: .normal) - self.followToggleBtn.titleLabel?.font = UIFont(name: "Pretendard-Bold", size: 16) // 폰트 설정 - self.followToggleBtn.layer.cornerRadius = 5 + /// 팔로우하고 있지 않은 유저인 경우 + self.followToggleBtn.setTitle("팔로우", for: .normal) + self.followToggleBtn.backgroundColor = UIColor(named: "yellow00") - if resultData.isFollow == true { - /// 팔로우 중인 유저인 경우 - self.followToggleBtn.setTitle("팔로잉", for: .normal) - self.followToggleBtn.backgroundColor = UIColor(named: "gray03") - - } else { - /// 팔로우하고 있지 않은 유저인 경우 - self.followToggleBtn.setTitle("팔로우", for: .normal) - self.followToggleBtn.backgroundColor = UIColor(named: "yellow00") - - } } - case .MEMBER4002: - self.navigationController?.popViewController(animated: true) - print("유효하지 않은 멤버의 handle입니다.") - self.navigationItem.title = "" - self.searchBlockedUser = true - self.showAlert(alertType: .confirmOnly, - titleText: "차단한 유저의 프로필입니다.", - messageText: "차단해제를 원하시면\n설정 탭의 차단관리 페이지를 확인해주세요.", - cancelButtonText: "", - confirmButtonText: "확인" - ) + } - }) + // case .MEMBER4002: + // self.navigationController?.popViewController(animated: true) + // print("유효하지 않은 멤버의 handle입니다.") + // self.navigationItem.title = "" + // self.searchBlockedUser = true + // self.showAlert(alertType: .confirmOnly, + // titleText: "차단한 유저의 프로필입니다.", + // messageText: "차단해제를 원하시면\n설정 탭의 차단관리 페이지를 확인해주세요.", + // cancelButtonText: "", + // confirmButtonText: "확인" + // ) + // } + // }) + } + } + + private func setUpResponseData(_ resposeData: ProfileRetrievalResult) { + self.userName.text = String(resposeData.name ?? "") + self.userMessage.text = String(resposeData.message ?? "") + self.postCount.text = String(resposeData.totalPostNum ?? 0) + self.followerCount.text = String(resposeData.followerCount ?? 0) + self.followingCount.text = String(resposeData.followingCount ?? 0) + self.receivedFollowerCount = resposeData.followerCount ?? 0 + self.receivedFollowingCount = resposeData.followingCount ?? 0 + self.receivedIsFollow = resposeData.isFollow } } @@ -245,9 +277,26 @@ extension OtherUserProfileViewController: CustomAlertDelegate { if searchBlockedUser { print("confirm selected!") } else { - FollowToggleDataManager.shared.followToggleDataManager(receivedHandle ?? "", { resultData in - print(resultData.message) - }) + UserService.postFollowRequest(handle: receivedHandle ?? "") { [weak self] data, failed in + guard let data = data else { + // 에러가 난 경우, alert 창 present + switch failed { + case .disconnected: + self?.present(UIAlertController.networkErrorAlert(title: failed!.localizedDescription), animated: true) + case .serverError: + self?.present(UIAlertController.networkErrorAlert(title: failed!.localizedDescription), animated: true) + case .unknownError: + self?.present(UIAlertController.networkErrorAlert(title: failed!.localizedDescription), animated: true) + default: + self?.present(UIAlertController.networkErrorAlert(title: "요청에 실패하였습니다."), animated: true) + } + return + } + print(data.message) + } +// FollowToggleDataManager.shared.followToggleDataManager(receivedHandle ?? "", { resultData in +// print(resultData.message) +// }) self.receivedIsFollow = false followToggleBtn.setTitle("팔로우", for: .normal) followToggleBtn.backgroundColor = UIColor(named: "yellow00") diff --git a/pochak/pochak/UI/Profile/OtherProfile/ProfileMenu/ProfileMenuViewController.swift b/pochak/pochak/UI/Profile/OtherProfile/ProfileMenu/ProfileMenuViewController.swift index 903ff943..255f50a1 100644 --- a/pochak/pochak/UI/Profile/OtherProfile/ProfileMenu/ProfileMenuViewController.swift +++ b/pochak/pochak/UI/Profile/OtherProfile/ProfileMenu/ProfileMenuViewController.swift @@ -47,7 +47,7 @@ class ProfileMenuViewController: UIViewController { extension ProfileMenuViewController: CustomAlertDelegate { func confirmAction() { - UserService.blockUser(handle: receivedHandle) { [weak self] data, failed in + UserService.blockUser(handle: receivedHandle ?? "") { [weak self] data, failed in guard let data = data else { // 에러가 난 경우, alert 창 present switch failed { @@ -64,9 +64,9 @@ extension ProfileMenuViewController: CustomAlertDelegate { } print(data.message) - self.userBlockBtn.setTitle("차단취소", for: .normal) - self.delegate?.dismissSecondViewController() - self.dismiss(animated: true, completion: nil) + self?.userBlockBtn.setTitle("차단취소", for: .normal) + self?.delegate?.dismissSecondViewController() + self?.dismiss(animated: true, completion: nil) } // BlockDataManager.shared.blockDataManager(receivedHandle ?? "", { resultData in // print(resultData.message) From 487da12217ca07bc89bc4203c14e5d7f4fc4970d Mon Sep 17 00:00:00 2001 From: Jungyeon Seo Date: Tue, 1 Oct 2024 01:25:14 +0900 Subject: [PATCH 08/54] =?UTF-8?q?Chore=20:=20=ED=94=84=EB=A1=9C=ED=95=84?= =?UTF-8?q?=20UI=20=ED=8C=8C=EC=9D=BC=20=EA=B5=AC=EC=A1=B0=20=EB=B3=80?= =?UTF-8?q?=EA=B2=BD?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- pochak/pochak.xcodeproj/project.pbxproj | 192 ++---------------- .../FollowListViewController.swift | 0 .../FollowerListTabmanViewController.swift | 0 .../FollowingListTabmanViewController.swift | 0 .../cell/FollowerCollectionViewCell.swift | 0 .../cell/FollowerCollectionViewCell.xib | 0 .../cell/FollowingCollectionViewCell.swift | 0 .../cell/FollowingCollectionViewCell.xib | 0 .../DeleteFollowerDataManager.swift | 34 ---- .../DeleteFollowerDataModel.swift | 12 -- .../FollowAPI_fin/FollowListDataManager.swift | 67 ------ .../FollowAPI_fin/FollowListDataModel.swift | 26 --- .../FollowToggleDataManager.swift | 34 ---- .../FollowAPI_fin/FollowToggleDataModel.swift | 12 -- .../MyProfilePochakPostModel.swift | 38 ---- .../MyProfilePochakedPostModel.swift | 18 -- .../MyProfilePostDataManager.swift | 78 ------- .../ProfileUpdateDataManager.swift | 54 ----- .../ProfileUpdateDataModel.swift | 20 -- .../BlockedUserListDataManager.swift | 38 ---- .../BlockedUserListDataModel.swift | 33 --- .../LogoutAPI_fin/LogoutDataManager.swift | 35 ---- .../LogoutAPI_fin/LogoutDataModel.swift | 12 -- .../SignoutAPI_fin/SignOutDataManager.swift | 35 ---- .../SignoutAPI_fin/SignOutDataModel.swift | 12 -- .../MyProfileTabViewController.swift | 0 .../BlockAPI_fin/BlockDataManager.swift | 36 ---- .../BlockAPI_fin/BlockDataModel.swift | 14 -- .../BlockAPI_fin/UnblockDataManager.swift | 36 ---- .../BlockAPI_fin/UnblockDataModel.swift | 14 -- .../OtherUserProfileViewController.swift | 0 .../PochakPostTabmanViewController.swift | 0 .../PochakedPostTabmanViewController.swift | 0 .../PostListViewController.swift | 0 .../cell/ProfilePostCollectionViewCell.swift | 0 .../cell/ProfilePostCollectionViewCell.xib | 0 .../ProfileMenuViewController.swift | 0 .../BlockedUserViewController.swift | 0 .../cell/BlockedUserTableViewCell.swift | 0 .../cell/BlockedUserTableViewCell.xib | 0 .../Setting/SettingsViewController.swift | 0 .../UpdateProfileViewController.swift | 0 42 files changed, 14 insertions(+), 836 deletions(-) rename pochak/pochak/UI/Profile/{MyProfile/FollowListTabman => FollowList}/FollowListViewController.swift (100%) rename pochak/pochak/UI/Profile/{MyProfile/FollowListTabman => FollowList}/FollowerListTabmanViewController.swift (100%) rename pochak/pochak/UI/Profile/{MyProfile/FollowListTabman => FollowList}/FollowingListTabmanViewController.swift (100%) rename pochak/pochak/UI/Profile/{MyProfile/FollowListTabman => FollowList}/cell/FollowerCollectionViewCell.swift (100%) rename pochak/pochak/UI/Profile/{MyProfile/FollowListTabman => FollowList}/cell/FollowerCollectionViewCell.xib (100%) rename pochak/pochak/UI/Profile/{MyProfile/FollowListTabman => FollowList}/cell/FollowingCollectionViewCell.swift (100%) rename pochak/pochak/UI/Profile/{MyProfile/FollowListTabman => FollowList}/cell/FollowingCollectionViewCell.xib (100%) delete mode 100644 pochak/pochak/UI/Profile/MyProfile/FollowListTabman/FollowAPI_fin/DeleteFollowerDataManager.swift delete mode 100644 pochak/pochak/UI/Profile/MyProfile/FollowListTabman/FollowAPI_fin/DeleteFollowerDataModel.swift delete mode 100644 pochak/pochak/UI/Profile/MyProfile/FollowListTabman/FollowAPI_fin/FollowListDataManager.swift delete mode 100644 pochak/pochak/UI/Profile/MyProfile/FollowListTabman/FollowAPI_fin/FollowListDataModel.swift delete mode 100644 pochak/pochak/UI/Profile/MyProfile/FollowListTabman/FollowAPI_fin/FollowToggleDataManager.swift delete mode 100644 pochak/pochak/UI/Profile/MyProfile/FollowListTabman/FollowAPI_fin/FollowToggleDataModel.swift delete mode 100644 pochak/pochak/UI/Profile/MyProfile/ProfileAPI_fin/MyProfilePochakPostModel.swift delete mode 100644 pochak/pochak/UI/Profile/MyProfile/ProfileAPI_fin/MyProfilePochakedPostModel.swift delete mode 100644 pochak/pochak/UI/Profile/MyProfile/ProfileAPI_fin/MyProfilePostDataManager.swift delete mode 100644 pochak/pochak/UI/Profile/MyProfile/ProfileUpdateAPI_fin/ProfileUpdateDataManager.swift delete mode 100644 pochak/pochak/UI/Profile/MyProfile/ProfileUpdateAPI_fin/ProfileUpdateDataModel.swift delete mode 100644 pochak/pochak/UI/Profile/MyProfile/Setting/BlockedUserList/BlockListAPI_fin/BlockedUserListDataManager.swift delete mode 100644 pochak/pochak/UI/Profile/MyProfile/Setting/BlockedUserList/BlockListAPI_fin/BlockedUserListDataModel.swift delete mode 100644 pochak/pochak/UI/Profile/MyProfile/Setting/LogoutAPI_fin/LogoutDataManager.swift delete mode 100644 pochak/pochak/UI/Profile/MyProfile/Setting/LogoutAPI_fin/LogoutDataModel.swift delete mode 100644 pochak/pochak/UI/Profile/MyProfile/Setting/SignoutAPI_fin/SignOutDataManager.swift delete mode 100644 pochak/pochak/UI/Profile/MyProfile/Setting/SignoutAPI_fin/SignOutDataModel.swift rename pochak/pochak/UI/Profile/{MyProfile => }/MyProfileTabViewController.swift (100%) delete mode 100644 pochak/pochak/UI/Profile/OtherProfile/ProfileMenu/BlockAPI_fin/BlockDataManager.swift delete mode 100644 pochak/pochak/UI/Profile/OtherProfile/ProfileMenu/BlockAPI_fin/BlockDataModel.swift delete mode 100644 pochak/pochak/UI/Profile/OtherProfile/ProfileMenu/BlockAPI_fin/UnblockDataManager.swift delete mode 100644 pochak/pochak/UI/Profile/OtherProfile/ProfileMenu/BlockAPI_fin/UnblockDataModel.swift rename pochak/pochak/UI/Profile/{OtherProfile => }/OtherUserProfileViewController.swift (100%) rename pochak/pochak/UI/Profile/{MyProfile/PostListTabman => PostList}/PochakPostTabmanViewController.swift (100%) rename pochak/pochak/UI/Profile/{MyProfile/PostListTabman => PostList}/PochakedPostTabmanViewController.swift (100%) rename pochak/pochak/UI/Profile/{MyProfile/PostListTabman => PostList}/PostListViewController.swift (100%) rename pochak/pochak/UI/Profile/{MyProfile/PostListTabman => PostList}/cell/ProfilePostCollectionViewCell.swift (100%) rename pochak/pochak/UI/Profile/{MyProfile/PostListTabman => PostList}/cell/ProfilePostCollectionViewCell.xib (100%) rename pochak/pochak/UI/Profile/{OtherProfile/ProfileMenu => }/ProfileMenuViewController.swift (100%) rename pochak/pochak/UI/Profile/{MyProfile/Setting/BlockedUserList => Setting/BlockList}/BlockedUserViewController.swift (100%) rename pochak/pochak/UI/Profile/{MyProfile/Setting/BlockedUserList => Setting/BlockList}/cell/BlockedUserTableViewCell.swift (100%) rename pochak/pochak/UI/Profile/{MyProfile/Setting/BlockedUserList => Setting/BlockList}/cell/BlockedUserTableViewCell.xib (100%) rename pochak/pochak/UI/Profile/{MyProfile => }/Setting/SettingsViewController.swift (100%) rename pochak/pochak/UI/Profile/{MyProfile => }/UpdateProfileViewController.swift (100%) diff --git a/pochak/pochak.xcodeproj/project.pbxproj b/pochak/pochak.xcodeproj/project.pbxproj index 42261643..15f9e715 100644 --- a/pochak/pochak.xcodeproj/project.pbxproj +++ b/pochak/pochak.xcodeproj/project.pbxproj @@ -102,19 +102,9 @@ 2FCBFE6DE98CEA8938EF93DC /* Pods_pochakTests.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = 6E1916A70A802F298FF38F24 /* Pods_pochakTests.framework */; }; 371D33782B4E83E90084FF6A /* UserDefaultsManager.swift in Sources */ = {isa = PBXBuildFile; fileRef = 371D33772B4E83E90084FF6A /* UserDefaultsManager.swift */; }; 371D337A2B4E8D1F0084FF6A /* KeychainManager.swift in Sources */ = {isa = PBXBuildFile; fileRef = 371D33792B4E8D1F0084FF6A /* KeychainManager.swift */; }; - 373235472B68F93E0042EF94 /* FollowListDataManager.swift in Sources */ = {isa = PBXBuildFile; fileRef = 373235462B68F93E0042EF94 /* FollowListDataManager.swift */; }; - 373235492B68F9A60042EF94 /* FollowListDataModel.swift in Sources */ = {isa = PBXBuildFile; fileRef = 373235482B68F9A60042EF94 /* FollowListDataModel.swift */; }; - 3732354E2B691E610042EF94 /* FollowToggleDataManager.swift in Sources */ = {isa = PBXBuildFile; fileRef = 3732354D2B691E610042EF94 /* FollowToggleDataManager.swift */; }; - 373235502B691E6A0042EF94 /* FollowToggleDataModel.swift in Sources */ = {isa = PBXBuildFile; fileRef = 3732354F2B691E6A0042EF94 /* FollowToggleDataModel.swift */; }; - 373235542B692C6D0042EF94 /* DeleteFollowerDataManager.swift in Sources */ = {isa = PBXBuildFile; fileRef = 373235532B692C6D0042EF94 /* DeleteFollowerDataManager.swift */; }; - 373235562B692C790042EF94 /* DeleteFollowerDataModel.swift in Sources */ = {isa = PBXBuildFile; fileRef = 373235552B692C790042EF94 /* DeleteFollowerDataModel.swift */; }; 373815162A89E6D30032066A /* SocialJoinViewController.swift in Sources */ = {isa = PBXBuildFile; fileRef = 373815152A89E6D30032066A /* SocialJoinViewController.swift */; }; 3738151A2A8A09DA0032066A /* MakeProfileViewController.swift in Sources */ = {isa = PBXBuildFile; fileRef = 373815192A8A09DA0032066A /* MakeProfileViewController.swift */; }; 374261642C2FEF5F00B67886 /* ProfileMenuViewController.swift in Sources */ = {isa = PBXBuildFile; fileRef = 374261632C2FEF5F00B67886 /* ProfileMenuViewController.swift */; }; - 3742616E2C30916C00B67886 /* BlockDataManager.swift in Sources */ = {isa = PBXBuildFile; fileRef = 3742616D2C30916C00B67886 /* BlockDataManager.swift */; }; - 374261702C30917600B67886 /* BlockDataModel.swift in Sources */ = {isa = PBXBuildFile; fileRef = 3742616F2C30917600B67886 /* BlockDataModel.swift */; }; - 374261722C3092B100B67886 /* UnblockDataManager.swift in Sources */ = {isa = PBXBuildFile; fileRef = 374261712C3092B100B67886 /* UnblockDataManager.swift */; }; - 374261742C3092B900B67886 /* UnblockDataModel.swift in Sources */ = {isa = PBXBuildFile; fileRef = 374261732C3092B900B67886 /* UnblockDataModel.swift */; }; 374261782C31C6ED00B67886 /* AppleLoginDataManager.swift in Sources */ = {isa = PBXBuildFile; fileRef = 374261772C31C6ED00B67886 /* AppleLoginDataManager.swift */; }; 3742617A2C31C6F900B67886 /* AppleLoginDataModel.swift in Sources */ = {isa = PBXBuildFile; fileRef = 374261792C31C6F900B67886 /* AppleLoginDataModel.swift */; }; 3742617D2C359D6100B67886 /* CheckHandleDuplicationDataManager.swift in Sources */ = {isa = PBXBuildFile; fileRef = 3742617C2C359D6100B67886 /* CheckHandleDuplicationDataManager.swift */; }; @@ -147,8 +137,6 @@ 3759CF3B2CAAE80700408A4E /* FollowListResponse.swift in Sources */ = {isa = PBXBuildFile; fileRef = 3759CF3A2CAAE80700408A4E /* FollowListResponse.swift */; }; 3766F4022C3706DC001DD239 /* BlockedUserTableViewCell.xib in Resources */ = {isa = PBXBuildFile; fileRef = 3766F4012C3706DC001DD239 /* BlockedUserTableViewCell.xib */; }; 3766F4032C3706DC001DD239 /* BlockedUserTableViewCell.swift in Sources */ = {isa = PBXBuildFile; fileRef = 3766F4002C3706DC001DD239 /* BlockedUserTableViewCell.swift */; }; - 3766F4062C370A7C001DD239 /* BlockedUserListDataManager.swift in Sources */ = {isa = PBXBuildFile; fileRef = 3766F4052C370A7C001DD239 /* BlockedUserListDataManager.swift */; }; - 3766F4082C370A82001DD239 /* BlockedUserListDataModel.swift in Sources */ = {isa = PBXBuildFile; fileRef = 3766F4072C370A82001DD239 /* BlockedUserListDataModel.swift */; }; 3766F40A2C370CF5001DD239 /* BlockedUserViewController.swift in Sources */ = {isa = PBXBuildFile; fileRef = 3766F4092C370CF5001DD239 /* BlockedUserViewController.swift */; }; 3766F40C2C3736F1001DD239 /* RequestInterceptor.swift in Sources */ = {isa = PBXBuildFile; fileRef = 3766F40B2C3736F1001DD239 /* RequestInterceptor.swift */; }; 3766F40F2C398AA8001DD239 /* NetworkResult400.swift in Sources */ = {isa = PBXBuildFile; fileRef = 3766F40E2C398AA8001DD239 /* NetworkResult400.swift */; }; @@ -180,15 +168,6 @@ 379A6A3E2B5FA07D0087FAAC /* NavigationController.swift in Sources */ = {isa = PBXBuildFile; fileRef = 379A6A3D2B5FA07D0087FAAC /* NavigationController.swift */; }; 37A284C12B52FC910023EB9D /* UpdateProfileViewController.swift in Sources */ = {isa = PBXBuildFile; fileRef = 37A284C02B52FC910023EB9D /* UpdateProfileViewController.swift */; }; 37BBFDF12C2EB43D003D8DA5 /* Pretendard-ExtraBold.ttf in Resources */ = {isa = PBXBuildFile; fileRef = 089C75852A51728A003AAB94 /* Pretendard-ExtraBold.ttf */; }; - 37C3AF482B3CB2B300B4C79C /* MyProfilePochakedPostModel.swift in Sources */ = {isa = PBXBuildFile; fileRef = 37C3AF472B3CB2B300B4C79C /* MyProfilePochakedPostModel.swift */; }; - 37C3AF4A2B3CB2C700B4C79C /* MyProfilePochakPostModel.swift in Sources */ = {isa = PBXBuildFile; fileRef = 37C3AF492B3CB2C700B4C79C /* MyProfilePochakPostModel.swift */; }; - 37C3AF4B2B3CB49E00B4C79C /* MyProfilePostDataManager.swift in Sources */ = {isa = PBXBuildFile; fileRef = 37C3AF452B3CB29A00B4C79C /* MyProfilePostDataManager.swift */; }; - 37D311D52B53056700A1D7C1 /* ProfileUpdateDataManager.swift in Sources */ = {isa = PBXBuildFile; fileRef = 37D311D42B53056700A1D7C1 /* ProfileUpdateDataManager.swift */; }; - 37D311D72B53057700A1D7C1 /* ProfileUpdateDataModel.swift in Sources */ = {isa = PBXBuildFile; fileRef = 37D311D62B53057700A1D7C1 /* ProfileUpdateDataModel.swift */; }; - 37D311DA2B53134200A1D7C1 /* LogoutDataManager.swift in Sources */ = {isa = PBXBuildFile; fileRef = 37D311D92B53134200A1D7C1 /* LogoutDataManager.swift */; }; - 37D311DC2B53135000A1D7C1 /* LogoutDataModel.swift in Sources */ = {isa = PBXBuildFile; fileRef = 37D311DB2B53135000A1D7C1 /* LogoutDataModel.swift */; }; - 37D311DF2B566C4D00A1D7C1 /* SignOutDataManager.swift in Sources */ = {isa = PBXBuildFile; fileRef = 37D311DE2B566C4D00A1D7C1 /* SignOutDataManager.swift */; }; - 37D311E12B566C5A00A1D7C1 /* SignOutDataModel.swift in Sources */ = {isa = PBXBuildFile; fileRef = 37D311E02B566C5900A1D7C1 /* SignOutDataModel.swift */; }; 37D311E32B56754D00A1D7C1 /* GetToken.swift in Sources */ = {isa = PBXBuildFile; fileRef = 37D311E22B56754D00A1D7C1 /* GetToken.swift */; }; 37D311E52B567AE000A1D7C1 /* OtherUserProfileViewController.swift in Sources */ = {isa = PBXBuildFile; fileRef = 37D311E42B567AE000A1D7C1 /* OtherUserProfileViewController.swift */; }; A6D48ED7F8B86CF57C481991 /* Pods_pochak_pochakUITests.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = BC75B5747D3AC9026B862E11 /* Pods_pochak_pochakUITests.framework */; }; @@ -367,19 +346,9 @@ 0DB83F3ED818C9AF01F6A8E0 /* Pods-pochak.release.xcconfig */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = text.xcconfig; name = "Pods-pochak.release.xcconfig"; path = "Target Support Files/Pods-pochak/Pods-pochak.release.xcconfig"; sourceTree = ""; }; 371D33772B4E83E90084FF6A /* UserDefaultsManager.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = UserDefaultsManager.swift; sourceTree = ""; }; 371D33792B4E8D1F0084FF6A /* KeychainManager.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = KeychainManager.swift; sourceTree = ""; }; - 373235462B68F93E0042EF94 /* FollowListDataManager.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = FollowListDataManager.swift; sourceTree = ""; }; - 373235482B68F9A60042EF94 /* FollowListDataModel.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = FollowListDataModel.swift; sourceTree = ""; }; - 3732354D2B691E610042EF94 /* FollowToggleDataManager.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = FollowToggleDataManager.swift; sourceTree = ""; }; - 3732354F2B691E6A0042EF94 /* FollowToggleDataModel.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = FollowToggleDataModel.swift; sourceTree = ""; }; - 373235532B692C6D0042EF94 /* DeleteFollowerDataManager.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = DeleteFollowerDataManager.swift; sourceTree = ""; }; - 373235552B692C790042EF94 /* DeleteFollowerDataModel.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = DeleteFollowerDataModel.swift; sourceTree = ""; }; 373815152A89E6D30032066A /* SocialJoinViewController.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = SocialJoinViewController.swift; sourceTree = ""; }; 373815192A8A09DA0032066A /* MakeProfileViewController.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = MakeProfileViewController.swift; sourceTree = ""; }; 374261632C2FEF5F00B67886 /* ProfileMenuViewController.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = ProfileMenuViewController.swift; sourceTree = ""; }; - 3742616D2C30916C00B67886 /* BlockDataManager.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = BlockDataManager.swift; sourceTree = ""; }; - 3742616F2C30917600B67886 /* BlockDataModel.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = BlockDataModel.swift; sourceTree = ""; }; - 374261712C3092B100B67886 /* UnblockDataManager.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = UnblockDataManager.swift; sourceTree = ""; }; - 374261732C3092B900B67886 /* UnblockDataModel.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = UnblockDataModel.swift; sourceTree = ""; }; 374261752C31C23800B67886 /* pochakDebug.entitlements */ = {isa = PBXFileReference; lastKnownFileType = text.plist.entitlements; path = pochakDebug.entitlements; sourceTree = ""; }; 374261772C31C6ED00B67886 /* AppleLoginDataManager.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = AppleLoginDataManager.swift; sourceTree = ""; }; 374261792C31C6F900B67886 /* AppleLoginDataModel.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = AppleLoginDataModel.swift; sourceTree = ""; }; @@ -414,8 +383,6 @@ 3759CF3A2CAAE80700408A4E /* FollowListResponse.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = FollowListResponse.swift; sourceTree = ""; }; 3766F4002C3706DC001DD239 /* BlockedUserTableViewCell.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = BlockedUserTableViewCell.swift; sourceTree = ""; }; 3766F4012C3706DC001DD239 /* BlockedUserTableViewCell.xib */ = {isa = PBXFileReference; lastKnownFileType = file.xib; path = BlockedUserTableViewCell.xib; sourceTree = ""; }; - 3766F4052C370A7C001DD239 /* BlockedUserListDataManager.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = BlockedUserListDataManager.swift; sourceTree = ""; }; - 3766F4072C370A82001DD239 /* BlockedUserListDataModel.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = BlockedUserListDataModel.swift; sourceTree = ""; }; 3766F4092C370CF5001DD239 /* BlockedUserViewController.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = BlockedUserViewController.swift; sourceTree = ""; }; 3766F40B2C3736F1001DD239 /* RequestInterceptor.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = RequestInterceptor.swift; sourceTree = ""; }; 3766F40E2C398AA8001DD239 /* NetworkResult400.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = NetworkResult400.swift; sourceTree = ""; }; @@ -446,15 +413,6 @@ 379A6A392B56BDBF0087FAAC /* Authenticator.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = Authenticator.swift; sourceTree = ""; }; 379A6A3D2B5FA07D0087FAAC /* NavigationController.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = NavigationController.swift; sourceTree = ""; }; 37A284C02B52FC910023EB9D /* UpdateProfileViewController.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = UpdateProfileViewController.swift; sourceTree = ""; }; - 37C3AF452B3CB29A00B4C79C /* MyProfilePostDataManager.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = MyProfilePostDataManager.swift; sourceTree = ""; }; - 37C3AF472B3CB2B300B4C79C /* MyProfilePochakedPostModel.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = MyProfilePochakedPostModel.swift; sourceTree = ""; }; - 37C3AF492B3CB2C700B4C79C /* MyProfilePochakPostModel.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = MyProfilePochakPostModel.swift; sourceTree = ""; }; - 37D311D42B53056700A1D7C1 /* ProfileUpdateDataManager.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = ProfileUpdateDataManager.swift; sourceTree = ""; }; - 37D311D62B53057700A1D7C1 /* ProfileUpdateDataModel.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = ProfileUpdateDataModel.swift; sourceTree = ""; }; - 37D311D92B53134200A1D7C1 /* LogoutDataManager.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = LogoutDataManager.swift; sourceTree = ""; }; - 37D311DB2B53135000A1D7C1 /* LogoutDataModel.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = LogoutDataModel.swift; sourceTree = ""; }; - 37D311DE2B566C4D00A1D7C1 /* SignOutDataManager.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = SignOutDataManager.swift; sourceTree = ""; }; - 37D311E02B566C5900A1D7C1 /* SignOutDataModel.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = SignOutDataModel.swift; sourceTree = ""; }; 37D311E22B56754D00A1D7C1 /* GetToken.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = GetToken.swift; sourceTree = ""; }; 37D311E42B567AE000A1D7C1 /* OtherUserProfileViewController.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = OtherUserProfileViewController.swift; sourceTree = ""; }; 67EA6B5B881844A22EE2A55B /* Pods-pochak.debug.xcconfig */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = text.xcconfig; name = "Pods-pochak.debug.xcconfig"; path = "Target Support Files/Pods-pochak/Pods-pochak.debug.xcconfig"; sourceTree = ""; }; @@ -910,19 +868,6 @@ path = LikesDataManager; sourceTree = ""; }; - 373235452B68F9180042EF94 /* FollowAPI_fin */ = { - isa = PBXGroup; - children = ( - 373235462B68F93E0042EF94 /* FollowListDataManager.swift */, - 373235482B68F9A60042EF94 /* FollowListDataModel.swift */, - 3732354D2B691E610042EF94 /* FollowToggleDataManager.swift */, - 3732354F2B691E6A0042EF94 /* FollowToggleDataModel.swift */, - 373235532B692C6D0042EF94 /* DeleteFollowerDataManager.swift */, - 373235552B692C790042EF94 /* DeleteFollowerDataModel.swift */, - ); - path = FollowAPI_fin; - sourceTree = ""; - }; 373815142A89E6BE0032066A /* Login */ = { isa = PBXGroup; children = ( @@ -941,33 +886,11 @@ isa = PBXGroup; children = ( 3747E9712BF3827500364BED /* SettingsViewController.swift */, - 3766F4042C370A5D001DD239 /* BlockedUserList */, - 37D311D82B53131D00A1D7C1 /* LogoutAPI_fin */, - 37D311DD2B566C3D00A1D7C1 /* SignoutAPI_fin */, + 3766F4042C370A5D001DD239 /* BlockList */, ); path = Setting; sourceTree = ""; }; - 3742616B2C30911A00B67886 /* ProfileMenu */ = { - isa = PBXGroup; - children = ( - 374261632C2FEF5F00B67886 /* ProfileMenuViewController.swift */, - 3742616C2C30914100B67886 /* BlockAPI_fin */, - ); - path = ProfileMenu; - sourceTree = ""; - }; - 3742616C2C30914100B67886 /* BlockAPI_fin */ = { - isa = PBXGroup; - children = ( - 3742616D2C30916C00B67886 /* BlockDataManager.swift */, - 3742616F2C30917600B67886 /* BlockDataModel.swift */, - 374261712C3092B100B67886 /* UnblockDataManager.swift */, - 374261732C3092B900B67886 /* UnblockDataModel.swift */, - ); - path = BlockAPI_fin; - sourceTree = ""; - }; 374261762C31C6CD00B67886 /* AppleLogin */ = { isa = PBXGroup; children = ( @@ -1013,23 +936,13 @@ path = cell; sourceTree = ""; }; - 3766F4042C370A5D001DD239 /* BlockedUserList */ = { + 3766F4042C370A5D001DD239 /* BlockList */ = { isa = PBXGroup; children = ( 3766F4092C370CF5001DD239 /* BlockedUserViewController.swift */, - 3766F40D2C373CFF001DD239 /* BlockListAPI_fin */, 3766F3FF2C3706C7001DD239 /* cell */, ); - path = BlockedUserList; - sourceTree = ""; - }; - 3766F40D2C373CFF001DD239 /* BlockListAPI_fin */ = { - isa = PBXGroup; - children = ( - 3766F4072C370A82001DD239 /* BlockedUserListDataModel.swift */, - 3766F4052C370A7C001DD239 /* BlockedUserListDataManager.swift */, - ); - path = BlockListAPI_fin; + path = BlockList; sourceTree = ""; }; 3769D6AC2B3C2F9900294CD1 /* SignUp */ = { @@ -1056,8 +969,13 @@ isa = PBXGroup; children = ( EAFB4B862A5147A300E0F2FA /* ProfileTab.storyboard */, - 37D311E72B567B3F00A1D7C1 /* OtherProfile */, - 3769D6C92B3C50D200294CD1 /* MyProfile */, + 37D311E42B567AE000A1D7C1 /* OtherUserProfileViewController.swift */, + 374261632C2FEF5F00B67886 /* ProfileMenuViewController.swift */, + 3769D6B82B3C345800294CD1 /* MyProfileTabViewController.swift */, + 37A284C02B52FC910023EB9D /* UpdateProfileViewController.swift */, + 3742616A2C3075B400B67886 /* Setting */, + 3769D6CC2B3C560200294CD1 /* PostList */, + 3769D6CB2B3C55E500294CD1 /* FollowList */, ); path = Profile; sourceTree = ""; @@ -1073,33 +991,18 @@ path = cell; sourceTree = ""; }; - 3769D6C92B3C50D200294CD1 /* MyProfile */ = { - isa = PBXGroup; - children = ( - 3769D6B82B3C345800294CD1 /* MyProfileTabViewController.swift */, - 37A284C02B52FC910023EB9D /* UpdateProfileViewController.swift */, - 3742616A2C3075B400B67886 /* Setting */, - 37D311D32B53053C00A1D7C1 /* ProfileUpdateAPI_fin */, - 37C3AF442B3CB26000B4C79C /* ProfileAPI_fin */, - 3769D6CC2B3C560200294CD1 /* PostListTabman */, - 3769D6CB2B3C55E500294CD1 /* FollowListTabman */, - ); - path = MyProfile; - sourceTree = ""; - }; - 3769D6CB2B3C55E500294CD1 /* FollowListTabman */ = { + 3769D6CB2B3C55E500294CD1 /* FollowList */ = { isa = PBXGroup; children = ( 3769D6C02B3C39EA00294CD1 /* cell */, - 373235452B68F9180042EF94 /* FollowAPI_fin */, 3769D6BA2B3C347000294CD1 /* FollowListViewController.swift */, 3769D6BC2B3C348800294CD1 /* FollowerListTabmanViewController.swift */, 3769D6BE2B3C349D00294CD1 /* FollowingListTabmanViewController.swift */, ); - path = FollowListTabman; + path = FollowList; sourceTree = ""; }; - 3769D6CC2B3C560200294CD1 /* PostListTabman */ = { + 3769D6CC2B3C560200294CD1 /* PostList */ = { isa = PBXGroup; children = ( 37F1487A2C62382300D9B117 /* cell */, @@ -1107,7 +1010,7 @@ 3769D6CF2B3C569C00294CD1 /* PochakedPostTabmanViewController.swift */, 3769D6D12B3C56F100294CD1 /* PochakPostTabmanViewController.swift */, ); - path = PostListTabman; + path = PostList; sourceTree = ""; }; 376EA1272CAAAD3500FEFB63 /* Profile */ = { @@ -1132,52 +1035,6 @@ path = Profile; sourceTree = ""; }; - 37C3AF442B3CB26000B4C79C /* ProfileAPI_fin */ = { - isa = PBXGroup; - children = ( - 37C3AF472B3CB2B300B4C79C /* MyProfilePochakedPostModel.swift */, - 37C3AF492B3CB2C700B4C79C /* MyProfilePochakPostModel.swift */, - 37C3AF452B3CB29A00B4C79C /* MyProfilePostDataManager.swift */, - ); - path = ProfileAPI_fin; - sourceTree = ""; - }; - 37D311D32B53053C00A1D7C1 /* ProfileUpdateAPI_fin */ = { - isa = PBXGroup; - children = ( - 37D311D62B53057700A1D7C1 /* ProfileUpdateDataModel.swift */, - 37D311D42B53056700A1D7C1 /* ProfileUpdateDataManager.swift */, - ); - path = ProfileUpdateAPI_fin; - sourceTree = ""; - }; - 37D311D82B53131D00A1D7C1 /* LogoutAPI_fin */ = { - isa = PBXGroup; - children = ( - 37D311D92B53134200A1D7C1 /* LogoutDataManager.swift */, - 37D311DB2B53135000A1D7C1 /* LogoutDataModel.swift */, - ); - path = LogoutAPI_fin; - sourceTree = ""; - }; - 37D311DD2B566C3D00A1D7C1 /* SignoutAPI_fin */ = { - isa = PBXGroup; - children = ( - 37D311DE2B566C4D00A1D7C1 /* SignOutDataManager.swift */, - 37D311E02B566C5900A1D7C1 /* SignOutDataModel.swift */, - ); - path = SignoutAPI_fin; - sourceTree = ""; - }; - 37D311E72B567B3F00A1D7C1 /* OtherProfile */ = { - isa = PBXGroup; - children = ( - 37D311E42B567AE000A1D7C1 /* OtherUserProfileViewController.swift */, - 3742616B2C30911A00B67886 /* ProfileMenu */, - ); - path = OtherProfile; - sourceTree = ""; - }; 37F1487A2C62382300D9B117 /* cell */ = { isa = PBXGroup; children = ( @@ -1778,7 +1635,6 @@ 3769D6AF2B3C2FD500294CD1 /* GoogleLoginDataManager.swift in Sources */, EA0107AE2A5EC23900A3AE85 /* OtherTableViewCell.swift in Sources */, EA2CD6482C5F5B0700644EFE /* HomeRequest.swift in Sources */, - 37C3AF4B2B3CB49E00B4C79C /* MyProfilePostDataManager.swift in Sources */, EA7E14672C858F0F001DA769 /* CameraAPI.swift in Sources */, 3759CF392CAAE7E900408A4E /* FollowListRequest.swift in Sources */, 0822A02D2CA196DF00F87E2C /* PostCollectionViewCell.swift in Sources */, @@ -1796,11 +1652,9 @@ EACF0F6E2C3044C000C0016C /* TagSearchTableViewCell.swift in Sources */, 08B679632B528D7500F8D585 /* CommentTableViewFooterView.swift in Sources */, EA2CD6442C5F5A0E00644EFE /* HomeAPI.swift in Sources */, - 373235502B691E6A0042EF94 /* FollowToggleDataModel.swift in Sources */, 0802AE032C31D3E00090FB92 /* UIImageView+.swift in Sources */, 3769D6C72B3C4F0900294CD1 /* FollowingCollectionViewCell.swift in Sources */, 08E8DCDC2C38118000EC78C2 /* UILabel+.swift in Sources */, - 373235472B68F93E0042EF94 /* FollowListDataManager.swift in Sources */, 374E462D2CAAC399008AE361 /* AuthenticationService.swift in Sources */, 08EB5D252C280CFE00E35C16 /* UIImage+.swift in Sources */, 374E463B2CAAC762008AE361 /* BlockAPI.swift in Sources */, @@ -1816,7 +1670,6 @@ 0822A0312CA196DF00F87E2C /* RecentSearchRealmManager.swift in Sources */, 08D98C472AFEE8B300E9A097 /* (null) in Sources */, 3769D6C32B3C3A1600294CD1 /* FollowerCollectionViewCell.swift in Sources */, - 374261722C3092B100B67886 /* UnblockDataManager.swift in Sources */, EA0F23692C32DA780014F94E /* UIViewController+.swift in Sources */, 379A6A3A2B56BDBF0087FAAC /* Authenticator.swift in Sources */, EA17182C2A5912A7009168E6 /* UploadViewController.swift in Sources */, @@ -1832,7 +1685,6 @@ 3769D6BF2B3C349D00294CD1 /* FollowingListTabmanViewController.swift in Sources */, 08C02EEA2BF3798F00627C21 /* ReportViewController.swift in Sources */, 0822A0722CA1983C00F87E2C /* PostDeleteResponse.swift in Sources */, - 373235562B692C790042EF94 /* DeleteFollowerDataModel.swift in Sources */, 3766F40C2C3736F1001DD239 /* RequestInterceptor.swift in Sources */, EA0F23662C319C030014F94E /* PreviewAlarmViewController.swift in Sources */, 0822A0422CA197E700F87E2C /* PostReportAPI.swift in Sources */, @@ -1840,9 +1692,7 @@ 0844D7EF2BF219F6001154AC /* DeleteViewCell.swift in Sources */, 374E463D2CAAC82E008AE361 /* BlockResponse.swift in Sources */, 3759CF3B2CAAE80700408A4E /* FollowListResponse.swift in Sources */, - 374261742C3092B900B67886 /* UnblockDataModel.swift in Sources */, EA2CD63B2C5F463700644EFE /* NetworkService.swift in Sources */, - 373235542B692C6D0042EF94 /* DeleteFollowerDataManager.swift in Sources */, 3742617D2C359D6100B67886 /* CheckHandleDuplicationDataManager.swift in Sources */, 371D33782B4E83E90084FF6A /* UserDefaultsManager.swift in Sources */, 3742617A2C31C6F900B67886 /* AppleLoginDataModel.swift in Sources */, @@ -1857,7 +1707,6 @@ 0822A0702CA1983C00F87E2C /* PostReportResponse.swift in Sources */, 3766F4132C3A69E5001DD239 /* TermsOfAgreeViewController.swift in Sources */, 0822A0472CA197E700F87E2C /* PostLikeAPI.swift in Sources */, - 37D311DC2B53135000A1D7C1 /* LogoutDataModel.swift in Sources */, 374E46432CAAC9B5008AE361 /* UnblockResponse.swift in Sources */, 37A284C12B52FC910023EB9D /* UpdateProfileViewController.swift in Sources */, 3738151A2A8A09DA0032066A /* MakeProfileViewController.swift in Sources */, @@ -1867,20 +1716,16 @@ 080FEF012C551C3200951460 /* ReportType.swift in Sources */, 0822A0782CA1986000F87E2C /* UserService.swift in Sources */, EA7E14712C8EA26D001DA769 /* AlarmListRequest.swift in Sources */, - 37D311DF2B566C4D00A1D7C1 /* SignOutDataManager.swift in Sources */, EA817AB62B3C984000E741E4 /* LeftAlignedCollectionViewFlowLayout.swift in Sources */, - 3742616E2C30916C00B67886 /* BlockDataManager.swift in Sources */, 379A6A3E2B5FA07D0087FAAC /* NavigationController.swift in Sources */, 0822A0462CA197E700F87E2C /* CommentPostAPI.swift in Sources */, 374E46372CAAC602008AE361 /* LogOutAPI.swift in Sources */, - 3766F4062C370A7C001DD239 /* BlockedUserListDataManager.swift in Sources */, 3769D6D52B3C59F900294CD1 /* ProfilePostCollectionViewCell.swift in Sources */, 376EA12E2CAAAE6800FEFB63 /* ProfileRetrievalRequest.swift in Sources */, EA96D0562C8F192B00D80562 /* TagApproveResponse.swift in Sources */, 3769D6B62B3C302C00294CD1 /* JoinDataModel.swift in Sources */, 374E461F2CAABAF3008AE361 /* PochakPostRetrievalAPI.swift in Sources */, 084AF4C72A5D831100C6454A /* HomeCollectionViewCell.swift in Sources */, - 37C3AF4A2B3CB2C700B4C79C /* MyProfilePochakPostModel.swift in Sources */, 08C02EF82BF394B800627C21 /* UIAlertController+.swift in Sources */, 089E27B92C4E8CB800828F4C /* AlertType.swift in Sources */, EAE69F442C315009005762B7 /* UIVIew+.swift in Sources */, @@ -1898,30 +1743,23 @@ 081228C62A69624000DFA094 /* PostLikesViewController.swift in Sources */, EA01079B2A59556800A3AE85 /* HomeTabViewController.swift in Sources */, 3759CF352CAAE79000408A4E /* FollowerRetrievalAPI.swift in Sources */, - 373235492B68F9A60042EF94 /* FollowListDataModel.swift in Sources */, 0822A0332CA196DF00F87E2C /* RecentSearchViewController.swift in Sources */, 0822A06E2CA1983C00F87E2C /* CommentPostResponse.swift in Sources */, EA7E14612C858EC6001DA769 /* CameraService.swift in Sources */, EA6306D82C2BFE53000DB0A7 /* CustomTabBarController.swift in Sources */, 0822A06A2CA1983C00F87E2C /* PostLikeResponse.swift in Sources */, 0820B1902A63A18100604DA8 /* ReplyTableViewCell.swift in Sources */, - 374261702C30917600B67886 /* BlockDataModel.swift in Sources */, 374E46392CAAC646008AE361 /* LogOutResponse.swift in Sources */, 083249782C295E4000A77C03 /* CustomAlertViewController.swift in Sources */, 374E46252CAABE08008AE361 /* ProfileUpdateResponse.swift in Sources */, - 37C3AF482B3CB2B300B4C79C /* MyProfilePochakedPostModel.swift in Sources */, 0822A04F2CA1980200F87E2C /* FollowAPI.swift in Sources */, EA2CD6392C5F45E300644EFE /* BaseAPI.swift in Sources */, - 37D311E12B566C5A00A1D7C1 /* SignOutDataModel.swift in Sources */, 374E46302CAAC3F6008AE361 /* SignOutResponse.swift in Sources */, 376F125B2A8B7440005F469B /* SocialLoginViewController.swift in Sources */, - 37D311D72B53057700A1D7C1 /* ProfileUpdateDataModel.swift in Sources */, EA4EF8D82C2EC5F7009549FF /* UITextField+.swift in Sources */, EAF918512AA468670037C270 /* APIConstants.swift in Sources */, 0822A0322CA196DF00F87E2C /* RecentSearchModel.swift in Sources */, - 3766F4082C370A82001DD239 /* BlockedUserListDataModel.swift in Sources */, 0822A06D2CA1983C00F87E2C /* CommentPostRequest.swift in Sources */, - 3732354E2B691E610042EF94 /* FollowToggleDataManager.swift in Sources */, 0822A0692CA1983C00F87E2C /* PostReportRequest.swift in Sources */, 3769D6BD2B3C348800294CD1 /* FollowerListTabmanViewController.swift in Sources */, 0822A0672CA1983C00F87E2C /* SearchResponse.swift in Sources */, @@ -1931,7 +1769,6 @@ 0889D1382C5CB69F00206C86 /* String+.swift in Sources */, 0844D7F32BF21A80001154AC /* CancelViewCell.swift in Sources */, 3766F4032C3706DC001DD239 /* BlockedUserTableViewCell.swift in Sources */, - 37D311D52B53056700A1D7C1 /* ProfileUpdateDataManager.swift in Sources */, 374E46452CAACD33008AE361 /* BlockListAPI.swift in Sources */, 3769D6B92B3C345800294CD1 /* MyProfileTabViewController.swift in Sources */, 0822A0682CA1983C00F87E2C /* FollowResponse.swift in Sources */, @@ -1952,7 +1789,6 @@ 376EA1292CAAADCF00FEFB63 /* ProfileRetrievalAPI.swift in Sources */, EA96D0522C8F186900D80562 /* TagApproveAPI.swift in Sources */, 0822A07B2CA1992B00F87E2C /* PostService.swift in Sources */, - 37D311DA2B53134200A1D7C1 /* LogoutDataManager.swift in Sources */, EA1B0B5D2A49D23A00F86FBC /* SceneDelegate.swift in Sources */, 3747E9722BF3827500364BED /* SettingsViewController.swift in Sources */, 3769D6D22B3C56F100294CD1 /* PochakPostTabmanViewController.swift in Sources */, diff --git a/pochak/pochak/UI/Profile/MyProfile/FollowListTabman/FollowListViewController.swift b/pochak/pochak/UI/Profile/FollowList/FollowListViewController.swift similarity index 100% rename from pochak/pochak/UI/Profile/MyProfile/FollowListTabman/FollowListViewController.swift rename to pochak/pochak/UI/Profile/FollowList/FollowListViewController.swift diff --git a/pochak/pochak/UI/Profile/MyProfile/FollowListTabman/FollowerListTabmanViewController.swift b/pochak/pochak/UI/Profile/FollowList/FollowerListTabmanViewController.swift similarity index 100% rename from pochak/pochak/UI/Profile/MyProfile/FollowListTabman/FollowerListTabmanViewController.swift rename to pochak/pochak/UI/Profile/FollowList/FollowerListTabmanViewController.swift diff --git a/pochak/pochak/UI/Profile/MyProfile/FollowListTabman/FollowingListTabmanViewController.swift b/pochak/pochak/UI/Profile/FollowList/FollowingListTabmanViewController.swift similarity index 100% rename from pochak/pochak/UI/Profile/MyProfile/FollowListTabman/FollowingListTabmanViewController.swift rename to pochak/pochak/UI/Profile/FollowList/FollowingListTabmanViewController.swift diff --git a/pochak/pochak/UI/Profile/MyProfile/FollowListTabman/cell/FollowerCollectionViewCell.swift b/pochak/pochak/UI/Profile/FollowList/cell/FollowerCollectionViewCell.swift similarity index 100% rename from pochak/pochak/UI/Profile/MyProfile/FollowListTabman/cell/FollowerCollectionViewCell.swift rename to pochak/pochak/UI/Profile/FollowList/cell/FollowerCollectionViewCell.swift diff --git a/pochak/pochak/UI/Profile/MyProfile/FollowListTabman/cell/FollowerCollectionViewCell.xib b/pochak/pochak/UI/Profile/FollowList/cell/FollowerCollectionViewCell.xib similarity index 100% rename from pochak/pochak/UI/Profile/MyProfile/FollowListTabman/cell/FollowerCollectionViewCell.xib rename to pochak/pochak/UI/Profile/FollowList/cell/FollowerCollectionViewCell.xib diff --git a/pochak/pochak/UI/Profile/MyProfile/FollowListTabman/cell/FollowingCollectionViewCell.swift b/pochak/pochak/UI/Profile/FollowList/cell/FollowingCollectionViewCell.swift similarity index 100% rename from pochak/pochak/UI/Profile/MyProfile/FollowListTabman/cell/FollowingCollectionViewCell.swift rename to pochak/pochak/UI/Profile/FollowList/cell/FollowingCollectionViewCell.swift diff --git a/pochak/pochak/UI/Profile/MyProfile/FollowListTabman/cell/FollowingCollectionViewCell.xib b/pochak/pochak/UI/Profile/FollowList/cell/FollowingCollectionViewCell.xib similarity index 100% rename from pochak/pochak/UI/Profile/MyProfile/FollowListTabman/cell/FollowingCollectionViewCell.xib rename to pochak/pochak/UI/Profile/FollowList/cell/FollowingCollectionViewCell.xib diff --git a/pochak/pochak/UI/Profile/MyProfile/FollowListTabman/FollowAPI_fin/DeleteFollowerDataManager.swift b/pochak/pochak/UI/Profile/MyProfile/FollowListTabman/FollowAPI_fin/DeleteFollowerDataManager.swift deleted file mode 100644 index 9b5c6cd0..00000000 --- a/pochak/pochak/UI/Profile/MyProfile/FollowListTabman/FollowAPI_fin/DeleteFollowerDataManager.swift +++ /dev/null @@ -1,34 +0,0 @@ -//// -//// DeleteFollowerDataManager.swift -//// pochak -//// -//// Created by Seo Cindy on 1/30/24. -//// -// -//import Foundation -//import Alamofire -// -//class DeleteFollowerDataManager { -// -// static let shared = DeleteFollowerDataManager() -// -// func deleteFollowerDataManager(_ handle : String, _ selectedHandle : String, _ completion: @escaping (DeleteFollowerDataResponse) -> Void) { -// -// let url = "\(APIConstants.baseURL)/api/v2/members/\(handle)/follower?followerHandle=\(selectedHandle)" -// -// AF.request(url, -// method: .delete, -// encoding: URLEncoding.default, -// interceptor: RequestInterceptor.getRequestInterceptor()) -// .validate() -// .responseDecodable(of: DeleteFollowerDataResponse.self) { response in -// switch response.result { -// case .success(let result): -// completion(result) -// case .failure(let error): -// print("Request Fail : deleteFollowerDataManager") -// print(error) -// } -// } -// } -//} diff --git a/pochak/pochak/UI/Profile/MyProfile/FollowListTabman/FollowAPI_fin/DeleteFollowerDataModel.swift b/pochak/pochak/UI/Profile/MyProfile/FollowListTabman/FollowAPI_fin/DeleteFollowerDataModel.swift deleted file mode 100644 index e24c01ac..00000000 --- a/pochak/pochak/UI/Profile/MyProfile/FollowListTabman/FollowAPI_fin/DeleteFollowerDataModel.swift +++ /dev/null @@ -1,12 +0,0 @@ -//// -//// DeleteFollowerDataModel.swift -//// pochak -//// -//// Created by Seo Cindy on 1/30/24. -//// -// -//struct DeleteFollowerDataResponse: Codable { -// let isSuccess: Bool -// let code: String -// let message: String -//} diff --git a/pochak/pochak/UI/Profile/MyProfile/FollowListTabman/FollowAPI_fin/FollowListDataManager.swift b/pochak/pochak/UI/Profile/MyProfile/FollowListTabman/FollowAPI_fin/FollowListDataManager.swift deleted file mode 100644 index ec433b1e..00000000 --- a/pochak/pochak/UI/Profile/MyProfile/FollowListTabman/FollowAPI_fin/FollowListDataManager.swift +++ /dev/null @@ -1,67 +0,0 @@ -//// -//// FollowDataManager.swift -//// pochak -//// -//// Created by Seo Cindy on 1/30/24. -//// -// -//import Foundation -//import Alamofire -// -//class FollowListDataManager { -// -// static let shared = FollowListDataManager() -// -// func followerDataManager(_ handle : String, _ page : Int, _ completion: @escaping (FollowListDataModel) -> Void) { -// -// let url = "\(APIConstants.baseURL)/api/v2/members/\(handle)/follower?page=\(page)" -// -// AF.request(url, -// method: .get, -// encoding: URLEncoding.default, -// interceptor: RequestInterceptor.getRequestInterceptor()) -// .validate() -// .responseDecodable(of: FollowListDataResponse.self) { response in -// switch response.result { -// case .success(let result): -// if let data = response.data, let errorMessage = String(data: data, encoding: .utf8) { -// print("Success Data for followerDataManager: \(errorMessage)") -// } -// let resultData = result.result -// print(resultData) -// completion(resultData) -// case .failure(let error): -// if let data = response.data, let errorMessage = String(data: data, encoding: .utf8) { -// print("Failure Data for followerDataManager: \(errorMessage)") -// } -// print("Request Fail : followerDataManager") -// print(error) -// } -// } -// } -// -// func followingDataManager(_ handle : String, _ page : Int, _ completion: @escaping (FollowListDataModel) -> Void) { -// -// let url = "\(APIConstants.baseURLv2)/api/v2/members/\(handle)/following?page=\(page)" -// -// AF.request(url, -// method: .get, -// encoding: URLEncoding.default, -// interceptor: RequestInterceptor.getRequestInterceptor()) -// .validate() -// .responseDecodable(of: FollowListDataResponse.self) { response in -// print(response) -// switch response.result { -// case .success(let result): -// let resultData = result.result -// completion(resultData) -// case .failure(let error): -// if let data = response.data, let errorMessage = String(data: data, encoding: .utf8) { -// print("Failure Data for followingDataManager: \(errorMessage)") -// } -// print("Request Fail : followingDataManager") -// print(error) -// } -// } -// } -//} diff --git a/pochak/pochak/UI/Profile/MyProfile/FollowListTabman/FollowAPI_fin/FollowListDataModel.swift b/pochak/pochak/UI/Profile/MyProfile/FollowListTabman/FollowAPI_fin/FollowListDataModel.swift deleted file mode 100644 index 176c7b9c..00000000 --- a/pochak/pochak/UI/Profile/MyProfile/FollowListTabman/FollowAPI_fin/FollowListDataModel.swift +++ /dev/null @@ -1,26 +0,0 @@ -// -// FollowDataModel.swift -// pochak -// -// Created by Seo Cindy on 1/30/24. -// - -//struct FollowListDataResponse: Codable { -// let isSuccess: Bool -// let code: String -// let message: String -// let result: FollowListDataModel -//} -// -//struct FollowListDataModel: Codable { -// var pageInfo: PageDataModel -// var memberList: [MemberListDataModel] -//} -// -//struct MemberListDataModel: Codable { -// var memberId: Int -// var profileImage: String -// var handle: String -// var name: String -// var isFollow: Bool? -//} diff --git a/pochak/pochak/UI/Profile/MyProfile/FollowListTabman/FollowAPI_fin/FollowToggleDataManager.swift b/pochak/pochak/UI/Profile/MyProfile/FollowListTabman/FollowAPI_fin/FollowToggleDataManager.swift deleted file mode 100644 index 4fe0ff70..00000000 --- a/pochak/pochak/UI/Profile/MyProfile/FollowListTabman/FollowAPI_fin/FollowToggleDataManager.swift +++ /dev/null @@ -1,34 +0,0 @@ -//// -//// FollowToggleDataManager.swift -//// pochak -//// -//// Created by Seo Cindy on 1/30/24. -//// -// -//import Foundation -//import Alamofire -// -//class FollowToggleDataManager { -// -// static let shared = FollowToggleDataManager() -// -// func followToggleDataManager(_ handle : String, _ completion: @escaping (FollowToggleDataResponse) -> Void) { -// -// let url = "\(APIConstants.baseURL)/api/v2/members/\(handle)/follow" -// -// AF.request(url, -// method: .post, -// encoding: URLEncoding.default, -// interceptor: RequestInterceptor.getRequestInterceptor()) -// .validate() -// .responseDecodable(of: FollowToggleDataResponse.self) { response in -// switch response.result { -// case .success(let result): -// completion(result) -// case .failure(let error): -// print("Request Fail : followToggleDataManager") -// print(error) -// } -// } -// } -//} diff --git a/pochak/pochak/UI/Profile/MyProfile/FollowListTabman/FollowAPI_fin/FollowToggleDataModel.swift b/pochak/pochak/UI/Profile/MyProfile/FollowListTabman/FollowAPI_fin/FollowToggleDataModel.swift deleted file mode 100644 index f54c9577..00000000 --- a/pochak/pochak/UI/Profile/MyProfile/FollowListTabman/FollowAPI_fin/FollowToggleDataModel.swift +++ /dev/null @@ -1,12 +0,0 @@ -//// -//// FollowToggleDataModel.swift -//// pochak -//// -//// Created by Seo Cindy on 1/30/24. -//// -// -//struct FollowToggleDataResponse: Codable { -// let isSuccess: Bool -// let code: String -// let message: String -//} diff --git a/pochak/pochak/UI/Profile/MyProfile/ProfileAPI_fin/MyProfilePochakPostModel.swift b/pochak/pochak/UI/Profile/MyProfile/ProfileAPI_fin/MyProfilePochakPostModel.swift deleted file mode 100644 index a4cddeeb..00000000 --- a/pochak/pochak/UI/Profile/MyProfile/ProfileAPI_fin/MyProfilePochakPostModel.swift +++ /dev/null @@ -1,38 +0,0 @@ -//// -//// MyProfilePochakPostModel.swift -//// pochak -//// -//// Created by Seo Cindy on 12/28/23. -//// -// -//struct MyProfileUserAndPochakedPostResponse: Codable { -// let isSuccess: Bool -// let code: String -// let message: String -// let result: MyProfileUserAndPochakedPostModel -//} -// -//struct MyProfileUserAndPochakedPostModel : Codable { -// var handle: String? -// var profileImage: String? -// var name: String? -// var message: String? -// var totalPostNum: Int? -// var followerCount: Int? -// var followingCount: Int? -// var isFollow: Bool? -// var pageInfo : PageDataModel -// var postList : [PostDataModel] -//} -// -//struct PageDataModel : Codable { -// var lastPage : Bool -// var totalPages : Int -// var totalElements : Int -// var size : Int -//} -// -//struct PostDataModel : Codable { -// var postId : Int -// var postImage : String -//} diff --git a/pochak/pochak/UI/Profile/MyProfile/ProfileAPI_fin/MyProfilePochakedPostModel.swift b/pochak/pochak/UI/Profile/MyProfile/ProfileAPI_fin/MyProfilePochakedPostModel.swift deleted file mode 100644 index ffcb6743..00000000 --- a/pochak/pochak/UI/Profile/MyProfile/ProfileAPI_fin/MyProfilePochakedPostModel.swift +++ /dev/null @@ -1,18 +0,0 @@ -//// -//// MyProfilePochakedPostModel.swift -//// pochak -//// -//// Created by Seo Cindy on 12/28/23. -//// -// -//struct MyProfilePochakPostResponse: Codable { -// let isSuccess: Bool -// let code: String -// let message: String -// let result: MyProfilePochakPostModel -//} -// -//struct MyProfilePochakPostModel : Codable { -// var pageInfo : PageDataModel -// var postList : [PostDataModel] -//} diff --git a/pochak/pochak/UI/Profile/MyProfile/ProfileAPI_fin/MyProfilePostDataManager.swift b/pochak/pochak/UI/Profile/MyProfile/ProfileAPI_fin/MyProfilePostDataManager.swift deleted file mode 100644 index 1bb9a537..00000000 --- a/pochak/pochak/UI/Profile/MyProfile/ProfileAPI_fin/MyProfilePostDataManager.swift +++ /dev/null @@ -1,78 +0,0 @@ -//// -//// MyProfilePostDataManager.swift -//// pochak -//// -//// Created by Seo Cindy on 12/28/23. -//// -// -//import Alamofire -// -//struct SimpleJson: Codable { -// var isSuccess: Bool -// var code: String -// var message: String -//} -// -//class MyProfilePostDataManager { -// -// static let shared = MyProfilePostDataManager() -// -// func myProfileUserAndPochakedPostDataManager(_ handle : String, _ page : Int, _ completion: @escaping (NetworkResult400) -> Void) { -// -// let url = "\(APIConstants.baseURL)/api/v2/members/\(handle)?page=\(page)" -// -// AF.request(url, -// method: .get, -// encoding: URLEncoding.default, -// interceptor: RequestInterceptor.getRequestInterceptor()) -// .validate() -// .responseDecodable(of: MyProfileUserAndPochakedPostResponse.self) { response in -// print(response) -// switch response.result { -// case .success(let result): -// let resultData = result.result -// completion(.success(resultData)) -// case .failure(let error): -// print("myProfileUserAndPochakedPostDataManager error : \(error.localizedDescription)") -// if let data = response.data, let errorMessage = String(data: data, encoding: .utf8) { -// print("Failure Data: \(errorMessage)") -// } -// if let statusCode = response.response?.statusCode { -// if statusCode == 400 { -// completion(.MEMBER4002) -// } -// } -// } -// } -// } -// -// func myProfilePochakPostDataManager(_ handle : String, _ page : Int, _ completion: @escaping (MyProfilePochakPostModel) -> Void) { -// -// let url = "\(APIConstants.baseURLv2)/api/v2/members/\(handle)/upload?page=\(page)" -// -// AF.request(url, -// method: .get, -// encoding: URLEncoding.default, -// interceptor: RequestInterceptor.getRequestInterceptor()) -// .validate() -// .responseDecodable(of: MyProfilePochakPostResponse.self) { response in -// print(response) -// switch response.result { -// case .success(let result): -// let resultData = result.result -// completion(resultData) -// case .failure(let error): -// print("myProfilePochakPostDataManager error : \(error.localizedDescription)") -// guard let data = response.data else { return } -// // data -// let decoder = JSONDecoder() -// if let json = try? decoder.decode(SimpleJson.self, from: data) { -// print(">>>>> decoder : \(json.code)") // hyeon -// } -// if let errorMessage = String(data: data, encoding: .utf8) { -// print("Failure Data: \(errorMessage)") -// } -// } -// } -// } -//} diff --git a/pochak/pochak/UI/Profile/MyProfile/ProfileUpdateAPI_fin/ProfileUpdateDataManager.swift b/pochak/pochak/UI/Profile/MyProfile/ProfileUpdateAPI_fin/ProfileUpdateDataManager.swift deleted file mode 100644 index 1705b3ad..00000000 --- a/pochak/pochak/UI/Profile/MyProfile/ProfileUpdateAPI_fin/ProfileUpdateDataManager.swift +++ /dev/null @@ -1,54 +0,0 @@ -//// -//// MyProfileUpdateDataManager.swift -//// pochak -//// -//// Created by Seo Cindy on 1/14/24. -//// -// -//import Alamofire -// -//class ProfileUpdateDataManager{ -// static let shared = ProfileUpdateDataManager() -// -// func updateDataManager(_ name : String, -// _ handle : String, -// _ message : String, -// _ profileImage : UIImage?, -// _ completion: @escaping (ProfileUpdateDataModel) -> Void) { -// -// let accessToken = GetToken.getAccessToken() -// -// let header : HTTPHeaders = ["Authorization": accessToken, "Content-type": "multipart/form-data"] -// let url = "\(APIConstants.baseURL)/api/v2/members/\(handle)" -// let requestBody : [String : String] = [ -// "name" : name, -// "message" : message] -// -// AF.upload(multipartFormData: { multipartFormData in -// // requestBody 추가 -// for (key, value) in requestBody { -// if let valueData = value.data(using: .utf8) { -// multipartFormData.append(valueData, withName: key) -// } -// } -// -// // profileImage 추가 -// if let image = profileImage?.jpegData(compressionQuality: 0.1) { -// multipartFormData.append(image, withName: "profileImage", fileName: "profileImage.jpg", mimeType: "image/jpeg") -// } -// }, to: url, method: .put, headers: header).validate().responseDecodable(of: ProfileUpdateResponse.self) { response in -// switch response.result { -// case .success(let result): -// let resultData = result.result -// print("update 성공!!!!!!!!!!") -// print(resultData) -// completion(resultData) -// case .failure(let error): -// print("updateDataManager error : \(error.localizedDescription)") -// if let data = response.data, let errorMessage = String(data: data, encoding: .utf8) { -// print("Failure Data: \(errorMessage)") -// } -// } -// } -// } -//} diff --git a/pochak/pochak/UI/Profile/MyProfile/ProfileUpdateAPI_fin/ProfileUpdateDataModel.swift b/pochak/pochak/UI/Profile/MyProfile/ProfileUpdateAPI_fin/ProfileUpdateDataModel.swift deleted file mode 100644 index 696a3a6f..00000000 --- a/pochak/pochak/UI/Profile/MyProfile/ProfileUpdateAPI_fin/ProfileUpdateDataModel.swift +++ /dev/null @@ -1,20 +0,0 @@ -// -// MyProfileUpdateDataModel.swift -// pochak -// -// Created by Seo Cindy on 1/14/24. -// - -//struct ProfileUpdateResponse: Codable { -// let isSuccess: Bool -// let code: String -// let message: String -// let result: ProfileUpdateDataModel -//} -// -//struct ProfileUpdateDataModel : Codable { -// var name : String? -// var handle : String? -// var message : String? -// var profileImage : String? -//} diff --git a/pochak/pochak/UI/Profile/MyProfile/Setting/BlockedUserList/BlockListAPI_fin/BlockedUserListDataManager.swift b/pochak/pochak/UI/Profile/MyProfile/Setting/BlockedUserList/BlockListAPI_fin/BlockedUserListDataManager.swift deleted file mode 100644 index 9b080d2f..00000000 --- a/pochak/pochak/UI/Profile/MyProfile/Setting/BlockedUserList/BlockListAPI_fin/BlockedUserListDataManager.swift +++ /dev/null @@ -1,38 +0,0 @@ -//// -//// BlockedUserListDataManager.swift -//// pochak -//// -//// Created by Seo Cindy on 7/5/24. -//// -// -//import Foundation -//import Alamofire -// -//class BlockedUserListDataManager{ -// -// static let shared = BlockedUserListDataManager() -// -// func blockedUserListDataManager(_ handle : String,_ page : Int, _ completion: @escaping (BlockedUserDataModel) -> Void) { -// -// let url = "\(APIConstants.baseURL)/api/v2/members/\(handle)/block?page=\(page)" -// -// AF.request(url, -// method: .get, -// encoding: URLEncoding.default, -// interceptor: RequestInterceptor.getRequestInterceptor()) -// .validate() -// .responseDecodable(of: BlockedUserDataResponse.self) { response in -// switch response.result { -// case .success(let result): -// let resultData = result.result -// print(">>>>> resultData : \(resultData)") -// completion(resultData) -// case .failure(let error): -// print("Request Fail : blockedUserListDataManager") -// if let data = response.data, let errorMessage = String(data: data, encoding: .utf8) { -// print("Failure Data: \(errorMessage)") -// } -// } -// } -// } -//} diff --git a/pochak/pochak/UI/Profile/MyProfile/Setting/BlockedUserList/BlockListAPI_fin/BlockedUserListDataModel.swift b/pochak/pochak/UI/Profile/MyProfile/Setting/BlockedUserList/BlockListAPI_fin/BlockedUserListDataModel.swift deleted file mode 100644 index 798f390b..00000000 --- a/pochak/pochak/UI/Profile/MyProfile/Setting/BlockedUserList/BlockListAPI_fin/BlockedUserListDataModel.swift +++ /dev/null @@ -1,33 +0,0 @@ -//// -//// BlockedUserListDataModel.swift -//// pochak -//// -//// Created by Seo Cindy on 7/5/24. -//// -// -//import Foundation -// -//struct BlockedUserDataResponse : Codable { -// var isSuccess: Bool -// var code: String -// var message: String -// var result : BlockedUserDataModel -//} -// -//struct BlockedUserDataModel : Codable { -// var pageInfo: BlockedUserPageDataModel -// var blockList: [BlockedUserListDataModel] -//} -// -//struct BlockedUserPageDataModel : Codable { -// var lastPage : Bool -// var totalPages: Int -// var totalElements: Int -// var size: Int -//} -// -//struct BlockedUserListDataModel : Codable { -// var profileImage: String -// var handle: String -// var name: String -//} diff --git a/pochak/pochak/UI/Profile/MyProfile/Setting/LogoutAPI_fin/LogoutDataManager.swift b/pochak/pochak/UI/Profile/MyProfile/Setting/LogoutAPI_fin/LogoutDataManager.swift deleted file mode 100644 index e53dab3f..00000000 --- a/pochak/pochak/UI/Profile/MyProfile/Setting/LogoutAPI_fin/LogoutDataManager.swift +++ /dev/null @@ -1,35 +0,0 @@ -//// -//// LogoutDataManager.swift -//// pochak -//// -//// Created by Seo Cindy on 1/14/24. -//// -//import Alamofire -// -//class LogoutDataManager{ -// -// static let shared = LogoutDataManager() -// -// func logoutDataManager(_ completion: @escaping (LogoutDataModel) -> Void) { -// let url = "\(APIConstants.baseURL)/api/v2/logout" -// -// AF.request(url, -// method: .get, -// encoding: URLEncoding.default, -// interceptor: RequestInterceptor.getRequestInterceptor()) -// .validate() -// .responseDecodable(of: LogoutDataModel.self) { response in -// switch response.result { -// case .success(let result): -// print("logout success!") -// let resultData = result -// completion(resultData) -// case .failure(let error): -// print("Request Fail : logoutDataManager") -// if let data = response.data, let errorMessage = String(data: data, encoding: .utf8) { -// print("Failure Data: \(errorMessage)") -// } -// } -// } -// } -//} diff --git a/pochak/pochak/UI/Profile/MyProfile/Setting/LogoutAPI_fin/LogoutDataModel.swift b/pochak/pochak/UI/Profile/MyProfile/Setting/LogoutAPI_fin/LogoutDataModel.swift deleted file mode 100644 index 5584efbe..00000000 --- a/pochak/pochak/UI/Profile/MyProfile/Setting/LogoutAPI_fin/LogoutDataModel.swift +++ /dev/null @@ -1,12 +0,0 @@ -//// -//// LogoutDataModel.swift -//// pochak -//// -//// Created by Seo Cindy on 1/14/24. -//// -// -//struct LogoutDataModel : Codable { -// var isSuccess: Bool -// var code: String -// var message: String -//} diff --git a/pochak/pochak/UI/Profile/MyProfile/Setting/SignoutAPI_fin/SignOutDataManager.swift b/pochak/pochak/UI/Profile/MyProfile/Setting/SignoutAPI_fin/SignOutDataManager.swift deleted file mode 100644 index 3c9fdca0..00000000 --- a/pochak/pochak/UI/Profile/MyProfile/Setting/SignoutAPI_fin/SignOutDataManager.swift +++ /dev/null @@ -1,35 +0,0 @@ -//// -//// DeleteAccountDataManager.swift -//// pochak -//// -//// Created by Seo Cindy on 1/16/24. -//// -// -//import Alamofire -// -//class SignOutDataManager{ -// -// static let shared = SignOutDataManager() -// -// func signOutDataManager(_ completion: @escaping (SignOutDataModel) -> Void) { -// -// let url = "\(APIConstants.baseURL)/api/v2/signout" -// -// AF.request(url, -// method: .delete, -// encoding: URLEncoding.default, -// interceptor: RequestInterceptor.getRequestInterceptor()) -// .validate() -// .responseDecodable(of: SignOutDataModel.self) { response in -// switch response.result { -// case .success(let result): -// print("signout success!!!!!!!!!") -// let resultData = result -// completion(resultData) -// case .failure(let error): -// print("Request Fail : deleteAccountDataManager") -// print(error) -// } -// } -// } -//} diff --git a/pochak/pochak/UI/Profile/MyProfile/Setting/SignoutAPI_fin/SignOutDataModel.swift b/pochak/pochak/UI/Profile/MyProfile/Setting/SignoutAPI_fin/SignOutDataModel.swift deleted file mode 100644 index b0921c6d..00000000 --- a/pochak/pochak/UI/Profile/MyProfile/Setting/SignoutAPI_fin/SignOutDataModel.swift +++ /dev/null @@ -1,12 +0,0 @@ -//// -//// DeleteAccountDataModel.swift -//// pochak -//// -//// Created by Seo Cindy on 1/16/24. -//// -// -//struct SignOutDataModel : Codable { -// var isSuccess: Bool -// var code: String -// var message: String -//} diff --git a/pochak/pochak/UI/Profile/MyProfile/MyProfileTabViewController.swift b/pochak/pochak/UI/Profile/MyProfileTabViewController.swift similarity index 100% rename from pochak/pochak/UI/Profile/MyProfile/MyProfileTabViewController.swift rename to pochak/pochak/UI/Profile/MyProfileTabViewController.swift diff --git a/pochak/pochak/UI/Profile/OtherProfile/ProfileMenu/BlockAPI_fin/BlockDataManager.swift b/pochak/pochak/UI/Profile/OtherProfile/ProfileMenu/BlockAPI_fin/BlockDataManager.swift deleted file mode 100644 index b8ab6ac3..00000000 --- a/pochak/pochak/UI/Profile/OtherProfile/ProfileMenu/BlockAPI_fin/BlockDataManager.swift +++ /dev/null @@ -1,36 +0,0 @@ -// -// BlockDataManager.swift -// pochak -// -// Created by Seo Cindy on 6/30/24. -// - -import Foundation -import Alamofire - -class BlockDataManager { - - static let shared = BlockDataManager() - - func blockDataManager(_ handle : String, _ completion: @escaping (BlockDataResponse) -> Void) { - - let url = "\(APIConstants.baseURL)/api/v2/members/\(handle)/block" - - AF.request(url, - method: .post, - encoding: URLEncoding.default, - interceptor: RequestInterceptor.getRequestInterceptor()) - .validate() - .responseDecodable(of: BlockDataResponse.self) { response in - switch response.result { - case .success(let result): - completion(result) - case .failure(let error): - print("Request Fail blockDataManager : \(error.localizedDescription)") - if let data = response.data, let errorMessage = String(data: data, encoding: .utf8) { - print("Failure Data: \(errorMessage)") - } - } - } - } -} diff --git a/pochak/pochak/UI/Profile/OtherProfile/ProfileMenu/BlockAPI_fin/BlockDataModel.swift b/pochak/pochak/UI/Profile/OtherProfile/ProfileMenu/BlockAPI_fin/BlockDataModel.swift deleted file mode 100644 index 59287069..00000000 --- a/pochak/pochak/UI/Profile/OtherProfile/ProfileMenu/BlockAPI_fin/BlockDataModel.swift +++ /dev/null @@ -1,14 +0,0 @@ -// -// BlockDataModel.swift -// pochak -// -// Created by Seo Cindy on 6/30/24. -// - -import Foundation - -struct BlockDataResponse: Codable { - let isSuccess: Bool - let code: String - let message: String -} diff --git a/pochak/pochak/UI/Profile/OtherProfile/ProfileMenu/BlockAPI_fin/UnblockDataManager.swift b/pochak/pochak/UI/Profile/OtherProfile/ProfileMenu/BlockAPI_fin/UnblockDataManager.swift deleted file mode 100644 index a8ed09f1..00000000 --- a/pochak/pochak/UI/Profile/OtherProfile/ProfileMenu/BlockAPI_fin/UnblockDataManager.swift +++ /dev/null @@ -1,36 +0,0 @@ -// -// BlockDataManager.swift -// pochak -// -// Created by Seo Cindy on 6/30/24. -// - -import Foundation -import Alamofire - -class UnBlockDataManager { - - static let shared = UnBlockDataManager() - - func unBlockDataManager(_ handle : String, _ blockedMemberHandle : String, _ completion: @escaping (UnBlockDataResponse) -> Void) { - - let url = "\(APIConstants.baseURL)/api/v2/members/\(handle)/block?blockedMemberHandle=\(blockedMemberHandle)" - - AF.request(url, - method: .delete, - encoding: URLEncoding.default, - interceptor: RequestInterceptor.getRequestInterceptor()) - .validate() - .responseDecodable(of: UnBlockDataResponse.self) { response in - switch response.result { - case .success(let result): - completion(result) - case .failure(let error): - print("Request Fail unBlockDataManager : \(error.localizedDescription)") - if let data = response.data, let errorMessage = String(data: data, encoding: .utf8) { - print("Failure Data: \(errorMessage)") - } - } - } - } -} diff --git a/pochak/pochak/UI/Profile/OtherProfile/ProfileMenu/BlockAPI_fin/UnblockDataModel.swift b/pochak/pochak/UI/Profile/OtherProfile/ProfileMenu/BlockAPI_fin/UnblockDataModel.swift deleted file mode 100644 index bdaa5028..00000000 --- a/pochak/pochak/UI/Profile/OtherProfile/ProfileMenu/BlockAPI_fin/UnblockDataModel.swift +++ /dev/null @@ -1,14 +0,0 @@ -// -// UnblockDataModel.swift -// pochak -// -// Created by Seo Cindy on 6/30/24. -// - -import Foundation - -struct UnBlockDataResponse: Codable { - let isSuccess: Bool - let code: String - let message: String -} diff --git a/pochak/pochak/UI/Profile/OtherProfile/OtherUserProfileViewController.swift b/pochak/pochak/UI/Profile/OtherUserProfileViewController.swift similarity index 100% rename from pochak/pochak/UI/Profile/OtherProfile/OtherUserProfileViewController.swift rename to pochak/pochak/UI/Profile/OtherUserProfileViewController.swift diff --git a/pochak/pochak/UI/Profile/MyProfile/PostListTabman/PochakPostTabmanViewController.swift b/pochak/pochak/UI/Profile/PostList/PochakPostTabmanViewController.swift similarity index 100% rename from pochak/pochak/UI/Profile/MyProfile/PostListTabman/PochakPostTabmanViewController.swift rename to pochak/pochak/UI/Profile/PostList/PochakPostTabmanViewController.swift diff --git a/pochak/pochak/UI/Profile/MyProfile/PostListTabman/PochakedPostTabmanViewController.swift b/pochak/pochak/UI/Profile/PostList/PochakedPostTabmanViewController.swift similarity index 100% rename from pochak/pochak/UI/Profile/MyProfile/PostListTabman/PochakedPostTabmanViewController.swift rename to pochak/pochak/UI/Profile/PostList/PochakedPostTabmanViewController.swift diff --git a/pochak/pochak/UI/Profile/MyProfile/PostListTabman/PostListViewController.swift b/pochak/pochak/UI/Profile/PostList/PostListViewController.swift similarity index 100% rename from pochak/pochak/UI/Profile/MyProfile/PostListTabman/PostListViewController.swift rename to pochak/pochak/UI/Profile/PostList/PostListViewController.swift diff --git a/pochak/pochak/UI/Profile/MyProfile/PostListTabman/cell/ProfilePostCollectionViewCell.swift b/pochak/pochak/UI/Profile/PostList/cell/ProfilePostCollectionViewCell.swift similarity index 100% rename from pochak/pochak/UI/Profile/MyProfile/PostListTabman/cell/ProfilePostCollectionViewCell.swift rename to pochak/pochak/UI/Profile/PostList/cell/ProfilePostCollectionViewCell.swift diff --git a/pochak/pochak/UI/Profile/MyProfile/PostListTabman/cell/ProfilePostCollectionViewCell.xib b/pochak/pochak/UI/Profile/PostList/cell/ProfilePostCollectionViewCell.xib similarity index 100% rename from pochak/pochak/UI/Profile/MyProfile/PostListTabman/cell/ProfilePostCollectionViewCell.xib rename to pochak/pochak/UI/Profile/PostList/cell/ProfilePostCollectionViewCell.xib diff --git a/pochak/pochak/UI/Profile/OtherProfile/ProfileMenu/ProfileMenuViewController.swift b/pochak/pochak/UI/Profile/ProfileMenuViewController.swift similarity index 100% rename from pochak/pochak/UI/Profile/OtherProfile/ProfileMenu/ProfileMenuViewController.swift rename to pochak/pochak/UI/Profile/ProfileMenuViewController.swift diff --git a/pochak/pochak/UI/Profile/MyProfile/Setting/BlockedUserList/BlockedUserViewController.swift b/pochak/pochak/UI/Profile/Setting/BlockList/BlockedUserViewController.swift similarity index 100% rename from pochak/pochak/UI/Profile/MyProfile/Setting/BlockedUserList/BlockedUserViewController.swift rename to pochak/pochak/UI/Profile/Setting/BlockList/BlockedUserViewController.swift diff --git a/pochak/pochak/UI/Profile/MyProfile/Setting/BlockedUserList/cell/BlockedUserTableViewCell.swift b/pochak/pochak/UI/Profile/Setting/BlockList/cell/BlockedUserTableViewCell.swift similarity index 100% rename from pochak/pochak/UI/Profile/MyProfile/Setting/BlockedUserList/cell/BlockedUserTableViewCell.swift rename to pochak/pochak/UI/Profile/Setting/BlockList/cell/BlockedUserTableViewCell.swift diff --git a/pochak/pochak/UI/Profile/MyProfile/Setting/BlockedUserList/cell/BlockedUserTableViewCell.xib b/pochak/pochak/UI/Profile/Setting/BlockList/cell/BlockedUserTableViewCell.xib similarity index 100% rename from pochak/pochak/UI/Profile/MyProfile/Setting/BlockedUserList/cell/BlockedUserTableViewCell.xib rename to pochak/pochak/UI/Profile/Setting/BlockList/cell/BlockedUserTableViewCell.xib diff --git a/pochak/pochak/UI/Profile/MyProfile/Setting/SettingsViewController.swift b/pochak/pochak/UI/Profile/Setting/SettingsViewController.swift similarity index 100% rename from pochak/pochak/UI/Profile/MyProfile/Setting/SettingsViewController.swift rename to pochak/pochak/UI/Profile/Setting/SettingsViewController.swift diff --git a/pochak/pochak/UI/Profile/MyProfile/UpdateProfileViewController.swift b/pochak/pochak/UI/Profile/UpdateProfileViewController.swift similarity index 100% rename from pochak/pochak/UI/Profile/MyProfile/UpdateProfileViewController.swift rename to pochak/pochak/UI/Profile/UpdateProfileViewController.swift From fa11e3cced00c5216b0215d5416f61fc99271e65 Mon Sep 17 00:00:00 2001 From: Jungyeon Seo Date: Tue, 1 Oct 2024 01:51:03 +0900 Subject: [PATCH 09/54] =?UTF-8?q?Chore=20:=20=ED=94=84=EB=A1=9C=ED=95=84?= =?UTF-8?q?=20UI=20=ED=8F=B4=EB=8D=94=20=EA=B5=AC=EC=A1=B0=20=EB=B3=80?= =?UTF-8?q?=EA=B2=BD?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../BlockList/cell/BlockedUserTableViewCell.xib | 0 .../{Setting => }/SettingsViewController.swift | 12 ------------ 2 files changed, 12 deletions(-) rename pochak/pochak/UI/Profile/{Setting => }/BlockList/cell/BlockedUserTableViewCell.xib (100%) rename pochak/pochak/UI/Profile/{Setting => }/SettingsViewController.swift (94%) diff --git a/pochak/pochak/UI/Profile/Setting/BlockList/cell/BlockedUserTableViewCell.xib b/pochak/pochak/UI/Profile/BlockList/cell/BlockedUserTableViewCell.xib similarity index 100% rename from pochak/pochak/UI/Profile/Setting/BlockList/cell/BlockedUserTableViewCell.xib rename to pochak/pochak/UI/Profile/BlockList/cell/BlockedUserTableViewCell.xib diff --git a/pochak/pochak/UI/Profile/Setting/SettingsViewController.swift b/pochak/pochak/UI/Profile/SettingsViewController.swift similarity index 94% rename from pochak/pochak/UI/Profile/Setting/SettingsViewController.swift rename to pochak/pochak/UI/Profile/SettingsViewController.swift index 2bbc9200..a2328497 100644 --- a/pochak/pochak/UI/Profile/Setting/SettingsViewController.swift +++ b/pochak/pochak/UI/Profile/SettingsViewController.swift @@ -159,12 +159,6 @@ extension SettingsViewController: CustomAlertDelegate { let message = data.message print(message) } -// LogoutDataManager.shared.logoutDataManager( -// { resultData in -// let message = resultData.message -// print(message) -// }) -// deleteUserData() moveToMainPage() @@ -177,12 +171,6 @@ extension SettingsViewController: CustomAlertDelegate { let message = data.message print(message) } -// SignOutDataManager.shared.signOutDataManager( -// { resultData in -// let message = resultData.message -// print(message) -// }) - deleteUserData() moveToMainPage() } From 13926084f9a951b55535ce7c169b975413a505d6 Mon Sep 17 00:00:00 2001 From: Jungyeon Seo Date: Tue, 1 Oct 2024 01:51:32 +0900 Subject: [PATCH 10/54] =?UTF-8?q?Style=20:=20convention=20=EB=94=B0?= =?UTF-8?q?=EB=9D=BC=20=EC=BD=94=EB=93=9C=20=ED=8F=AC=EB=A7=B7=ED=8C=85?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- pochak/pochak.xcodeproj/project.pbxproj | 18 ++-- .../BlockList/BlockedUserViewController.swift | 42 ++------- .../cell/BlockedUserTableViewCell.swift | 11 --- .../FollowerListTabmanViewController.swift | 30 +------ .../FollowingListTabmanViewController.swift | 26 +----- .../Profile/MyProfileTabViewController.swift | 32 +------ .../OtherUserProfileViewController.swift | 88 +++++++++---------- .../PochakPostTabmanViewController.swift | 24 +---- .../PochakedPostTabmanViewController.swift | 36 +------- .../cell/ProfilePostCollectionViewCell.swift | 15 +--- .../Profile/ProfileMenuViewController.swift | 8 -- .../Profile/UpdateProfileViewController.swift | 20 +---- 12 files changed, 67 insertions(+), 283 deletions(-) rename pochak/pochak/UI/Profile/{Setting => }/BlockList/BlockedUserViewController.swift (77%) rename pochak/pochak/UI/Profile/{Setting => }/BlockList/cell/BlockedUserTableViewCell.swift (80%) diff --git a/pochak/pochak.xcodeproj/project.pbxproj b/pochak/pochak.xcodeproj/project.pbxproj index 15f9e715..57f4ebaa 100644 --- a/pochak/pochak.xcodeproj/project.pbxproj +++ b/pochak/pochak.xcodeproj/project.pbxproj @@ -882,15 +882,6 @@ path = Login; sourceTree = ""; }; - 3742616A2C3075B400B67886 /* Setting */ = { - isa = PBXGroup; - children = ( - 3747E9712BF3827500364BED /* SettingsViewController.swift */, - 3766F4042C370A5D001DD239 /* BlockList */, - ); - path = Setting; - sourceTree = ""; - }; 374261762C31C6CD00B67886 /* AppleLogin */ = { isa = PBXGroup; children = ( @@ -939,8 +930,8 @@ 3766F4042C370A5D001DD239 /* BlockList */ = { isa = PBXGroup; children = ( - 3766F4092C370CF5001DD239 /* BlockedUserViewController.swift */, 3766F3FF2C3706C7001DD239 /* cell */, + 3766F4092C370CF5001DD239 /* BlockedUserViewController.swift */, ); path = BlockList; sourceTree = ""; @@ -969,11 +960,12 @@ isa = PBXGroup; children = ( EAFB4B862A5147A300E0F2FA /* ProfileTab.storyboard */, - 37D311E42B567AE000A1D7C1 /* OtherUserProfileViewController.swift */, - 374261632C2FEF5F00B67886 /* ProfileMenuViewController.swift */, 3769D6B82B3C345800294CD1 /* MyProfileTabViewController.swift */, + 37D311E42B567AE000A1D7C1 /* OtherUserProfileViewController.swift */, 37A284C02B52FC910023EB9D /* UpdateProfileViewController.swift */, - 3742616A2C3075B400B67886 /* Setting */, + 374261632C2FEF5F00B67886 /* ProfileMenuViewController.swift */, + 3747E9712BF3827500364BED /* SettingsViewController.swift */, + 3766F4042C370A5D001DD239 /* BlockList */, 3769D6CC2B3C560200294CD1 /* PostList */, 3769D6CB2B3C55E500294CD1 /* FollowList */, ); diff --git a/pochak/pochak/UI/Profile/Setting/BlockList/BlockedUserViewController.swift b/pochak/pochak/UI/Profile/BlockList/BlockedUserViewController.swift similarity index 77% rename from pochak/pochak/UI/Profile/Setting/BlockList/BlockedUserViewController.swift rename to pochak/pochak/UI/Profile/BlockList/BlockedUserViewController.swift index 0b13524e..ccd21ff2 100644 --- a/pochak/pochak/UI/Profile/Setting/BlockList/BlockedUserViewController.swift +++ b/pochak/pochak/UI/Profile/BlockList/BlockedUserViewController.swift @@ -73,9 +73,9 @@ class BlockedUserViewController: UIViewController { isCurrentlyFetching = true let handle = UserDefaultsManager.getData(type: String.self, forKey: .handle) ?? "handle not found" let request = BlockListRequest(page: currentFetchingPage) + UserService.getBlockUserList(handle: handle, request: request) { data, failed in guard let data = data else { - // 에러가 난 경우, alert 창 present switch failed { case .disconnected: self.present(UIAlertController.networkErrorAlert(title: failed!.localizedDescription), animated: true) @@ -105,26 +105,7 @@ class BlockedUserViewController: UIViewController { self.isCurrentlyFetching = false self.currentFetchingPage += 1; } - } -// BlockedUserListDataManager.shared.blockedUserListDataManager(handle, currentFetchingPage, { resultData in -// let newBlockedUsers = resultData.blockList -// let startIndex = resultData.blockList.count -// let endIndex = startIndex + newBlockedUsers.count -// let newIndexPaths = (startIndex..>>>>>> Follower is currently reloading!!!!!!!") - // } else { - // self.followerCollectionView.insertItems(at: newIndexPaths) - // print(">>>>>>> Follower is currently fethcing!!!!!!!") - // } - // self.isCurrentlyFetching = false - // self.currentFetchingPage += 1; - // } - // }) - // } } } diff --git a/pochak/pochak/UI/Profile/FollowList/FollowingListTabmanViewController.swift b/pochak/pochak/UI/Profile/FollowList/FollowingListTabmanViewController.swift index 92ee5ecd..6c6d55a9 100644 --- a/pochak/pochak/UI/Profile/FollowList/FollowingListTabmanViewController.swift +++ b/pochak/pochak/UI/Profile/FollowList/FollowingListTabmanViewController.swift @@ -63,9 +63,9 @@ class FollowingListTabmanViewController: UIViewController { private func setUpData() { let request = FollowListRequest(page: currentFetchingPage) + UserService.getFollowings(handle: receivedHandle ?? "", request: request) { [weak self] data, failed in guard let data = data else { - // 에러가 난 경우, alert 창 present switch failed { case .disconnected: self?.present(UIAlertController.networkErrorAlert(title: failed!.localizedDescription), animated: true) @@ -102,30 +102,6 @@ class FollowingListTabmanViewController: UIViewController { self?.currentFetchingPage += 1; } } - // FollowListDataManager.shared.followingDataManager(receivedHandle ?? "", currentFetchingPage, { resultData in - // let newMembers = resultData.memberList - // let startIndex = resultData.memberList.count - // print("startIndex : \(startIndex)") - // let endIndex = startIndex + newMembers.count - // print("endIndex : \(endIndex)") - // let newIndexPaths = (startIndex..>>>>>> Follower is currently reloading!!!!!!!") - // } else { - // self.followingCollectionView.insertItems(at: newIndexPaths) - // print(">>>>>>> Follower is currently fethcing!!!!!!!") - // } - // self.isCurrentlyFetching = false - // self.currentFetchingPage += 1; - // } - // }) } } diff --git a/pochak/pochak/UI/Profile/MyProfileTabViewController.swift b/pochak/pochak/UI/Profile/MyProfileTabViewController.swift index 3a5277bb..36db036d 100644 --- a/pochak/pochak/UI/Profile/MyProfileTabViewController.swift +++ b/pochak/pochak/UI/Profile/MyProfileTabViewController.swift @@ -129,8 +129,9 @@ class MyProfileTabViewController: UIViewController { let request = ProfileRetrievalRequest(page: 0) ProfileService.getProfile(handle: handle, request: request) { data, failed in guard let data = data else { - // 에러가 난 경우, alert 창 present switch failed { + case .clientError: + self.present(UIAlertController.networkErrorAlert(title: "유효하지 않은 멤버의 handle입니다."), animated: true) case .disconnected: self.present(UIAlertController.networkErrorAlert(title: failed!.localizedDescription), animated: true) case .serverError: @@ -150,40 +151,13 @@ class MyProfileTabViewController: UIViewController { if let url = URL(string: data.result.profileImage ?? "") { self.profileImage.load(with: url) } + // 필요한 데이터 뷰에 반영 self.setUpResponseData(data.result) // UserDefaultsManager에 새로운 데이터 저장 후 관리 : followerCount, followingCount self.setUpUserDefaults(data.result) - } -// MyProfilePostDataManager.shared.myProfileUserAndPochakedPostDataManager(handle, 0,{ response in -// switch response { -// case .success(let resultData): -// let imageURL = resultData.profileImage ?? "" -// UserDefaultsManager.setData(value: imageURL, key: .profileImgUrl) -// if let url = URL(string: imageURL) { -// self.profileImage.kf.setImage(with: url) { result in -// switch result { -// case .success(let value): -// print("Image successfully loaded: \(value.image)") -// case .failure(let error): -// print("Image failed to load with error: \(error.localizedDescription)") -// } -// } -// } -// -// // 필요한 데이터 뷰에 반영 -// self.setUpResponseData(resultData) -// -// // UserDefaultsManager에 새로운 데이터 저장 후 관리 : followerCount, followingCount -// self.setUpUserDefaults(resultData) -// -// case .MEMBER4002: -// print("유효하지 않은 멤버의 handle입니다.") -// self.present(UIAlertController.networkErrorAlert(title: "유효하지 않은 멤버의 handle입니다."), animated: true) -// } -// }) } private func setUpResponseData(_ resposeData: ProfileRetrievalResult) { diff --git a/pochak/pochak/UI/Profile/OtherUserProfileViewController.swift b/pochak/pochak/UI/Profile/OtherUserProfileViewController.swift index 7ed129db..9186740a 100644 --- a/pochak/pochak/UI/Profile/OtherUserProfileViewController.swift +++ b/pochak/pochak/UI/Profile/OtherUserProfileViewController.swift @@ -96,9 +96,6 @@ class OtherUserProfileViewController: UIViewController { } print(data.message) } - // FollowToggleDataManager.shared.followToggleDataManager(self.receivedHandle ?? "", { resultData in - // print(resultData.message) - // }) self.receivedIsFollow = true sender.setTitle("팔로잉", for: .normal) sender.backgroundColor = UIColor(named: "gray03") @@ -189,8 +186,17 @@ class OtherUserProfileViewController: UIViewController { let request = ProfileRetrievalRequest(page: 0) ProfileService.getProfile(handle: receivedHandle ?? "", request: request) { data, failed in guard let data = data else { - // 에러가 난 경우, alert 창 present switch failed { + case .clientError: + self.navigationController?.popViewController(animated: true) + self.navigationItem.title = "" + self.searchBlockedUser = true + self.showAlert(alertType: .confirmOnly, + titleText: "차단한 유저의 프로필입니다.", + messageText: "차단해제를 원하시면\n설정 탭의 차단관리 페이지를 확인해주세요.", + cancelButtonText: "", + confirmButtonText: "확인" + ) case .disconnected: self.present(UIAlertController.networkErrorAlert(title: failed!.localizedDescription), animated: true) case .serverError: @@ -206,7 +212,6 @@ class OtherUserProfileViewController: UIViewController { print("=== Profile, setup data succeeded ===") print("== data: \(data)") - let currentHandle = UserDefaultsManager.getData(type: String.self, forKey: .handle) // load 프로필 이미지 if let url = URL(string: data.result.profileImage ?? "") { self.profileImage.load(with: url) @@ -215,45 +220,8 @@ class OtherUserProfileViewController: UIViewController { // 필요한 데이터 뷰에 반영 self.setUpResponseData(data.result) - // 버튼 설정 - if currentHandle == self.receivedHandle{ - /// 내 프로필 조회한 경우 - self.followToggleBtn.layer.isHidden = true - self.updateProfileBtn.layer.isHidden = false - self.postListTabmanView.topAnchor.constraint(equalTo: self.whiteBackground.bottomAnchor, constant: 5).isActive = true - self.moreButton.isHidden = true - - } else { - self.followToggleBtn.setTitleColor(UIColor.white, for: .normal) - self.followToggleBtn.titleLabel?.font = UIFont(name: "Pretendard-Bold", size: 16) // 폰트 설정 - self.followToggleBtn.layer.cornerRadius = 5 - - if data.result.isFollow == true { - /// 팔로우 중인 유저인 경우 - self.followToggleBtn.setTitle("팔로잉", for: .normal) - self.followToggleBtn.backgroundColor = UIColor(named: "gray03") - - } else { - /// 팔로우하고 있지 않은 유저인 경우 - self.followToggleBtn.setTitle("팔로우", for: .normal) - self.followToggleBtn.backgroundColor = UIColor(named: "yellow00") - - } - - } - // case .MEMBER4002: - // self.navigationController?.popViewController(animated: true) - // print("유효하지 않은 멤버의 handle입니다.") - // self.navigationItem.title = "" - // self.searchBlockedUser = true - // self.showAlert(alertType: .confirmOnly, - // titleText: "차단한 유저의 프로필입니다.", - // messageText: "차단해제를 원하시면\n설정 탭의 차단관리 페이지를 확인해주세요.", - // cancelButtonText: "", - // confirmButtonText: "확인" - // ) - // } - // }) + // 팔로우 버튼 설정 + self.setUpFollowBtn(data.result) } } @@ -267,6 +235,34 @@ class OtherUserProfileViewController: UIViewController { self.receivedFollowingCount = resposeData.followingCount ?? 0 self.receivedIsFollow = resposeData.isFollow } + + private func setUpFollowBtn(_ resposeData: ProfileRetrievalResult) { + let currentHandle = UserDefaultsManager.getData(type: String.self, forKey: .handle) + // 버튼 설정 + if currentHandle == self.receivedHandle { + /// 내 프로필 조회한 경우 + self.followToggleBtn.layer.isHidden = true + self.updateProfileBtn.layer.isHidden = false + self.postListTabmanView.topAnchor.constraint(equalTo: self.whiteBackground.bottomAnchor, constant: 5).isActive = true + self.moreButton.isHidden = true + + } else { + self.followToggleBtn.setTitleColor(UIColor.white, for: .normal) + self.followToggleBtn.titleLabel?.font = UIFont(name: "Pretendard-Bold", size: 16) + self.followToggleBtn.layer.cornerRadius = 5 + + if resposeData.isFollow == true { + /// 팔로우 중인 유저인 경우 + self.followToggleBtn.setTitle("팔로잉", for: .normal) + self.followToggleBtn.backgroundColor = UIColor(named: "gray03") + + } else { + /// 팔로우하고 있지 않은 유저인 경우 + self.followToggleBtn.setTitle("팔로우", for: .normal) + self.followToggleBtn.backgroundColor = UIColor(named: "yellow00") + } + } + } } // MARK: - Extension : CustomAlertDelegate, SecondViewControllerDelegate @@ -279,7 +275,6 @@ extension OtherUserProfileViewController: CustomAlertDelegate { } else { UserService.postFollowRequest(handle: receivedHandle ?? "") { [weak self] data, failed in guard let data = data else { - // 에러가 난 경우, alert 창 present switch failed { case .disconnected: self?.present(UIAlertController.networkErrorAlert(title: failed!.localizedDescription), animated: true) @@ -294,9 +289,6 @@ extension OtherUserProfileViewController: CustomAlertDelegate { } print(data.message) } -// FollowToggleDataManager.shared.followToggleDataManager(receivedHandle ?? "", { resultData in -// print(resultData.message) -// }) self.receivedIsFollow = false followToggleBtn.setTitle("팔로우", for: .normal) followToggleBtn.backgroundColor = UIColor(named: "yellow00") diff --git a/pochak/pochak/UI/Profile/PostList/PochakPostTabmanViewController.swift b/pochak/pochak/UI/Profile/PostList/PochakPostTabmanViewController.swift index 1604b24a..c201ec65 100644 --- a/pochak/pochak/UI/Profile/PostList/PochakPostTabmanViewController.swift +++ b/pochak/pochak/UI/Profile/PostList/PochakPostTabmanViewController.swift @@ -64,9 +64,9 @@ class PochakPostTabmanViewController: UIViewController { private func setUpData() { isCurrentlyFetching = true let request = ProfileRetrievalRequest(page: currentFetchingPage) + ProfileService.getProfilePochakPosts(handle: receivedHandle ?? "", request: request) { [weak self] data, failed in guard let data = data else { - // 에러가 난 경우, alert 창 present switch failed { case .disconnected: self?.present(UIAlertController.networkErrorAlert(title: failed!.localizedDescription), animated: true) @@ -80,9 +80,6 @@ class PochakPostTabmanViewController: UIViewController { return } - print("=== Profile Pochak Tab, setup data succeeded ===") - print("== data: \(data)") - let newPosts = data.result.postList let startIndex = data.result.postList.count let endIndex = startIndex + newPosts.count @@ -101,25 +98,6 @@ class PochakPostTabmanViewController: UIViewController { self?.currentFetchingPage += 1; } } -// MyProfilePostDataManager.shared.myProfilePochakPostDataManager(receivedHandle ?? "",currentFetchingPage,{resultData in -// let newPosts = resultData.postList -// let startIndex = resultData.postList.count -// let endIndex = startIndex + newPosts.count -// let newIndexPaths = (startIndex..>>>>>> PochakPostDataManager is currently reloading!!!!!!!") -// } else { -// self.postCollectionView.insertItems(at: newIndexPaths) -// } -// self.isCurrentlyFetching = false -// self.currentFetchingPage += 1; -// } -// }) } } diff --git a/pochak/pochak/UI/Profile/PostList/PochakedPostTabmanViewController.swift b/pochak/pochak/UI/Profile/PostList/PochakedPostTabmanViewController.swift index 006d7057..61332def 100644 --- a/pochak/pochak/UI/Profile/PostList/PochakedPostTabmanViewController.swift +++ b/pochak/pochak/UI/Profile/PostList/PochakedPostTabmanViewController.swift @@ -63,9 +63,9 @@ class PochakedPostTabmanViewController: UIViewController { private func setUpData() { isCurrentlyFetching = true let request = ProfileRetrievalRequest(page: currentFetchingPage) + ProfileService.getProfile(handle: receivedHandle ?? "", request: request) { [weak self] data, failed in guard let data = data else { - // 에러가 난 경우, alert 창 present switch failed { case .disconnected: self?.present(UIAlertController.networkErrorAlert(title: failed!.localizedDescription), animated: true) @@ -79,9 +79,6 @@ class PochakedPostTabmanViewController: UIViewController { return } - print("=== Profile Pochaked Tab, setup data succeeded ===") - print("== data: \(data)") - let newPosts = data.result.postList let startIndex = data.result.postList.count print("startIndex : \(startIndex)") @@ -105,37 +102,6 @@ class PochakedPostTabmanViewController: UIViewController { self?.currentFetchingPage += 1; } } - // MyProfilePostDataManager.shared.myProfileUserAndPochakedPostDataManager(receivedHandle ?? "", currentFetchingPage, { response in - // switch response { - // case .success(let resultData): - // - // let newPosts = resultData.postList - // let startIndex = resultData.postList.count - // print("startIndex : \(startIndex)") - // let endIndex = startIndex + newPosts.count - // print("endIndex : \(endIndex)") - // let newIndexPaths = (startIndex..>>>>>> PochakedPostDataManager is currently reloading!!!!!!!") - // } else { - // self.postCollectionView.insertItems(at: newIndexPaths) - // print(">>>>>>> PochakedPostDataManager is currently fethcing!!!!!!!") - // } - // self.isCurrentlyFetching = false - // self.currentFetchingPage += 1; - // } - // case .MEMBER4002: - // print("유효하지 않은 멤버의 handle입니다.") - // } - // }) - // } } } diff --git a/pochak/pochak/UI/Profile/PostList/cell/ProfilePostCollectionViewCell.swift b/pochak/pochak/UI/Profile/PostList/cell/ProfilePostCollectionViewCell.swift index 8e1ab5f4..84254ce5 100644 --- a/pochak/pochak/UI/Profile/PostList/cell/ProfilePostCollectionViewCell.swift +++ b/pochak/pochak/UI/Profile/PostList/cell/ProfilePostCollectionViewCell.swift @@ -13,13 +13,13 @@ class ProfilePostCollectionViewCell: UICollectionViewCell { // MARK: - Properties static let identifier = "ProfilePostCollectionViewCell" // Collection View가 생성할 cell임을 명시 - + // MARK: - Views @IBOutlet weak var profilePostImage: UIImageView! // MARK: - LifeCycle - + override func awakeFromNib() { super.awakeFromNib() } @@ -31,16 +31,5 @@ class ProfilePostCollectionViewCell: UICollectionViewCell { if let url = URL(string: (imageURL)) { profilePostImage.load(with: url) } -// if let url = URL(string: imageURL) { -// -// profilePostImage.kf.setImage(with: url) { result in -// switch result { -// case .success(let value): -// print("Image successfully loaded: \(value.image)") -// case .failure(let error): -// print("Image failed to load with error: \(error.localizedDescription)") -// } -// } -// } } } diff --git a/pochak/pochak/UI/Profile/ProfileMenuViewController.swift b/pochak/pochak/UI/Profile/ProfileMenuViewController.swift index 255f50a1..d534746a 100644 --- a/pochak/pochak/UI/Profile/ProfileMenuViewController.swift +++ b/pochak/pochak/UI/Profile/ProfileMenuViewController.swift @@ -49,7 +49,6 @@ extension ProfileMenuViewController: CustomAlertDelegate { func confirmAction() { UserService.blockUser(handle: receivedHandle ?? "") { [weak self] data, failed in guard let data = data else { - // 에러가 난 경우, alert 창 present switch failed { case .disconnected: self?.present(UIAlertController.networkErrorAlert(title: failed!.localizedDescription), animated: true) @@ -62,18 +61,11 @@ extension ProfileMenuViewController: CustomAlertDelegate { } return } - print(data.message) self?.userBlockBtn.setTitle("차단취소", for: .normal) self?.delegate?.dismissSecondViewController() self?.dismiss(animated: true, completion: nil) } - // BlockDataManager.shared.blockDataManager(receivedHandle ?? "", { resultData in - // print(resultData.message) - // self.userBlockBtn.setTitle("차단취소", for: .normal) - // self.delegate?.dismissSecondViewController() - // self.dismiss(animated: true, completion: nil) - // }) } func cancel() { diff --git a/pochak/pochak/UI/Profile/UpdateProfileViewController.swift b/pochak/pochak/UI/Profile/UpdateProfileViewController.swift index 31cb075a..45e14523 100644 --- a/pochak/pochak/UI/Profile/UpdateProfileViewController.swift +++ b/pochak/pochak/UI/Profile/UpdateProfileViewController.swift @@ -38,19 +38,18 @@ class UpdateProfileViewController: UIViewController { // MARK: - Actions @objc private func doneBtnTapped(_ sender: Any) { - // UserDefaults에 데이터 추가 guard let name = nameTextField.text else {return} guard let message = messageTextView.text else {return} - let profileImage: Data? = profileImg.image?.jpegData(compressionQuality: 0.2) + let profileImage: Data? = profileImg.image?.jpegData(compressionQuality: 0.2) let request = ProfileUpdateRequest(name: name, message: message) var files: [(Data, String, String)] = [] if let profileImage = profileImage { let fileTuple: (Data, String, String) = (profileImage, "profileImage", "image/jpeg") files.append(fileTuple) } + ProfileService.profileUpdate(handle: handle, files: files, request: request) { [weak self] data, failed in guard let data = data else { - // 에러가 난 경우, alert 창 present switch failed { case .disconnected: self?.present(UIAlertController.networkErrorAlert(title: failed!.localizedDescription), animated: true) @@ -64,26 +63,15 @@ class UpdateProfileViewController: UIViewController { return } + // UserDefaults 정보 업데이트 UserDefaultsManager.setData(value: data.result.name, key: .name) UserDefaultsManager.setData(value: data.result.handle, key: .handle) UserDefaultsManager.setData(value: data.result.message, key: .message) UserDefaultsManager.setData(value: data.result.profileImage, key: .profileImgUrl) + // 프로필 화면으로 전환 self?.navigationController?.popViewController(animated: true) } - -// ProfileUpdateDataManager.shared.updateDataManager(name, -// handle, -// message, -// profileImage, -// {resultData in -// UserDefaultsManager.setData(value: resultData.name, key: .name) -// UserDefaultsManager.setData(value: resultData.handle, key: .handle) -// UserDefaultsManager.setData(value: resultData.message, key: .message) -// UserDefaultsManager.setData(value: resultData.profileImage, key: .profileImgUrl) -// // 프로필 화면으로 전환 -// self.navigationController?.popViewController(animated: true) -// }) } /* < 앨범 사진 선택 > From f8660e9573e0912cbffc297eaa072858d3237d12 Mon Sep 17 00:00:00 2001 From: Jungyeon Seo Date: Tue, 1 Oct 2024 02:11:25 +0900 Subject: [PATCH 11/54] =?UTF-8?q?Chore=20:=20=ED=8C=8C=EC=9D=BC=20?= =?UTF-8?q?=EC=9D=B4=EB=A6=84=20=EB=B3=80=EA=B2=BD?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../Network/APIs/User/DeleteFollowerAPI.swift | 36 +++++++++++++++++++ .../Network/APIs/User/UnfollowAPI.swift | 36 ------------------- ...uest.swift => DeleteFollowerRequest.swift} | 4 +-- ...nse.swift => DeleteFollowerResponse.swift} | 4 +-- 4 files changed, 40 insertions(+), 40 deletions(-) create mode 100644 pochak/pochak/Network/APIs/User/DeleteFollowerAPI.swift delete mode 100644 pochak/pochak/Network/APIs/User/UnfollowAPI.swift rename pochak/pochak/Network/Models/User/{UnfollowRequest.swift => DeleteFollowerRequest.swift} (59%) rename pochak/pochak/Network/Models/User/{UnfollowResponse.swift => DeleteFollowerResponse.swift} (66%) diff --git a/pochak/pochak/Network/APIs/User/DeleteFollowerAPI.swift b/pochak/pochak/Network/APIs/User/DeleteFollowerAPI.swift new file mode 100644 index 00000000..58c249cc --- /dev/null +++ b/pochak/pochak/Network/APIs/User/DeleteFollowerAPI.swift @@ -0,0 +1,36 @@ +// +// DeleteFollowerAPI.swift +// pochak +// +// Created by Seo Cindy on 9/30/24. +// + +import Foundation +import Alamofire + +enum DeleteFollowerAPI { + case deleteFollower(handle: String, request: DeleteFollowerRequest) +} + +extension DeleteFollowerAPI: BaseAPI { + + typealias Response = DeleteFollowerResponse + + var method: HTTPMethod { + switch self { + case .deleteFollower: return .delete + } + } + + var path: String { + switch self { + case .deleteFollower(let handle, _): return "/v2/members/\(handle)/follower" + } + } + + var parameters: RequestParams? { + switch self { + case .deleteFollower(_, let request): return .query(request) + } + } +} diff --git a/pochak/pochak/Network/APIs/User/UnfollowAPI.swift b/pochak/pochak/Network/APIs/User/UnfollowAPI.swift deleted file mode 100644 index 4bf0018c..00000000 --- a/pochak/pochak/Network/APIs/User/UnfollowAPI.swift +++ /dev/null @@ -1,36 +0,0 @@ -// -// UnfollowAPI.swift -// pochak -// -// Created by Seo Cindy on 9/30/24. -// - -import Foundation -import Alamofire - -enum UnfollowAPI { - case unfollowUser(handle: String, request: UnfollowRequest) -} - -extension UnfollowAPI: BaseAPI { - - typealias Response = FollowResponse - - var method: HTTPMethod { - switch self { - case .unfollowUser: return .delete - } - } - - var path: String { - switch self { - case .unfollowUser(let handle, _): return "/v2/members/\(handle)/follower" - } - } - - var parameters: RequestParams? { - switch self { - case .unfollowUser(_, let request): return .query(request) - } - } -} diff --git a/pochak/pochak/Network/Models/User/UnfollowRequest.swift b/pochak/pochak/Network/Models/User/DeleteFollowerRequest.swift similarity index 59% rename from pochak/pochak/Network/Models/User/UnfollowRequest.swift rename to pochak/pochak/Network/Models/User/DeleteFollowerRequest.swift index d68114ff..1c802f11 100644 --- a/pochak/pochak/Network/Models/User/UnfollowRequest.swift +++ b/pochak/pochak/Network/Models/User/DeleteFollowerRequest.swift @@ -1,5 +1,5 @@ // -// UnfollowRequest.swift +// DeleteFollowerRequest.swift // pochak // // Created by Seo Cindy on 9/30/24. @@ -7,6 +7,6 @@ import Foundation -struct UnfollowRequest: Encodable { +struct DeleteFollowerRequest: Encodable { let followerHandle: String } diff --git a/pochak/pochak/Network/Models/User/UnfollowResponse.swift b/pochak/pochak/Network/Models/User/DeleteFollowerResponse.swift similarity index 66% rename from pochak/pochak/Network/Models/User/UnfollowResponse.swift rename to pochak/pochak/Network/Models/User/DeleteFollowerResponse.swift index 7610afd2..4a877d43 100644 --- a/pochak/pochak/Network/Models/User/UnfollowResponse.swift +++ b/pochak/pochak/Network/Models/User/DeleteFollowerResponse.swift @@ -1,5 +1,5 @@ // -// UnfollowResponse.swift +// DeleteFollowerResponse.swift // pochak // // Created by Seo Cindy on 9/30/24. @@ -7,7 +7,7 @@ import Foundation -struct UnfollowResponse: Codable { +struct DeleteFollowerResponse: Codable { let isSuccess: Bool let code: String let message: String From 9c7235f19bb6f365c7f404f6144111759ec6eb62 Mon Sep 17 00:00:00 2001 From: Jungyeon Seo Date: Tue, 1 Oct 2024 02:11:43 +0900 Subject: [PATCH 12/54] =?UTF-8?q?Style=20:=20convention=20=EB=94=B0?= =?UTF-8?q?=EB=9D=BC=20=EC=BD=94=EB=93=9C=20=ED=8F=AC=EB=A7=B7=ED=8C=85?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- pochak/pochak.xcodeproj/project.pbxproj | 24 +++++------ .../pochak/Network/APIs/User/BlockAPI.swift | 4 +- .../Network/APIs/User/BlockListAPI.swift | 4 +- .../pochak/Network/APIs/User/FollowAPI.swift | 4 +- .../APIs/User/FollowerRetrievalAPI.swift | 4 +- .../pochak/Network/APIs/User/UnblockAPI.swift | 4 +- .../Models/User/FollowListRequest.swift | 1 - .../Services/AuthenticationService.swift | 3 ++ .../Network/Services/ProfileService.swift | 14 ++++++- .../pochak/Network/Services/UserService.swift | 40 +++++++++++-------- .../FollowerListTabmanViewController.swift | 10 +---- 11 files changed, 63 insertions(+), 49 deletions(-) diff --git a/pochak/pochak.xcodeproj/project.pbxproj b/pochak/pochak.xcodeproj/project.pbxproj index 57f4ebaa..13e6697d 100644 --- a/pochak/pochak.xcodeproj/project.pbxproj +++ b/pochak/pochak.xcodeproj/project.pbxproj @@ -128,9 +128,9 @@ 374E46452CAACD33008AE361 /* BlockListAPI.swift in Sources */ = {isa = PBXBuildFile; fileRef = 374E46442CAACD33008AE361 /* BlockListAPI.swift */; }; 374E46472CAACE4C008AE361 /* BlockListRequest.swift in Sources */ = {isa = PBXBuildFile; fileRef = 374E46462CAACE4C008AE361 /* BlockListRequest.swift */; }; 374E46492CAACE53008AE361 /* BlockListResponse.swift in Sources */ = {isa = PBXBuildFile; fileRef = 374E46482CAACE53008AE361 /* BlockListResponse.swift */; }; - 3759CF2F2CAAE42600408A4E /* UnfollowAPI.swift in Sources */ = {isa = PBXBuildFile; fileRef = 3759CF2E2CAAE42600408A4E /* UnfollowAPI.swift */; }; - 3759CF312CAAE4C600408A4E /* UnfollowRequest.swift in Sources */ = {isa = PBXBuildFile; fileRef = 3759CF302CAAE4C600408A4E /* UnfollowRequest.swift */; }; - 3759CF332CAAE4CE00408A4E /* UnfollowResponse.swift in Sources */ = {isa = PBXBuildFile; fileRef = 3759CF322CAAE4CE00408A4E /* UnfollowResponse.swift */; }; + 3759CF2F2CAAE42600408A4E /* DeleteFollowerAPI.swift in Sources */ = {isa = PBXBuildFile; fileRef = 3759CF2E2CAAE42600408A4E /* DeleteFollowerAPI.swift */; }; + 3759CF312CAAE4C600408A4E /* DeleteFollowerRequest.swift in Sources */ = {isa = PBXBuildFile; fileRef = 3759CF302CAAE4C600408A4E /* DeleteFollowerRequest.swift */; }; + 3759CF332CAAE4CE00408A4E /* DeleteFollowerResponse.swift in Sources */ = {isa = PBXBuildFile; fileRef = 3759CF322CAAE4CE00408A4E /* DeleteFollowerResponse.swift */; }; 3759CF352CAAE79000408A4E /* FollowerRetrievalAPI.swift in Sources */ = {isa = PBXBuildFile; fileRef = 3759CF342CAAE79000408A4E /* FollowerRetrievalAPI.swift */; }; 3759CF372CAAE79F00408A4E /* FollowingRetrievalAPI.swift in Sources */ = {isa = PBXBuildFile; fileRef = 3759CF362CAAE79F00408A4E /* FollowingRetrievalAPI.swift */; }; 3759CF392CAAE7E900408A4E /* FollowListRequest.swift in Sources */ = {isa = PBXBuildFile; fileRef = 3759CF382CAAE7E900408A4E /* FollowListRequest.swift */; }; @@ -374,9 +374,9 @@ 374E46462CAACE4C008AE361 /* BlockListRequest.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = BlockListRequest.swift; sourceTree = ""; }; 374E46482CAACE53008AE361 /* BlockListResponse.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = BlockListResponse.swift; sourceTree = ""; }; 3750669E2C3BB1660036E264 /* pochak.entitlements */ = {isa = PBXFileReference; lastKnownFileType = text.plist.entitlements; path = pochak.entitlements; sourceTree = ""; }; - 3759CF2E2CAAE42600408A4E /* UnfollowAPI.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = UnfollowAPI.swift; sourceTree = ""; }; - 3759CF302CAAE4C600408A4E /* UnfollowRequest.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = UnfollowRequest.swift; sourceTree = ""; }; - 3759CF322CAAE4CE00408A4E /* UnfollowResponse.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = UnfollowResponse.swift; sourceTree = ""; }; + 3759CF2E2CAAE42600408A4E /* DeleteFollowerAPI.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = DeleteFollowerAPI.swift; sourceTree = ""; }; + 3759CF302CAAE4C600408A4E /* DeleteFollowerRequest.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = DeleteFollowerRequest.swift; sourceTree = ""; }; + 3759CF322CAAE4CE00408A4E /* DeleteFollowerResponse.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = DeleteFollowerResponse.swift; sourceTree = ""; }; 3759CF342CAAE79000408A4E /* FollowerRetrievalAPI.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = FollowerRetrievalAPI.swift; sourceTree = ""; }; 3759CF362CAAE79F00408A4E /* FollowingRetrievalAPI.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = FollowingRetrievalAPI.swift; sourceTree = ""; }; 3759CF382CAAE7E900408A4E /* FollowListRequest.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = FollowListRequest.swift; sourceTree = ""; }; @@ -592,7 +592,7 @@ isa = PBXGroup; children = ( 0822A04E2CA1980200F87E2C /* FollowAPI.swift */, - 3759CF2E2CAAE42600408A4E /* UnfollowAPI.swift */, + 3759CF2E2CAAE42600408A4E /* DeleteFollowerAPI.swift */, 3759CF342CAAE79000408A4E /* FollowerRetrievalAPI.swift */, 3759CF362CAAE79F00408A4E /* FollowingRetrievalAPI.swift */, 374E463A2CAAC762008AE361 /* BlockAPI.swift */, @@ -624,8 +624,8 @@ isa = PBXGroup; children = ( 0822A0592CA1983C00F87E2C /* FollowResponse.swift */, - 3759CF302CAAE4C600408A4E /* UnfollowRequest.swift */, - 3759CF322CAAE4CE00408A4E /* UnfollowResponse.swift */, + 3759CF302CAAE4C600408A4E /* DeleteFollowerRequest.swift */, + 3759CF322CAAE4CE00408A4E /* DeleteFollowerResponse.swift */, 3759CF382CAAE7E900408A4E /* FollowListRequest.swift */, 3759CF3A2CAAE80700408A4E /* FollowListResponse.swift */, 374E463C2CAAC82E008AE361 /* BlockResponse.swift */, @@ -1640,7 +1640,7 @@ 376EA12C2CAAAE5600FEFB63 /* ProfileRetrievalResponse.swift in Sources */, EA0107A72A5CF73900A3AE85 /* AlarmViewController.swift in Sources */, 08EB99B72C53EA8500FAC08A /* TaggedUsersTableViewCell.swift in Sources */, - 3759CF332CAAE4CE00408A4E /* UnfollowResponse.swift in Sources */, + 3759CF332CAAE4CE00408A4E /* DeleteFollowerResponse.swift in Sources */, EACF0F6E2C3044C000C0016C /* TagSearchTableViewCell.swift in Sources */, 08B679632B528D7500F8D585 /* CommentTableViewFooterView.swift in Sources */, EA2CD6442C5F5A0E00644EFE /* HomeAPI.swift in Sources */, @@ -1667,7 +1667,7 @@ EA17182C2A5912A7009168E6 /* UploadViewController.swift in Sources */, 089E27B72C4E8C2D00828F4C /* AlarmType.swift in Sources */, 3769D6B22B3C300D00294CD1 /* GoogleLoginModel.swift in Sources */, - 3759CF2F2CAAE42600408A4E /* UnfollowAPI.swift in Sources */, + 3759CF2F2CAAE42600408A4E /* DeleteFollowerAPI.swift in Sources */, EA96D04C2C8F10C700D80562 /* TagPreviewResponse.swift in Sources */, 0822A06B2CA1983C00F87E2C /* ChildCommentGetResponse.swift in Sources */, 0822A0352CA196DF00F87E2C /* ExploreTabViewController.swift in Sources */, @@ -1721,7 +1721,7 @@ 08C02EF82BF394B800627C21 /* UIAlertController+.swift in Sources */, 089E27B92C4E8CB800828F4C /* AlertType.swift in Sources */, EAE69F442C315009005762B7 /* UIVIew+.swift in Sources */, - 3759CF312CAAE4C600408A4E /* UnfollowRequest.swift in Sources */, + 3759CF312CAAE4C600408A4E /* DeleteFollowerRequest.swift in Sources */, 0876E23E2C274256008DE88F /* NoPostCollectionViewCell.swift in Sources */, EA96D0502C8F15E000D80562 /* TagPreviewAPI.swift in Sources */, 0822A0482CA197E700F87E2C /* PostDeleteAPI.swift in Sources */, diff --git a/pochak/pochak/Network/APIs/User/BlockAPI.swift b/pochak/pochak/Network/APIs/User/BlockAPI.swift index 81d1b5ac..c39c4632 100644 --- a/pochak/pochak/Network/APIs/User/BlockAPI.swift +++ b/pochak/pochak/Network/APIs/User/BlockAPI.swift @@ -15,13 +15,13 @@ enum BlockAPI { extension BlockAPI: BaseAPI { typealias Response = BlockResponse - + var method: HTTPMethod { switch self { case .blockUser: return .post } } - + var path: String { switch self { case .blockUser(let handle): return "/v2/members/\(handle)/block" diff --git a/pochak/pochak/Network/APIs/User/BlockListAPI.swift b/pochak/pochak/Network/APIs/User/BlockListAPI.swift index 95226afa..1e988bd1 100644 --- a/pochak/pochak/Network/APIs/User/BlockListAPI.swift +++ b/pochak/pochak/Network/APIs/User/BlockListAPI.swift @@ -15,13 +15,13 @@ enum BlockListAPI { extension BlockListAPI: BaseAPI { typealias Response = BlockListResponse - + var method: HTTPMethod { switch self { case .getBlockUserList: return .get } } - + var path: String { switch self { case .getBlockUserList(let handle, _): return "/v2/members/\(handle)/block" diff --git a/pochak/pochak/Network/APIs/User/FollowAPI.swift b/pochak/pochak/Network/APIs/User/FollowAPI.swift index 031efc2c..127ee484 100644 --- a/pochak/pochak/Network/APIs/User/FollowAPI.swift +++ b/pochak/pochak/Network/APIs/User/FollowAPI.swift @@ -15,13 +15,13 @@ enum FollowAPI { extension FollowAPI: BaseAPI { typealias Response = FollowResponse - + var method: HTTPMethod { switch self { case .postFollowRequest: return .post } } - + var path: String { switch self { case .postFollowRequest(let handle): return "/v2/members/\(handle)/follow" diff --git a/pochak/pochak/Network/APIs/User/FollowerRetrievalAPI.swift b/pochak/pochak/Network/APIs/User/FollowerRetrievalAPI.swift index b799cf4c..0bc47fc5 100644 --- a/pochak/pochak/Network/APIs/User/FollowerRetrievalAPI.swift +++ b/pochak/pochak/Network/APIs/User/FollowerRetrievalAPI.swift @@ -15,13 +15,13 @@ enum FollowerRetrievalAPI { extension FollowerRetrievalAPI: BaseAPI { typealias Response = FollowListResponse - + var method: HTTPMethod { switch self { case .getFollowers: return .get } } - + var path: String { switch self { case .getFollowers(let handle, _): return "/v2/members/\(handle)/follower" diff --git a/pochak/pochak/Network/APIs/User/UnblockAPI.swift b/pochak/pochak/Network/APIs/User/UnblockAPI.swift index ac551c8d..22f694e4 100644 --- a/pochak/pochak/Network/APIs/User/UnblockAPI.swift +++ b/pochak/pochak/Network/APIs/User/UnblockAPI.swift @@ -15,13 +15,13 @@ enum UnblockAPI { extension UnblockAPI: BaseAPI { typealias Response = UnblockResponse - + var method: HTTPMethod { switch self { case .unblockUser: return .delete } } - + var path: String { switch self { case .unblockUser(let handle, _): return "/v2/members/\(handle)/block" diff --git a/pochak/pochak/Network/Models/User/FollowListRequest.swift b/pochak/pochak/Network/Models/User/FollowListRequest.swift index 36800a41..006f5b45 100644 --- a/pochak/pochak/Network/Models/User/FollowListRequest.swift +++ b/pochak/pochak/Network/Models/User/FollowListRequest.swift @@ -7,7 +7,6 @@ import Foundation - struct FollowListRequest: Encodable { let page: Int } diff --git a/pochak/pochak/Network/Services/AuthenticationService.swift b/pochak/pochak/Network/Services/AuthenticationService.swift index b0eb7ec6..b496a938 100644 --- a/pochak/pochak/Network/Services/AuthenticationService.swift +++ b/pochak/pochak/Network/Services/AuthenticationService.swift @@ -8,6 +8,7 @@ import Foundation struct AuthenticationService { + /// - Parameters: /// - completion: 통신 후 핸들러 (뷰컨트롤러에 있음) static func signOut( @@ -24,6 +25,8 @@ struct AuthenticationService { } } + /// - Parameters: + /// - completion: 통신 후 핸들러 (뷰컨트롤러에 있음) static func logOut( completion: @escaping (_ succeed: LogOutResponse?, _ failed: NetworkError?) -> Void) { NetworkService.shared.request(LogOutAPI.logOut) { response in diff --git a/pochak/pochak/Network/Services/ProfileService.swift b/pochak/pochak/Network/Services/ProfileService.swift index fdb25b5e..bf2d1c52 100644 --- a/pochak/pochak/Network/Services/ProfileService.swift +++ b/pochak/pochak/Network/Services/ProfileService.swift @@ -8,8 +8,10 @@ import Foundation struct ProfileService { + /// - Parameters: - /// - request: 받아올 프로필 탭 페이지 + /// - handle : 조회하는 프로필 유저의 핸들 + /// - request: page 정보 /// - completion: 통신 후 핸들러 (뷰컨트롤러에 있음) static func getProfile( handle: String, @@ -27,6 +29,10 @@ struct ProfileService { } } + /// - Parameters: + /// - handle : 조회하는 프로필 유저의 핸들 + /// - request: page 정보 + /// - completion: 통신 후 핸들러 (뷰컨트롤러에 있음) static func getProfilePochakPosts( handle: String, request: ProfileRetrievalRequest, @@ -43,6 +49,11 @@ struct ProfileService { } } + /// - Parameters: + /// - request: 현재 로그인한 유저의 핸들 + /// - files : 수정한 프로필 이미지 + /// - request : 수정한 name, message 정보 + /// - completion: 통신 후 핸들러 (뷰컨트롤러에 있음) static func profileUpdate( handle: String, files: [(Data, String, String)], @@ -59,5 +70,4 @@ struct ProfileService { } } } - } diff --git a/pochak/pochak/Network/Services/UserService.swift b/pochak/pochak/Network/Services/UserService.swift index 26b86990..bd91374a 100644 --- a/pochak/pochak/Network/Services/UserService.swift +++ b/pochak/pochak/Network/Services/UserService.swift @@ -28,29 +28,31 @@ struct UserService { } } - /// 팔로우 요청 혹은 취소하기 + /// 팔로우 삭제하기 /// - Parameters: - /// - handle: 팔로우 요청 혹은 취소하려는 사용자의 핸들 (아이디) + /// - handle: 현재 로그인한 유저의 핸들 + /// - request : 삭제하려는 팔로워의 핸들 /// - completion: 통신 후 핸들러 (뷰컨트롤러) - static func unfollowUser( + static func deleteFollower( handle: String, - request: UnfollowRequest, - completion: @escaping (_ succeed: FollowResponse?, _ failed: NetworkError?) -> Void) { - NetworkService.shared.request(UnfollowAPI.unfollowUser(handle: handle, request: request)) { response in + request: DeleteFollowerRequest, + completion: @escaping (_ succeed: DeleteFollowerResponse?, _ failed: NetworkError?) -> Void) { + NetworkService.shared.request(DeleteFollowerAPI.deleteFollower(handle: handle, request: request)) { response in switch response { case .success(let data): completion(data, nil) case .failure(let error): - print("=== unfollowUser service error ===") + print("=== deleteFollower service error ===") print(error.localizedDescription) completion(nil, error) } } } - /// 팔로우 요청 혹은 취소하기 + /// 팔로워 리스트 조회하기 /// - Parameters: - /// - handle: 팔로우 요청 혹은 취소하려는 사용자의 핸들 (아이디) + /// - handle: 해당하는 핸들 유저의 팔로워 리스트 조회 + /// - request : page 정보 /// - completion: 통신 후 핸들러 (뷰컨트롤러) static func getFollowers( handle: String, @@ -68,6 +70,11 @@ struct UserService { } } + /// 팔로잉 리스트 조회하기 + /// - Parameters: + /// - handle: 해당하는 핸들 유저의 팔로잉 리스트 조회 + /// - request : page 정보 + /// - completion: 통신 후 핸들러 (뷰컨트롤러) static func getFollowings( handle: String, request: FollowListRequest, @@ -84,9 +91,9 @@ struct UserService { } } - /// 팔로우 요청 혹은 취소하기 + /// 유저 차단하기 /// - Parameters: - /// - handle: 팔로우 요청 혹은 취소하려는 사용자의 핸들 (아이디) + /// - handle: 차단하고자 하는 사용자의 핸들 (아이디) /// - completion: 통신 후 핸들러 (뷰컨트롤러) static func blockUser( handle: String, @@ -103,9 +110,10 @@ struct UserService { } } - /// 팔로우 요청 혹은 취소하기 + /// 유저 차단 해제하기 /// - Parameters: - /// - handle: 팔로우 요청 혹은 취소하려는 사용자의 핸들 (아이디) + /// - handle : 현재 로그인한 유저의 핸들 + /// - request : 차단을 해제하고자 하는 사용자의 핸들 (아이디) /// - completion: 통신 후 핸들러 (뷰컨트롤러) static func unblockUser( handle: String, @@ -123,10 +131,10 @@ struct UserService { } } - - /// 팔로우 요청 혹은 취소하기 + /// 차단 유저 리스트 조회 /// - Parameters: - /// - handle: 팔로우 요청 혹은 취소하려는 사용자의 핸들 (아이디) + /// - handle: 현재 로그인한 유저의 핸들 + /// - request : page 정보 /// - completion: 통신 후 핸들러 (뷰컨트롤러) static func getBlockUserList( handle: String, diff --git a/pochak/pochak/UI/Profile/FollowList/FollowerListTabmanViewController.swift b/pochak/pochak/UI/Profile/FollowList/FollowerListTabmanViewController.swift index b04c4609..ff72c89f 100644 --- a/pochak/pochak/UI/Profile/FollowList/FollowerListTabmanViewController.swift +++ b/pochak/pochak/UI/Profile/FollowList/FollowerListTabmanViewController.swift @@ -179,10 +179,9 @@ extension FollowerListTabmanViewController: RemoveImageDelegate { extension FollowerListTabmanViewController : CustomAlertDelegate { func confirmAction() { - let request = UnfollowRequest(followerHandle: cellHandle ?? "") - UserService.unfollowUser(handle: receivedHandle ?? "", request: request) { [weak self] data, failed in + let request = DeleteFollowerRequest(followerHandle: cellHandle ?? "") + UserService.deleteFollower(handle: receivedHandle ?? "", request: request) { [weak self] data, failed in guard let data = data else { - // 에러가 난 경우, alert 창 present switch failed { case .disconnected: self?.present(UIAlertController.networkErrorAlert(title: failed!.localizedDescription), animated: true) @@ -200,11 +199,6 @@ extension FollowerListTabmanViewController : CustomAlertDelegate { self?.imageArray.remove(at: self?.cellIndexPath?.row ?? 10000) self?.followerCollectionView.reloadData() } -// DeleteFollowerDataManager.shared.deleteFollowerDataManager(receivedHandle ?? "", cellHandle ?? "", { resultData in -// print(resultData.message) -// self.imageArray.remove(at: self.cellIndexPath!.row) -// self.followerCollectionView.reloadData() -// }) } func cancel() { From d689da570306d897f8b3a7d9145bf61bd3d2f076 Mon Sep 17 00:00:00 2001 From: Jungyeon Seo Date: Tue, 1 Oct 2024 02:48:37 +0900 Subject: [PATCH 13/54] =?UTF-8?q?Chore=20:=20=ED=8C=8C=EC=9D=BC=20?= =?UTF-8?q?=EC=9D=B4=EB=A6=84=20=EB=B3=80=EA=B2=BD?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../GoogleLoginDataManager.swift | 0 .../GoogleLoginModel.swift | 0 ...oller.swift => SignUpViewController.swift} | 97 ++++++++++--------- 3 files changed, 51 insertions(+), 46 deletions(-) rename pochak/pochak/UI/Login/{GoogleLoginDataManager => GoogleLogin}/GoogleLoginDataManager.swift (100%) rename pochak/pochak/UI/Login/{GoogleLoginDataManager => GoogleLogin}/GoogleLoginModel.swift (100%) rename pochak/pochak/UI/Login/{SignUp/MakeProfileViewController.swift => SignUpViewController.swift} (80%) diff --git a/pochak/pochak/UI/Login/GoogleLoginDataManager/GoogleLoginDataManager.swift b/pochak/pochak/UI/Login/GoogleLogin/GoogleLoginDataManager.swift similarity index 100% rename from pochak/pochak/UI/Login/GoogleLoginDataManager/GoogleLoginDataManager.swift rename to pochak/pochak/UI/Login/GoogleLogin/GoogleLoginDataManager.swift diff --git a/pochak/pochak/UI/Login/GoogleLoginDataManager/GoogleLoginModel.swift b/pochak/pochak/UI/Login/GoogleLogin/GoogleLoginModel.swift similarity index 100% rename from pochak/pochak/UI/Login/GoogleLoginDataManager/GoogleLoginModel.swift rename to pochak/pochak/UI/Login/GoogleLogin/GoogleLoginModel.swift diff --git a/pochak/pochak/UI/Login/SignUp/MakeProfileViewController.swift b/pochak/pochak/UI/Login/SignUpViewController.swift similarity index 80% rename from pochak/pochak/UI/Login/SignUp/MakeProfileViewController.swift rename to pochak/pochak/UI/Login/SignUpViewController.swift index 24e04171..67b38ade 100644 --- a/pochak/pochak/UI/Login/SignUp/MakeProfileViewController.swift +++ b/pochak/pochak/UI/Login/SignUpViewController.swift @@ -1,5 +1,5 @@ // -// MakeProfileViewController.swift +// SignUpViewController.swift // pochak // // Created by Seo Cindy on 2023/08/14. @@ -7,7 +7,7 @@ import UIKit -class MakeProfileViewController: UIViewController { +class SignUpViewController: UIViewController { // MARK: - Data let textViewPlaceHolder = "소개를 입력해주세요.\n(최대 50자, 3줄)" @@ -97,24 +97,26 @@ class MakeProfileViewController: UIViewController { @IBAction func checkHandleDuplication(_ sender: Any) { guard let handle = handleTextField.text else {return} - print(">>>>> checkHandleDuplication handle : \(handle)") + let request = CheckDuplicateHandleRequest(handle: handle) - // API request : Get - CheckHandleDuplicationDataManager.shared.checkHandleDuplicationDataManager(handle) { resultData in - if resultData.code == "MEMBER2001" { - // 버튼 변경 - self.checkHandleDuplicationBtn.setImage(UIImage(named: "checkedHandle"), for: .normal) - self.handleTextField.textColor = UIColor(named: "yellow00") - // 버튼 disable 시키기 - self.checkHandleDuplicationBtn.isEnabled = false - self.handleDuplicationChecked = true - } else if resultData.code == "MEMBER4002" { - // Alert 창 - self.showAlert(alertType: .confirmOnly, - titleText: "중복된 아이디입니다", - messageText: "다른 아이디를 입력해주세요.", - cancelButtonText: "", - confirmButtonText: "확인" + AuthenticationService.checkDuplicateHandle(request: request) { [weak self] data, failed in + guard let data = data else { + print(failed) + return + } + + if data.code == "MEMBER2001" { + // 중복 검사 버튼 상태 변경 + self?.checkHandleDuplicationBtn.setImage(UIImage(named: "checkedHandle"), for: .normal) + self?.handleTextField.textColor = UIColor(named: "yellow00") + self?.checkHandleDuplicationBtn.isEnabled = false + self?.handleDuplicationChecked = true + } else if data.code == "MEMBER4002" { + self?.showAlert(alertType: .confirmOnly, + titleText: "중복된 아이디입니다", + messageText: "다른 아이디를 입력해주세요.", + cancelButtonText: "", + confirmButtonText: "확인" ) } } @@ -127,10 +129,10 @@ class MakeProfileViewController: UIViewController { guard let handle = handleTextField.text else {return} guard let message = messageTextView.text else {return} guard let profileImage = profileImg.currentImage else {return} + let profileImageData: Data? = profileImg.currentImage?.jpegData(compressionQuality: 0.2) if (name == "" || handle == "" || message == textViewPlaceHolder || message == "" || profileImage == UIImage(named: "chooseProfileIcon")){ print("true!") - // Alert창 showAlert(alertType: .confirmOnly, titleText: "프로필 정보를 모두 입력해주세요.", messageText: "", @@ -145,32 +147,36 @@ class MakeProfileViewController: UIViewController { confirmButtonText: "확인") return } else { - // API request : POST - JoinDataManager.shared.joinDataManager(name, - email, - handle, - message, - socialId, - socialType, - socialRefreshToken, - profileImage, - {resultData in - - print("JoinDataManager resultData : \(resultData)") - + let request = SignUpRequest(name: name, + email: email, + handle: handle, + message: message, + socialId: socialId, + socialType: socialType) + + var files: [(Data, String, String)] = [] + if let profileImage = profileImageData { + let fileTuple: (Data, String, String) = (profileImage, "profileImage", "image/jpeg") + files.append(fileTuple) + } + + AuthenticationService.signUp(request: request, files: files) { [weak self] data, failed in + guard let data = data else { + print(failed) + return + } // 새로운 유저 정보 UserDefaults에 저장 : id / name / handle / message / IsNewMember - UserDefaultsManager.setData(value: resultData.name, key: .name) - UserDefaultsManager.setData(value: resultData.id, key: .memberId) + UserDefaultsManager.setData(value: data.result.name, key: .name) + UserDefaultsManager.setData(value: data.result.id, key: .memberId) UserDefaultsManager.setData(value: handle, key: .handle) UserDefaultsManager.setData(value: message, key: .message) - UserDefaultsManager.setData(value: resultData.isNewMember, key: .isNewMember) + UserDefaultsManager.setData(value: data.result.isNewMember, key: .isNewMember) // 유저 토큰 정보 저장 @KeyChainManager - guard let accountAccessToken = resultData.accessToken else { return } - guard let accountRefreshToken = resultData.refreshToken else { return } + guard let accountAccessToken = data.result.accessToken else { return } + guard let accountRefreshToken = data.result.refreshToken else { return } print("JoinDataManager accountAccessToken = \(accountAccessToken)") print("JoinDataManager accountRefreshToken = \(accountRefreshToken)") - do { try KeychainManager.save(account: "accessToken", value: accountAccessToken, isForce: true) try KeychainManager.save(account: "refreshToken", value: accountRefreshToken, isForce: true) @@ -179,10 +185,9 @@ class MakeProfileViewController: UIViewController { } // 회원가입 성공 시 홈 화면으로 전환 - self.toHomeTabPage() - }) + self?.toHomeTabPage() + } } - } // 프로필 사진 설정 @@ -214,7 +219,7 @@ class MakeProfileViewController: UIViewController { // MARK: - Extension // 앨범 사진 선택 프로토콜 채택 -extension MakeProfileViewController: UIImagePickerControllerDelegate, UINavigationControllerDelegate { +extension SignUpViewController: UIImagePickerControllerDelegate, UINavigationControllerDelegate { // 선택한 사진 사용 func imagePickerController(_ picker: UIImagePickerController, didFinishPickingMediaWithInfo info: [UIImagePickerController.InfoKey : Any]) { @@ -231,7 +236,7 @@ extension MakeProfileViewController: UIImagePickerControllerDelegate, UINavigati } // TextView 기본 속성 설정 -extension MakeProfileViewController: UITextViewDelegate { +extension SignUpViewController: UITextViewDelegate { func textViewDidBeginEditing(_ textView: UITextView) { if textView.text == textViewPlaceHolder { @@ -292,7 +297,7 @@ extension MakeProfileViewController: UITextViewDelegate { } } -extension MakeProfileViewController : UITextFieldDelegate { +extension SignUpViewController : UITextFieldDelegate { func textField(_ textField: UITextField, shouldChangeCharactersIn range: NSRange, replacementString string: String) -> Bool { let utf8Char = string.cString(using: .utf8) let isBackSpace = strcmp(utf8Char, "\\b") @@ -304,7 +309,7 @@ extension MakeProfileViewController : UITextFieldDelegate { } // Alert 창 -extension MakeProfileViewController : CustomAlertDelegate { +extension SignUpViewController : CustomAlertDelegate { func cancel() { if backBtnPressed { self.navigationController?.popViewController(animated: true) From fcd4de3bd9d097976f8a4a6e9869eeeb5f30d411 Mon Sep 17 00:00:00 2001 From: Jungyeon Seo Date: Tue, 1 Oct 2024 02:49:31 +0900 Subject: [PATCH 14/54] =?UTF-8?q?Refactor=20:=20=ED=95=B8=EB=93=A4=20?= =?UTF-8?q?=EC=A4=91=EB=B3=B5=20=EA=B2=80=EC=82=AC=20api?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- pochak/pochak.xcodeproj/project.pbxproj | 74 ++++++++----------- .../CheckDuplicateHandleAPI.swift | 36 +++++++++ .../APIs/Authentication/SignUpAPI.swift | 36 +++++++++ .../CheckDuplicateHandleRequest.swift | 12 +++ .../CheckDuplicateHandleResponse.swift | 14 ++++ .../Services/AuthenticationService.swift | 19 +++++ .../CheckHandleDuplicationDataManager.swift | 34 --------- .../CheckHandleDuplicationDataModel.swift | 14 ---- .../Profile/UpdateProfileViewController.swift | 1 + 9 files changed, 149 insertions(+), 91 deletions(-) create mode 100644 pochak/pochak/Network/APIs/Authentication/CheckDuplicateHandleAPI.swift create mode 100644 pochak/pochak/Network/APIs/Authentication/SignUpAPI.swift create mode 100644 pochak/pochak/Network/Models/Authentication/CheckDuplicateHandleRequest.swift create mode 100644 pochak/pochak/Network/Models/Authentication/CheckDuplicateHandleResponse.swift delete mode 100644 pochak/pochak/UI/Login/SignUp/CheckHandle/CheckHandleDuplicationDataManager.swift delete mode 100644 pochak/pochak/UI/Login/SignUp/CheckHandle/CheckHandleDuplicationDataModel.swift diff --git a/pochak/pochak.xcodeproj/project.pbxproj b/pochak/pochak.xcodeproj/project.pbxproj index 13e6697d..eef59c63 100644 --- a/pochak/pochak.xcodeproj/project.pbxproj +++ b/pochak/pochak.xcodeproj/project.pbxproj @@ -103,12 +103,10 @@ 371D33782B4E83E90084FF6A /* UserDefaultsManager.swift in Sources */ = {isa = PBXBuildFile; fileRef = 371D33772B4E83E90084FF6A /* UserDefaultsManager.swift */; }; 371D337A2B4E8D1F0084FF6A /* KeychainManager.swift in Sources */ = {isa = PBXBuildFile; fileRef = 371D33792B4E8D1F0084FF6A /* KeychainManager.swift */; }; 373815162A89E6D30032066A /* SocialJoinViewController.swift in Sources */ = {isa = PBXBuildFile; fileRef = 373815152A89E6D30032066A /* SocialJoinViewController.swift */; }; - 3738151A2A8A09DA0032066A /* MakeProfileViewController.swift in Sources */ = {isa = PBXBuildFile; fileRef = 373815192A8A09DA0032066A /* MakeProfileViewController.swift */; }; + 3738151A2A8A09DA0032066A /* SignUpViewController.swift in Sources */ = {isa = PBXBuildFile; fileRef = 373815192A8A09DA0032066A /* SignUpViewController.swift */; }; 374261642C2FEF5F00B67886 /* ProfileMenuViewController.swift in Sources */ = {isa = PBXBuildFile; fileRef = 374261632C2FEF5F00B67886 /* ProfileMenuViewController.swift */; }; 374261782C31C6ED00B67886 /* AppleLoginDataManager.swift in Sources */ = {isa = PBXBuildFile; fileRef = 374261772C31C6ED00B67886 /* AppleLoginDataManager.swift */; }; 3742617A2C31C6F900B67886 /* AppleLoginDataModel.swift in Sources */ = {isa = PBXBuildFile; fileRef = 374261792C31C6F900B67886 /* AppleLoginDataModel.swift */; }; - 3742617D2C359D6100B67886 /* CheckHandleDuplicationDataManager.swift in Sources */ = {isa = PBXBuildFile; fileRef = 3742617C2C359D6100B67886 /* CheckHandleDuplicationDataManager.swift */; }; - 3742617F2C359D6D00B67886 /* CheckHandleDuplicationDataModel.swift in Sources */ = {isa = PBXBuildFile; fileRef = 3742617E2C359D6D00B67886 /* CheckHandleDuplicationDataModel.swift */; }; 3747E9722BF3827500364BED /* SettingsViewController.swift in Sources */ = {isa = PBXBuildFile; fileRef = 3747E9712BF3827500364BED /* SettingsViewController.swift */; }; 374E461F2CAABAF3008AE361 /* PochakPostRetrievalAPI.swift in Sources */ = {isa = PBXBuildFile; fileRef = 374E461E2CAABAF3008AE361 /* PochakPostRetrievalAPI.swift */; }; 374E46232CAABB31008AE361 /* PochakPostRetrievalResponse.swift in Sources */ = {isa = PBXBuildFile; fileRef = 374E46222CAABB31008AE361 /* PochakPostRetrievalResponse.swift */; }; @@ -135,6 +133,12 @@ 3759CF372CAAE79F00408A4E /* FollowingRetrievalAPI.swift in Sources */ = {isa = PBXBuildFile; fileRef = 3759CF362CAAE79F00408A4E /* FollowingRetrievalAPI.swift */; }; 3759CF392CAAE7E900408A4E /* FollowListRequest.swift in Sources */ = {isa = PBXBuildFile; fileRef = 3759CF382CAAE7E900408A4E /* FollowListRequest.swift */; }; 3759CF3B2CAAE80700408A4E /* FollowListResponse.swift in Sources */ = {isa = PBXBuildFile; fileRef = 3759CF3A2CAAE80700408A4E /* FollowListResponse.swift */; }; + 3759CF3F2CAB145500408A4E /* CheckDuplicateHandleAPI.swift in Sources */ = {isa = PBXBuildFile; fileRef = 3759CF3E2CAB145500408A4E /* CheckDuplicateHandleAPI.swift */; }; + 3759CF412CAB150500408A4E /* CheckDuplicateHandleRequest.swift in Sources */ = {isa = PBXBuildFile; fileRef = 3759CF402CAB150500408A4E /* CheckDuplicateHandleRequest.swift */; }; + 3759CF432CAB152200408A4E /* CheckDuplicateHandleResponse.swift in Sources */ = {isa = PBXBuildFile; fileRef = 3759CF422CAB152200408A4E /* CheckDuplicateHandleResponse.swift */; }; + 3759CF452CAB16E600408A4E /* SignUpAPI.swift in Sources */ = {isa = PBXBuildFile; fileRef = 3759CF442CAB16E600408A4E /* SignUpAPI.swift */; }; + 3759CF492CAB178800408A4E /* SignUpRequest.swift in Sources */ = {isa = PBXBuildFile; fileRef = 3759CF482CAB178800408A4E /* SignUpRequest.swift */; }; + 3759CF4B2CAB179100408A4E /* SignUpResponse.swift in Sources */ = {isa = PBXBuildFile; fileRef = 3759CF4A2CAB179100408A4E /* SignUpResponse.swift */; }; 3766F4022C3706DC001DD239 /* BlockedUserTableViewCell.xib in Resources */ = {isa = PBXBuildFile; fileRef = 3766F4012C3706DC001DD239 /* BlockedUserTableViewCell.xib */; }; 3766F4032C3706DC001DD239 /* BlockedUserTableViewCell.swift in Sources */ = {isa = PBXBuildFile; fileRef = 3766F4002C3706DC001DD239 /* BlockedUserTableViewCell.swift */; }; 3766F40A2C370CF5001DD239 /* BlockedUserViewController.swift in Sources */ = {isa = PBXBuildFile; fileRef = 3766F4092C370CF5001DD239 /* BlockedUserViewController.swift */; }; @@ -143,8 +147,6 @@ 3766F4132C3A69E5001DD239 /* TermsOfAgreeViewController.swift in Sources */ = {isa = PBXBuildFile; fileRef = 3766F4122C3A69E5001DD239 /* TermsOfAgreeViewController.swift */; }; 3769D6AF2B3C2FD500294CD1 /* GoogleLoginDataManager.swift in Sources */ = {isa = PBXBuildFile; fileRef = 3769D6AE2B3C2FD500294CD1 /* GoogleLoginDataManager.swift */; }; 3769D6B22B3C300D00294CD1 /* GoogleLoginModel.swift in Sources */ = {isa = PBXBuildFile; fileRef = 3769D6B12B3C300D00294CD1 /* GoogleLoginModel.swift */; }; - 3769D6B42B3C301B00294CD1 /* JoinDataManager.swift in Sources */ = {isa = PBXBuildFile; fileRef = 3769D6B32B3C301B00294CD1 /* JoinDataManager.swift */; }; - 3769D6B62B3C302C00294CD1 /* JoinDataModel.swift in Sources */ = {isa = PBXBuildFile; fileRef = 3769D6B52B3C302C00294CD1 /* JoinDataModel.swift */; }; 3769D6B92B3C345800294CD1 /* MyProfileTabViewController.swift in Sources */ = {isa = PBXBuildFile; fileRef = 3769D6B82B3C345800294CD1 /* MyProfileTabViewController.swift */; }; 3769D6BB2B3C347000294CD1 /* FollowListViewController.swift in Sources */ = {isa = PBXBuildFile; fileRef = 3769D6BA2B3C347000294CD1 /* FollowListViewController.swift */; }; 3769D6BD2B3C348800294CD1 /* FollowerListTabmanViewController.swift in Sources */ = {isa = PBXBuildFile; fileRef = 3769D6BC2B3C348800294CD1 /* FollowerListTabmanViewController.swift */; }; @@ -162,7 +164,6 @@ 376EA12C2CAAAE5600FEFB63 /* ProfileRetrievalResponse.swift in Sources */ = {isa = PBXBuildFile; fileRef = 376EA12B2CAAAE5600FEFB63 /* ProfileRetrievalResponse.swift */; }; 376EA12E2CAAAE6800FEFB63 /* ProfileRetrievalRequest.swift in Sources */ = {isa = PBXBuildFile; fileRef = 376EA12D2CAAAE6800FEFB63 /* ProfileRetrievalRequest.swift */; }; 376EA1302CAAAF6900FEFB63 /* ProfileService.swift in Sources */ = {isa = PBXBuildFile; fileRef = 376EA12F2CAAAF6900FEFB63 /* ProfileService.swift */; }; - 376F125B2A8B7440005F469B /* SocialLoginViewController.swift in Sources */ = {isa = PBXBuildFile; fileRef = 376F125A2A8B7440005F469B /* SocialLoginViewController.swift */; }; 379A6A342B569DFA0087FAAC /* AuthenticationCredential.swift in Sources */ = {isa = PBXBuildFile; fileRef = 379A6A332B569DFA0087FAAC /* AuthenticationCredential.swift */; }; 379A6A3A2B56BDBF0087FAAC /* Authenticator.swift in Sources */ = {isa = PBXBuildFile; fileRef = 379A6A392B56BDBF0087FAAC /* Authenticator.swift */; }; 379A6A3E2B5FA07D0087FAAC /* NavigationController.swift in Sources */ = {isa = PBXBuildFile; fileRef = 379A6A3D2B5FA07D0087FAAC /* NavigationController.swift */; }; @@ -347,13 +348,11 @@ 371D33772B4E83E90084FF6A /* UserDefaultsManager.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = UserDefaultsManager.swift; sourceTree = ""; }; 371D33792B4E8D1F0084FF6A /* KeychainManager.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = KeychainManager.swift; sourceTree = ""; }; 373815152A89E6D30032066A /* SocialJoinViewController.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = SocialJoinViewController.swift; sourceTree = ""; }; - 373815192A8A09DA0032066A /* MakeProfileViewController.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = MakeProfileViewController.swift; sourceTree = ""; }; + 373815192A8A09DA0032066A /* SignUpViewController.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = SignUpViewController.swift; sourceTree = ""; }; 374261632C2FEF5F00B67886 /* ProfileMenuViewController.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = ProfileMenuViewController.swift; sourceTree = ""; }; 374261752C31C23800B67886 /* pochakDebug.entitlements */ = {isa = PBXFileReference; lastKnownFileType = text.plist.entitlements; path = pochakDebug.entitlements; sourceTree = ""; }; 374261772C31C6ED00B67886 /* AppleLoginDataManager.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = AppleLoginDataManager.swift; sourceTree = ""; }; 374261792C31C6F900B67886 /* AppleLoginDataModel.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = AppleLoginDataModel.swift; sourceTree = ""; }; - 3742617C2C359D6100B67886 /* CheckHandleDuplicationDataManager.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = CheckHandleDuplicationDataManager.swift; sourceTree = ""; }; - 3742617E2C359D6D00B67886 /* CheckHandleDuplicationDataModel.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = CheckHandleDuplicationDataModel.swift; sourceTree = ""; }; 3747E9712BF3827500364BED /* SettingsViewController.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = SettingsViewController.swift; sourceTree = ""; }; 374E461E2CAABAF3008AE361 /* PochakPostRetrievalAPI.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = PochakPostRetrievalAPI.swift; sourceTree = ""; }; 374E46222CAABB31008AE361 /* PochakPostRetrievalResponse.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = PochakPostRetrievalResponse.swift; sourceTree = ""; }; @@ -381,6 +380,12 @@ 3759CF362CAAE79F00408A4E /* FollowingRetrievalAPI.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = FollowingRetrievalAPI.swift; sourceTree = ""; }; 3759CF382CAAE7E900408A4E /* FollowListRequest.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = FollowListRequest.swift; sourceTree = ""; }; 3759CF3A2CAAE80700408A4E /* FollowListResponse.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = FollowListResponse.swift; sourceTree = ""; }; + 3759CF3E2CAB145500408A4E /* CheckDuplicateHandleAPI.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = CheckDuplicateHandleAPI.swift; sourceTree = ""; }; + 3759CF402CAB150500408A4E /* CheckDuplicateHandleRequest.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = CheckDuplicateHandleRequest.swift; sourceTree = ""; }; + 3759CF422CAB152200408A4E /* CheckDuplicateHandleResponse.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = CheckDuplicateHandleResponse.swift; sourceTree = ""; }; + 3759CF442CAB16E600408A4E /* SignUpAPI.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = SignUpAPI.swift; sourceTree = ""; }; + 3759CF482CAB178800408A4E /* SignUpRequest.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = SignUpRequest.swift; sourceTree = ""; }; + 3759CF4A2CAB179100408A4E /* SignUpResponse.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = SignUpResponse.swift; sourceTree = ""; }; 3766F4002C3706DC001DD239 /* BlockedUserTableViewCell.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = BlockedUserTableViewCell.swift; sourceTree = ""; }; 3766F4012C3706DC001DD239 /* BlockedUserTableViewCell.xib */ = {isa = PBXFileReference; lastKnownFileType = file.xib; path = BlockedUserTableViewCell.xib; sourceTree = ""; }; 3766F4092C370CF5001DD239 /* BlockedUserViewController.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = BlockedUserViewController.swift; sourceTree = ""; }; @@ -389,8 +394,6 @@ 3766F4122C3A69E5001DD239 /* TermsOfAgreeViewController.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = TermsOfAgreeViewController.swift; sourceTree = ""; }; 3769D6AE2B3C2FD500294CD1 /* GoogleLoginDataManager.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = GoogleLoginDataManager.swift; sourceTree = ""; }; 3769D6B12B3C300D00294CD1 /* GoogleLoginModel.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = GoogleLoginModel.swift; sourceTree = ""; }; - 3769D6B32B3C301B00294CD1 /* JoinDataManager.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = JoinDataManager.swift; sourceTree = ""; }; - 3769D6B52B3C302C00294CD1 /* JoinDataModel.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = JoinDataModel.swift; sourceTree = ""; }; 3769D6B82B3C345800294CD1 /* MyProfileTabViewController.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = MyProfileTabViewController.swift; sourceTree = ""; }; 3769D6BA2B3C347000294CD1 /* FollowListViewController.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = FollowListViewController.swift; sourceTree = ""; }; 3769D6BC2B3C348800294CD1 /* FollowerListTabmanViewController.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = FollowerListTabmanViewController.swift; sourceTree = ""; }; @@ -408,7 +411,6 @@ 376EA12B2CAAAE5600FEFB63 /* ProfileRetrievalResponse.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = ProfileRetrievalResponse.swift; sourceTree = ""; }; 376EA12D2CAAAE6800FEFB63 /* ProfileRetrievalRequest.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = ProfileRetrievalRequest.swift; sourceTree = ""; }; 376EA12F2CAAAF6900FEFB63 /* ProfileService.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = ProfileService.swift; sourceTree = ""; }; - 376F125A2A8B7440005F469B /* SocialLoginViewController.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = SocialLoginViewController.swift; sourceTree = ""; }; 379A6A332B569DFA0087FAAC /* AuthenticationCredential.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = AuthenticationCredential.swift; sourceTree = ""; }; 379A6A392B56BDBF0087FAAC /* Authenticator.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = Authenticator.swift; sourceTree = ""; }; 379A6A3D2B5FA07D0087FAAC /* NavigationController.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = NavigationController.swift; sourceTree = ""; }; @@ -874,10 +876,9 @@ EAAACDB42A5168280041B1B9 /* Login.storyboard */, 373815152A89E6D30032066A /* SocialJoinViewController.swift */, 3766F4122C3A69E5001DD239 /* TermsOfAgreeViewController.swift */, - 376F125A2A8B7440005F469B /* SocialLoginViewController.swift */, + 373815192A8A09DA0032066A /* SignUpViewController.swift */, 374261762C31C6CD00B67886 /* AppleLogin */, - 3769D6AD2B3C2FA800294CD1 /* GoogleLoginDataManager */, - 3769D6AC2B3C2F9900294CD1 /* SignUp */, + 3769D6AD2B3C2FA800294CD1 /* GoogleLogin */, ); path = Login; sourceTree = ""; @@ -891,20 +892,15 @@ path = AppleLogin; sourceTree = ""; }; - 3742617B2C359D3700B67886 /* CheckHandle */ = { - isa = PBXGroup; - children = ( - 3742617C2C359D6100B67886 /* CheckHandleDuplicationDataManager.swift */, - 3742617E2C359D6D00B67886 /* CheckHandleDuplicationDataModel.swift */, - ); - path = CheckHandle; - sourceTree = ""; - }; 374E462E2CAAC3CB008AE361 /* Authentication */ = { isa = PBXGroup; children = ( + 3759CF482CAB178800408A4E /* SignUpRequest.swift */, + 3759CF4A2CAB179100408A4E /* SignUpResponse.swift */, 374E462F2CAAC3F6008AE361 /* SignOutResponse.swift */, 374E46382CAAC646008AE361 /* LogOutResponse.swift */, + 3759CF402CAB150500408A4E /* CheckDuplicateHandleRequest.swift */, + 3759CF422CAB152200408A4E /* CheckDuplicateHandleResponse.swift */, ); path = Authentication; sourceTree = ""; @@ -912,8 +908,10 @@ 374E46332CAAC437008AE361 /* Authentication */ = { isa = PBXGroup; children = ( + 3759CF442CAB16E600408A4E /* SignUpAPI.swift */, 374E46342CAAC445008AE361 /* SignOutAPI.swift */, 374E46362CAAC602008AE361 /* LogOutAPI.swift */, + 3759CF3E2CAB145500408A4E /* CheckDuplicateHandleAPI.swift */, ); path = Authentication; sourceTree = ""; @@ -936,24 +934,13 @@ path = BlockList; sourceTree = ""; }; - 3769D6AC2B3C2F9900294CD1 /* SignUp */ = { - isa = PBXGroup; - children = ( - 3742617B2C359D3700B67886 /* CheckHandle */, - 373815192A8A09DA0032066A /* MakeProfileViewController.swift */, - 3769D6B32B3C301B00294CD1 /* JoinDataManager.swift */, - 3769D6B52B3C302C00294CD1 /* JoinDataModel.swift */, - ); - path = SignUp; - sourceTree = ""; - }; - 3769D6AD2B3C2FA800294CD1 /* GoogleLoginDataManager */ = { + 3769D6AD2B3C2FA800294CD1 /* GoogleLogin */ = { isa = PBXGroup; children = ( 3769D6AE2B3C2FD500294CD1 /* GoogleLoginDataManager.swift */, 3769D6B12B3C300D00294CD1 /* GoogleLoginModel.swift */, ); - path = GoogleLoginDataManager; + path = GoogleLogin; sourceTree = ""; }; 3769D6B72B3C342900294CD1 /* Profile */ = { @@ -1622,6 +1609,7 @@ EA7EE1D82BF38921009486CC /* PochakAlarmTableViewCell.swift in Sources */, 376EA1302CAAAF6900FEFB63 /* ProfileService.swift in Sources */, EA01079E2A59556800A3AE85 /* PostViewController.swift in Sources */, + 3759CF432CAB152200408A4E /* CheckDuplicateHandleResponse.swift in Sources */, 3766F40F2C398AA8001DD239 /* NetworkResult400.swift in Sources */, 0822A0532CA1983100F87E2C /* ExploreRequest.swift in Sources */, 3769D6AF2B3C2FD500294CD1 /* GoogleLoginDataManager.swift in Sources */, @@ -1685,7 +1673,6 @@ 374E463D2CAAC82E008AE361 /* BlockResponse.swift in Sources */, 3759CF3B2CAAE80700408A4E /* FollowListResponse.swift in Sources */, EA2CD63B2C5F463700644EFE /* NetworkService.swift in Sources */, - 3742617D2C359D6100B67886 /* CheckHandleDuplicationDataManager.swift in Sources */, 371D33782B4E83E90084FF6A /* UserDefaultsManager.swift in Sources */, 3742617A2C31C6F900B67886 /* AppleLoginDataModel.swift in Sources */, 373815162A89E6D30032066A /* SocialJoinViewController.swift in Sources */, @@ -1701,7 +1688,7 @@ 0822A0472CA197E700F87E2C /* PostLikeAPI.swift in Sources */, 374E46432CAAC9B5008AE361 /* UnblockResponse.swift in Sources */, 37A284C12B52FC910023EB9D /* UpdateProfileViewController.swift in Sources */, - 3738151A2A8A09DA0032066A /* MakeProfileViewController.swift in Sources */, + 3738151A2A8A09DA0032066A /* SignUpViewController.swift in Sources */, 0822A0442CA197E700F87E2C /* CommentDeleteAPI.swift in Sources */, EA17182B2A5912A7009168E6 /* CameraViewController.swift in Sources */, 374E46412CAAC9AE008AE361 /* UnblockRequest.swift in Sources */, @@ -1715,7 +1702,6 @@ 3769D6D52B3C59F900294CD1 /* ProfilePostCollectionViewCell.swift in Sources */, 376EA12E2CAAAE6800FEFB63 /* ProfileRetrievalRequest.swift in Sources */, EA96D0562C8F192B00D80562 /* TagApproveResponse.swift in Sources */, - 3769D6B62B3C302C00294CD1 /* JoinDataModel.swift in Sources */, 374E461F2CAABAF3008AE361 /* PochakPostRetrievalAPI.swift in Sources */, 084AF4C72A5D831100C6454A /* HomeCollectionViewCell.swift in Sources */, 08C02EF82BF394B800627C21 /* UIAlertController+.swift in Sources */, @@ -1740,19 +1726,21 @@ EA7E14612C858EC6001DA769 /* CameraService.swift in Sources */, EA6306D82C2BFE53000DB0A7 /* CustomTabBarController.swift in Sources */, 0822A06A2CA1983C00F87E2C /* PostLikeResponse.swift in Sources */, + 3759CF492CAB178800408A4E /* SignUpRequest.swift in Sources */, 0820B1902A63A18100604DA8 /* ReplyTableViewCell.swift in Sources */, 374E46392CAAC646008AE361 /* LogOutResponse.swift in Sources */, 083249782C295E4000A77C03 /* CustomAlertViewController.swift in Sources */, 374E46252CAABE08008AE361 /* ProfileUpdateResponse.swift in Sources */, 0822A04F2CA1980200F87E2C /* FollowAPI.swift in Sources */, EA2CD6392C5F45E300644EFE /* BaseAPI.swift in Sources */, + 3759CF4B2CAB179100408A4E /* SignUpResponse.swift in Sources */, 374E46302CAAC3F6008AE361 /* SignOutResponse.swift in Sources */, - 376F125B2A8B7440005F469B /* SocialLoginViewController.swift in Sources */, EA4EF8D82C2EC5F7009549FF /* UITextField+.swift in Sources */, EAF918512AA468670037C270 /* APIConstants.swift in Sources */, 0822A0322CA196DF00F87E2C /* RecentSearchModel.swift in Sources */, 0822A06D2CA1983C00F87E2C /* CommentPostRequest.swift in Sources */, 0822A0692CA1983C00F87E2C /* PostReportRequest.swift in Sources */, + 3759CF412CAB150500408A4E /* CheckDuplicateHandleRequest.swift in Sources */, 3769D6BD2B3C348800294CD1 /* FollowerListTabmanViewController.swift in Sources */, 0822A0672CA1983C00F87E2C /* SearchResponse.swift in Sources */, EA1B0B5B2A49D23A00F86FBC /* AppDelegate.swift in Sources */, @@ -1773,20 +1761,20 @@ 0822A06C2CA1983C00F87E2C /* CommentGetResponse.swift in Sources */, 3769D6D02B3C569C00294CD1 /* PochakedPostTabmanViewController.swift in Sources */, 374261642C2FEF5F00B67886 /* ProfileMenuViewController.swift in Sources */, - 3742617F2C359D6D00B67886 /* CheckHandleDuplicationDataModel.swift in Sources */, 3759CF372CAAE79F00408A4E /* FollowingRetrievalAPI.swift in Sources */, EAC582742C3074EA006F44AF /* UIColor+.swift in Sources */, 3769D6BB2B3C347000294CD1 /* FollowListViewController.swift in Sources */, - 3769D6B42B3C301B00294CD1 /* JoinDataManager.swift in Sources */, 376EA1292CAAADCF00FEFB63 /* ProfileRetrievalAPI.swift in Sources */, EA96D0522C8F186900D80562 /* TagApproveAPI.swift in Sources */, 0822A07B2CA1992B00F87E2C /* PostService.swift in Sources */, + 3759CF452CAB16E600408A4E /* SignUpAPI.swift in Sources */, EA1B0B5D2A49D23A00F86FBC /* SceneDelegate.swift in Sources */, 3747E9722BF3827500364BED /* SettingsViewController.swift in Sources */, 3769D6D22B3C56F100294CD1 /* PochakPostTabmanViewController.swift in Sources */, 371D337A2B4E8D1F0084FF6A /* KeychainManager.swift in Sources */, EAF918542AA4692E0037C270 /* NetworkResult.swift in Sources */, 0822A07D2CA19A9A00F87E2C /* UICommentModel.swift in Sources */, + 3759CF3F2CAB145500408A4E /* CheckDuplicateHandleAPI.swift in Sources */, 374E462B2CAABF7B008AE361 /* ProfileUpdateRequest.swift in Sources */, EA7E146D2C8EA119001DA769 /* AlarmListResponse.swift in Sources */, 08EB99B42C53D76C00FAC08A /* UIScrollView+.swift in Sources */, diff --git a/pochak/pochak/Network/APIs/Authentication/CheckDuplicateHandleAPI.swift b/pochak/pochak/Network/APIs/Authentication/CheckDuplicateHandleAPI.swift new file mode 100644 index 00000000..3203170b --- /dev/null +++ b/pochak/pochak/Network/APIs/Authentication/CheckDuplicateHandleAPI.swift @@ -0,0 +1,36 @@ +// +// CheckDuplicateHandleAPI.swift +// pochak +// +// Created by Seo Cindy on 10/1/24. +// + +import Foundation +import Alamofire + +enum CheckDuplicateHandleAPI { + case checkDuplicateHandle(CheckDuplicateHandleRequest) +} + +extension CheckDuplicateHandleAPI: BaseAPI { + + typealias Response = CheckDuplicateHandleResponse + + var method: HTTPMethod { + switch self { + case .checkDuplicateHandle: return .get + } + } + + var path: String { + switch self { + case .checkDuplicateHandle: return "/v2/members/duplicate" + } + } + + var parameters: RequestParams? { + switch self { + case .checkDuplicateHandle(let request): return .query(request) + } + } +} diff --git a/pochak/pochak/Network/APIs/Authentication/SignUpAPI.swift b/pochak/pochak/Network/APIs/Authentication/SignUpAPI.swift new file mode 100644 index 00000000..8280a91a --- /dev/null +++ b/pochak/pochak/Network/APIs/Authentication/SignUpAPI.swift @@ -0,0 +1,36 @@ +// +// SignUpAPI.swift +// pochak +// +// Created by Seo Cindy on 10/1/24. +// + +import Foundation +import Alamofire + +enum SignUpAPI { + case signUp(SignUpRequest) +} + +extension SignUpAPI: BaseAPI { + + typealias Response = SignUpResponse + + var method: HTTPMethod { + switch self { + case .signUp: return .post + } + } + + var path: String { + switch self { + case .signUp: return "/v2/signUp" + } + } + + var parameters: RequestParams? { + switch self { + case .signUp(let request): return .body(request) + } + } +} diff --git a/pochak/pochak/Network/Models/Authentication/CheckDuplicateHandleRequest.swift b/pochak/pochak/Network/Models/Authentication/CheckDuplicateHandleRequest.swift new file mode 100644 index 00000000..7734e6cd --- /dev/null +++ b/pochak/pochak/Network/Models/Authentication/CheckDuplicateHandleRequest.swift @@ -0,0 +1,12 @@ +// +// CheckDuplicateHandleRequest.swift +// pochak +// +// Created by Seo Cindy on 10/1/24. +// + +import Foundation + +struct CheckDuplicateHandleRequest : Codable { + let handle: String +} diff --git a/pochak/pochak/Network/Models/Authentication/CheckDuplicateHandleResponse.swift b/pochak/pochak/Network/Models/Authentication/CheckDuplicateHandleResponse.swift new file mode 100644 index 00000000..0d108b3d --- /dev/null +++ b/pochak/pochak/Network/Models/Authentication/CheckDuplicateHandleResponse.swift @@ -0,0 +1,14 @@ +// +// CheckDuplicateHandleResponse.swift +// pochak +// +// Created by Seo Cindy on 10/1/24. +// + +import Foundation + +struct CheckDuplicateHandleResponse: Codable { + let isSuccess: Bool + let code: String + let message: String +} diff --git a/pochak/pochak/Network/Services/AuthenticationService.swift b/pochak/pochak/Network/Services/AuthenticationService.swift index b496a938..cb9397cc 100644 --- a/pochak/pochak/Network/Services/AuthenticationService.swift +++ b/pochak/pochak/Network/Services/AuthenticationService.swift @@ -40,4 +40,23 @@ struct AuthenticationService { } } } + + /// 핸들 중복 검사 + /// - Parameters: + /// - request : 중복검사하고자 하는 핸들 + /// - completion: 통신 후 핸들러 (뷰컨트롤러) + static func checkDuplicateHandle( + request: CheckDuplicateHandleRequest, + completion: @escaping (_ succeed: CheckDuplicateHandleResponse?, _ failed: NetworkError?) -> Void) { + NetworkService.shared.request(CheckDuplicateHandleAPI.checkDuplicateHandle(request)) { response in + switch response { + case .success(let data): + completion(data, nil) + case .failure(let error): + print("=== checkDuplicateHandle service error ===") + print(error.localizedDescription) + completion(nil, error) + } + } + } } diff --git a/pochak/pochak/UI/Login/SignUp/CheckHandle/CheckHandleDuplicationDataManager.swift b/pochak/pochak/UI/Login/SignUp/CheckHandle/CheckHandleDuplicationDataManager.swift deleted file mode 100644 index 4332829d..00000000 --- a/pochak/pochak/UI/Login/SignUp/CheckHandle/CheckHandleDuplicationDataManager.swift +++ /dev/null @@ -1,34 +0,0 @@ -// -// CheckHandleDuplicationDataManager.swift -// pochak -// -// Created by Seo Cindy on 7/3/24. -// - -import Foundation -import Alamofire - -class CheckHandleDuplicationDataManager{ - - static let shared = CheckHandleDuplicationDataManager() - - func checkHandleDuplicationDataManager(_ handle : String, _ completion: @escaping (CheckHandleDuplicationResponse) -> Void) { - let url = "\(APIConstants.baseURL)/api/v2/members/duplicate?handle=\(handle)" - - print("url ; \(url)") - AF.request(url, method: .get).validate().responseDecodable(of: CheckHandleDuplicationResponse.self) { response in - switch response.result { - case .success(let result): - let resultData = result - print(result) - completion(resultData) - case .failure(let error): - print("checkHandleDuplicationDataManager error : \(error)") - if let data = response.data, let errorMessage = String(data: data, encoding: .utf8) { - print("Failure Data: \(errorMessage)") - } - } - } - } -} - diff --git a/pochak/pochak/UI/Login/SignUp/CheckHandle/CheckHandleDuplicationDataModel.swift b/pochak/pochak/UI/Login/SignUp/CheckHandle/CheckHandleDuplicationDataModel.swift deleted file mode 100644 index 67c377be..00000000 --- a/pochak/pochak/UI/Login/SignUp/CheckHandle/CheckHandleDuplicationDataModel.swift +++ /dev/null @@ -1,14 +0,0 @@ -// -// CheckHandleDuplicationDataModel.swift -// pochak -// -// Created by Seo Cindy on 7/3/24. -// - -import Foundation - -struct CheckHandleDuplicationResponse: Codable { - let isSuccess: Bool - let code: String - let message: String -} diff --git a/pochak/pochak/UI/Profile/UpdateProfileViewController.swift b/pochak/pochak/UI/Profile/UpdateProfileViewController.swift index 45e14523..5cf9b008 100644 --- a/pochak/pochak/UI/Profile/UpdateProfileViewController.swift +++ b/pochak/pochak/UI/Profile/UpdateProfileViewController.swift @@ -41,6 +41,7 @@ class UpdateProfileViewController: UIViewController { guard let name = nameTextField.text else {return} guard let message = messageTextView.text else {return} let profileImage: Data? = profileImg.image?.jpegData(compressionQuality: 0.2) + let request = ProfileUpdateRequest(name: name, message: message) var files: [(Data, String, String)] = [] if let profileImage = profileImage { From 3b7f802295a693d353a61704455bb56323c2566c Mon Sep 17 00:00:00 2001 From: Jungyeon Seo Date: Tue, 1 Oct 2024 02:50:24 +0900 Subject: [PATCH 15/54] Refactor : signup API --- .../Models/Authentication/SignUpRequest.swift | 17 +++ .../Authentication/SignUpResponse.swift} | 12 +- .../Services/AuthenticationService.swift | 20 +++ .../UI/Login/SignUp/JoinDataManager.swift | 72 ---------- .../UI/Login/SocialJoinViewController.swift | 8 +- .../UI/Login/SocialLoginViewController.swift | 128 ------------------ 6 files changed, 48 insertions(+), 209 deletions(-) create mode 100644 pochak/pochak/Network/Models/Authentication/SignUpRequest.swift rename pochak/pochak/{UI/Login/SignUp/JoinDataModel.swift => Network/Models/Authentication/SignUpResponse.swift} (63%) delete mode 100644 pochak/pochak/UI/Login/SignUp/JoinDataManager.swift delete mode 100644 pochak/pochak/UI/Login/SocialLoginViewController.swift diff --git a/pochak/pochak/Network/Models/Authentication/SignUpRequest.swift b/pochak/pochak/Network/Models/Authentication/SignUpRequest.swift new file mode 100644 index 00000000..141c6ee5 --- /dev/null +++ b/pochak/pochak/Network/Models/Authentication/SignUpRequest.swift @@ -0,0 +1,17 @@ +// +// SignUpRequest.swift +// pochak +// +// Created by Seo Cindy on 10/1/24. +// + +import Foundation + +struct SignUpRequest : Codable { + let name: String + let email: String + let handle: String + let message: String + let socialId: String + let socialType: String +} diff --git a/pochak/pochak/UI/Login/SignUp/JoinDataModel.swift b/pochak/pochak/Network/Models/Authentication/SignUpResponse.swift similarity index 63% rename from pochak/pochak/UI/Login/SignUp/JoinDataModel.swift rename to pochak/pochak/Network/Models/Authentication/SignUpResponse.swift index 199a6939..a787a48b 100644 --- a/pochak/pochak/UI/Login/SignUp/JoinDataModel.swift +++ b/pochak/pochak/Network/Models/Authentication/SignUpResponse.swift @@ -1,18 +1,20 @@ // -// JoinDataModel.swift +// SignUpResponse.swift // pochak // -// Created by Seo Cindy on 12/27/23. +// Created by Seo Cindy on 10/1/24. // -struct JoinAPIResponse: Codable { +import Foundation + +struct SignUpResponse: Codable { let isSuccess: Bool let code: String let message: String - let result: JoinDataModel + let result: SignUpResult } -struct JoinDataModel : Codable { +struct SignUpResult : Codable { var id : Int? var socialId : String? var name : String? diff --git a/pochak/pochak/Network/Services/AuthenticationService.swift b/pochak/pochak/Network/Services/AuthenticationService.swift index cb9397cc..7d61b707 100644 --- a/pochak/pochak/Network/Services/AuthenticationService.swift +++ b/pochak/pochak/Network/Services/AuthenticationService.swift @@ -9,6 +9,26 @@ import Foundation struct AuthenticationService { + /// - Parameters: + /// - request: 가입하는 유저의 name, email, handle, message, socialId, socialType 정보 + /// - files : 프로필 이미지 + /// - completion: 통신 후 핸들러 (뷰컨트롤러에 있음) + static func signUp( + request: SignUpRequest, + files: [(Data, String, String)], + completion: @escaping (_ succeed: SignUpResponse?, _ failed: NetworkError?) -> Void) { + NetworkService.shared.uploadMultipart(SignUpAPI.signUp(request), files: files) { response in + switch response { + case .success(let data): + completion(data, nil) + case .failure(let error): + print("=== signUp error ===") + print(error.localizedDescription) + completion(nil, error) + } + } + } + /// - Parameters: /// - completion: 통신 후 핸들러 (뷰컨트롤러에 있음) static func signOut( diff --git a/pochak/pochak/UI/Login/SignUp/JoinDataManager.swift b/pochak/pochak/UI/Login/SignUp/JoinDataManager.swift deleted file mode 100644 index dc8b2839..00000000 --- a/pochak/pochak/UI/Login/SignUp/JoinDataManager.swift +++ /dev/null @@ -1,72 +0,0 @@ -// -// JoinDataManager.swift -// pochak -// -// Created by Seo Cindy on 12/27/23. -// - -import Alamofire - -struct JoinDataManager { - - static let shared = JoinDataManager() - let url = "\(APIConstants.baseURL)/api/v2/signup" - let header : HTTPHeaders = ["Content-Type": "multipart/form-data", "charset" : "UTF-8"] - - func joinDataManager(_ name : String, - _ email : String, - _ handle : String, - _ message : String, - _ socialId : String, - _ socialType : String, - _ socialRefreshToken : String, - _ profileImage : UIImage?, - _ completion: @escaping (JoinDataModel) -> Void) { - - var requestBody : [String : String] = [ - "name" : name, - "email" : email, - "handle" : handle, - "message" : message, - "socialId" : socialId, - "socialType" : socialType - ] - - if socialRefreshToken == "NOTAPPLELOGINUSER" { - } else { - requestBody.updateValue(socialRefreshToken, forKey: "socialRefreshToken") - } - - print("requestBody : \(requestBody)") - print("join url : \(url)") - - - AF.upload(multipartFormData: { multipartFormData in - // requestBody 추가 - for (key, value) in requestBody { - if let valueData = value.data(using: .utf8) { - multipartFormData.append(valueData, withName: key) - } - } - // profileImage 추가 - if let image = profileImage?.jpegData(compressionQuality: 0.2) { - multipartFormData.append(image, withName: "profileImage", fileName: "profileImage.jpg", mimeType: "image/jpeg") - print("image : \(image)") - } - - }, to: url, method: .post, headers: header).validate().responseDecodable(of: JoinAPIResponse.self) { response in - print("joindataManager respose: \(response)") - print("joindataManager response result: \(response.result)") - switch response.result { - case .success(let result): - let resultData = result.result - completion(resultData) - case .failure(let error): - print("joindataManager error : \(error.localizedDescription)") - if let data = response.data, let errorMessage = String(data: data, encoding: .utf8) { - print("Failure Data: \(errorMessage)") - } - } - } - } -} diff --git a/pochak/pochak/UI/Login/SocialJoinViewController.swift b/pochak/pochak/UI/Login/SocialJoinViewController.swift index 472a23fa..c3f33c70 100644 --- a/pochak/pochak/UI/Login/SocialJoinViewController.swift +++ b/pochak/pochak/UI/Login/SocialJoinViewController.swift @@ -178,12 +178,12 @@ class SocialJoinViewController: UIViewController, SendDelegate { // MARK: - Apple Login Extension extension SocialJoinViewController: ASAuthorizationControllerDelegate, ASAuthorizationControllerPresentationContextProviding{ - func presentationAnchor(for controller: ASAuthorizationController) -> ASPresentationAnchor { + func presentationAnchor(for controller: ASAuthorizationController) -> ASPresentationAnchor { return self.view.window! } - + func authorizationController(controller: ASAuthorizationController, didCompleteWithAuthorization authorization: ASAuthorization) { - //로그인 성공 + //로그인 성공 switch authorization.credential { case let appleIDCredential as ASAuthorizationAppleIDCredential: // You can create an account in your system. @@ -234,7 +234,7 @@ extension SocialJoinViewController: ASAuthorizationControllerDelegate, ASAuthori } } - + func authorizationController(controller: ASAuthorizationController, didCompleteWithError error: Error) { // 로그인 실패(유저의 취소도 포함) print("login failed - \(error.localizedDescription)") diff --git a/pochak/pochak/UI/Login/SocialLoginViewController.swift b/pochak/pochak/UI/Login/SocialLoginViewController.swift deleted file mode 100644 index ce73e457..00000000 --- a/pochak/pochak/UI/Login/SocialLoginViewController.swift +++ /dev/null @@ -1,128 +0,0 @@ -//// -//// SocialLoginViewController.swift -//// pochak -//// -//// Created by Seo Cindy on 2023/08/15. -//// -// -//import UIKit -//import GoogleSignIn -// -//class SocialLoginViewController: UIViewController { -// -// -// @IBOutlet weak var googleLoginBtn: UIButton! -// @IBOutlet weak var appleLoginBtn: UIButton! -// @IBOutlet weak var goToJoinBtn: UIButton! -// -// override func viewDidLoad() { -// super.viewDidLoad() -// btnLayout() -// } -// -// // MARK: - Button Design -// private func btnLayout(){ -//// 소셜 로그인 버튼 디자인 -// googleLoginBtn.layer.cornerRadius = 30 -// ///테두리 두께 설정해야 함! -// googleLoginBtn.layer.borderWidth = 1 -// googleLoginBtn.layer.borderColor = UIColor(named: "gray02")?.cgColor -// appleLoginBtn.layer.cornerRadius = 30 -// -// -// // 아직 계정이 없으신가요? -// // String Custom : 이미 계정이 있으신가요? -// if let font = UIFont(name: "Pretendard-Bold", size: 16) { -// let customAttributes: [NSAttributedString.Key: Any] = [ -// .font: font, -// .foregroundColor: UIColor.black, -// .underlineStyle: 1 -// ] -// let attributedString = NSAttributedString(string: "아직 계정이 없으신가요?", attributes: customAttributes) -// goToJoinBtn.setAttributedTitle(attributedString, for: .normal) -// } else {return} -// -// // Hide Back Button -// self.navigationItem.setHidesBackButton(true, animated: true) -// -// } -// -// // MARK: - Google Login -// @IBAction func googleLoginAction(_ sender: Any) { -// GIDSignIn.sharedInstance.signIn(withPresenting: self) { signInResult, error in -// guard error == nil else { return } -// guard let signInResult = signInResult else { return } -// -// // Get User Info -// let user = signInResult.user -// let accessToken = user.accessToken.tokenString -// GoogleLoginDataManager.shared.googleLoginDataManager(accessToken, {resultData in -// guard let isNewMember = resultData.isNewMember else { return } -// guard let name = resultData.name else { return } -// guard let email = resultData.email else { return } -// guard let socialType = resultData.socialType else { return } -// guard let socialId = resultData.id else { return } -// -// // 사용자 기본 데이터 저장 -// UserDefaultsManager.setData(value: name, key: .name) -// UserDefaultsManager.setData(value: socialId, key: .socialId) -// UserDefaultsManager.setData(value: email, key: .email) -// UserDefaultsManager.setData(value: socialType, key: .socialType) -// UserDefaultsManager.setData(value: isNewMember, key: .isNewMember) -// print("This is google LOGIN~~~~~~~~~~~") -// print(isNewMember) -// -// self.changeViewControllerAccordingToisNewMemeberState(isNewMember, resultData) -// }) -// } -// } -// -// // MARK: - profileSettingPage or HomeTabPage로 전환하기 -// private func changeViewControllerAccordingToisNewMemeberState(_ isNewMember : Bool, _ resultData : GoogleLoginModel){ -// if isNewMember == true { -// // 알람! : 회원정보가 없습니다 회원가입하시겠습니까? -// let alert = UIAlertController(title:"이런..회원정보가 없어요! 회원가입하시겠습니까?",message: "",preferredStyle: UIAlertController.Style.alert) -// let cancle = UIAlertAction(title: "취소", style: .destructive, handler: nil) -// let ok = UIAlertAction(title: "확인", style: .default, handler: { -// action in -// self.toMakeProfilePage() -// }) -// alert.addAction(cancle) -// alert.addAction(ok) -// present(alert,animated: true,completion: nil) -// } else if isNewMember == false{ -// // 토큰 정보 저장 @KeyChainManager -// guard let accountAccessToken = resultData.accessToken else { return } -// guard let accountRefreshToken = resultData.refreshToken else { return } -// print("Login Again!!!!!") -// print(accountAccessToken) -// print(accountRefreshToken) -// do { -// try KeychainManager.save(account: "accessToken", value: accountAccessToken, isForce: false) -// try KeychainManager.save(account: "refreshToken", value: accountRefreshToken, isForce: false) -// } catch { -// print(error) -// } -// // 홈탭으로 이동 -// toHomeTabPage() -// } -// } -// -// private func toHomeTabPage(){ -// guard let tabbarVC = self.storyboard?.instantiateViewController(withIdentifier: "TabbarVC") as? CustomTabBarController else { return } -// (UIApplication.shared.connectedScenes.first?.delegate as? SceneDelegate)?.changeRootViewController(tabbarVC, animated: false) -// } -// -// private func toMakeProfilePage(){ -// guard let makeProfileVC = self.storyboard?.instantiateViewController(withIdentifier: "MakeProfileVC") as? MakeProfileViewController else {return} -// self.navigationController?.pushViewController(makeProfileVC, animated: true) -// } -// -// // MARK: - Back Button Action -// // PopVC -// @IBAction func goToJoinBtnTapped(_ sender: UIButton) { -// navigationController?.popViewController(animated: true) -// } -// -// -//} From 4f5bc26e4f503eea4390b785653d1aac3385f908 Mon Sep 17 00:00:00 2001 From: Jungyeon Seo Date: Tue, 1 Oct 2024 03:15:38 +0900 Subject: [PATCH 16/54] =?UTF-8?q?Style=20:=20convention=20=EB=94=B0?= =?UTF-8?q?=EB=9D=BC=20=EC=BD=94=EB=93=9C=20=ED=8F=AC=EB=A7=B7=ED=8C=85?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../UI/Login/Base.lproj/Login.storyboard | 14 ++- .../UI/Login/SignUpViewController.swift | 71 ++++++-------- .../UI/Login/SocialJoinViewController.swift | 95 ++++++++----------- .../UI/Login/TermsOfAgreeViewController.swift | 32 ++++--- 4 files changed, 97 insertions(+), 115 deletions(-) diff --git a/pochak/pochak/UI/Login/Base.lproj/Login.storyboard b/pochak/pochak/UI/Login/Base.lproj/Login.storyboard index ccab4f0d..8d691a0e 100644 --- a/pochak/pochak/UI/Login/Base.lproj/Login.storyboard +++ b/pochak/pochak/UI/Login/Base.lproj/Login.storyboard @@ -1,9 +1,9 @@ - + - + @@ -14,9 +14,15 @@ Pretendard-Bold + + Pretendard-Light + Pretendard-Medium + + Pretendard-SemiBold + @@ -209,10 +215,10 @@ - + - + diff --git a/pochak/pochak/UI/Login/SignUpViewController.swift b/pochak/pochak/UI/Login/SignUpViewController.swift index 67b38ade..ab764733 100644 --- a/pochak/pochak/UI/Login/SignUpViewController.swift +++ b/pochak/pochak/UI/Login/SignUpViewController.swift @@ -9,7 +9,8 @@ import UIKit class SignUpViewController: UIViewController { - // MARK: - Data + // MARK: - Properties + let textViewPlaceHolder = "소개를 입력해주세요.\n(최대 50자, 3줄)" let email = UserDefaultsManager.getData(type: String.self, forKey: .email) ?? "email not found" let socialType = UserDefaultsManager.getData(type: String.self, forKey: .socialType) ?? "socialType not found" @@ -17,15 +18,18 @@ class SignUpViewController: UIViewController { let socialRefreshToken = UserDefaultsManager.getData(type: String.self, forKey: .socialRefreshToken) ?? "NOTAPPLELOGINUSER" var backBtnPressed : Bool = false var handleDuplicationChecked : Bool = false + let imagePickerController = UIImagePickerController() + // MARK: - Views + @IBOutlet weak var profileImg: UIButton! @IBOutlet weak var nameTextField: UITextField! @IBOutlet weak var handleTextField: UITextField! @IBOutlet weak var messageTextView: UITextView! @IBOutlet weak var checkHandleDuplicationBtn: UIButton! - // MARK: - View LifeCycle - + // MARK: - Lifecycle + override func viewDidLoad() { super.viewDidLoad() @@ -70,14 +74,13 @@ class SignUpViewController: UIViewController { checkHandleDuplicationBtn.setImage(UIImage(named: "checkHandle"), for: .normal) // 핸들 입력 중이면 중복확인 버튼 및 텍스트필드 글자 색 세팅 원래대로 변경 -// handleTextField.placeholder = "아이디를 입력해주세요.\n (대문자, 소문자" handleTextField.addTarget(self, action: #selector(self.textFieldDidChange(_:)), for: .editingChanged) handleTextField.delegate = self } - // MARK: - Function - - @objc private func backbuttonPressed(_ sender: Any) {// 뒤로가기 버튼 클릭시 어디로 이동할지 + // MARK: - Actions + + @objc private func backbuttonPressed(_ sender: Any) { backBtnPressed = true showAlert(alertType: .confirmAndCancel, titleText: "프로필 설정을 취소하고\n페이지를 나갈까요?", @@ -96,7 +99,7 @@ class SignUpViewController: UIViewController { @IBAction func checkHandleDuplication(_ sender: Any) { - guard let handle = handleTextField.text else {return} + guard let handle = handleTextField.text else { return } let request = CheckDuplicateHandleRequest(handle: handle) AuthenticationService.checkDuplicateHandle(request: request) { [weak self] data, failed in @@ -104,7 +107,6 @@ class SignUpViewController: UIViewController { print(failed) return } - if data.code == "MEMBER2001" { // 중복 검사 버튼 상태 변경 self?.checkHandleDuplicationBtn.setImage(UIImage(named: "checkedHandle"), for: .normal) @@ -123,7 +125,6 @@ class SignUpViewController: UIViewController { } @objc private func doneBtnTapped(_ sender: Any) { - // 새로운 유저 정보 UserDefaults에 저장 : name / handle / message guard let name = nameTextField.text else {return} guard let handle = handleTextField.text else {return} @@ -131,8 +132,11 @@ class SignUpViewController: UIViewController { guard let profileImage = profileImg.currentImage else {return} let profileImageData: Data? = profileImg.currentImage?.jpegData(compressionQuality: 0.2) - if (name == "" || handle == "" || message == textViewPlaceHolder || message == "" || profileImage == UIImage(named: "chooseProfileIcon")){ - print("true!") + if (name == "" || + handle == "" || + message == textViewPlaceHolder || + message == "" || + profileImage == UIImage(named: "chooseProfileIcon")) { showAlert(alertType: .confirmOnly, titleText: "프로필 정보를 모두 입력해주세요.", messageText: "", @@ -197,17 +201,16 @@ class SignUpViewController: UIViewController { 3. @IBAction 정의 4. 프로토콜 채택 */ - let imagePickerController = UIImagePickerController() @IBAction func profileBtnTapped(_ sender: Any) { self.imagePickerController.delegate = self self.imagePickerController.sourceType = .photoLibrary present(self.imagePickerController, animated: true, completion: nil) } + // MARK: - Functions + private func toHomeTabPage(){ - let tabBarController = CustomTabBarController() - let sceneDelegate = UIApplication.shared.connectedScenes.first?.delegate as? SceneDelegate guard let delegate = sceneDelegate else { return @@ -216,13 +219,14 @@ class SignUpViewController: UIViewController { } } -// MARK: - Extension +// MARK: - Extension : UIImagePickerControllerDelegate, UINavigationControllerDelegate // 앨범 사진 선택 프로토콜 채택 extension SignUpViewController: UIImagePickerControllerDelegate, UINavigationControllerDelegate { // 선택한 사진 사용 - func imagePickerController(_ picker: UIImagePickerController, didFinishPickingMediaWithInfo info: [UIImagePickerController.InfoKey : Any]) { + func imagePickerController(_ picker: UIImagePickerController, + didFinishPickingMediaWithInfo info: [UIImagePickerController.InfoKey : Any]) { if let image = info[UIImagePickerController.InfoKey.originalImage] as? UIImage { profileImg.setImage(image, for: .normal) } @@ -235,7 +239,8 @@ extension SignUpViewController: UIImagePickerControllerDelegate, UINavigationCon } } -// TextView 기본 속성 설정 +// MARK: - Extension : UITextViewDelegate, UITextFieldDelegate + extension SignUpViewController: UITextViewDelegate { func textViewDidBeginEditing(_ textView: UITextView) { @@ -244,7 +249,7 @@ extension SignUpViewController: UITextViewDelegate { textView.textColor = .black } } - + func textViewDidEndEditing(_ textView: UITextView) { if textView.text.trimmingCharacters(in: .whitespacesAndNewlines).isEmpty { textView.text = textViewPlaceHolder @@ -264,33 +269,17 @@ extension SignUpViewController: UITextViewDelegate { func textViewDidChange(_ textView: UITextView) { guard let text = textView.text else { return } -// // 글자수 제한 -// let maxLength = 50 -// if text.count > maxLength { -//// textView.text = String(text.prefix(maxLength)) -// textView.text.removeLast() -// } -// // 줄바꿈(들여쓰기) 제한 let maxNumberOfLines = 3 let lineBreakCharacter = "\n" let lines = text.components(separatedBy: lineBreakCharacter) var consecutiveLineBreakCount = 0 // 연속된 줄 바꿈 횟수 - + print("lines == \(lines)") for line in lines { -// if line.isEmpty { // 빈 줄이면 연속된 줄 바꿈으로 간주 - consecutiveLineBreakCount += 1 -// } -// } else { -// consecutiveLineBreakCount = 0 -// } - - + consecutiveLineBreakCount += 1 if consecutiveLineBreakCount > maxNumberOfLines { textView.text = String(text.dropLast()) // 마지막 입력 문자를 제거 - -// textView.text.removeLast() break } } @@ -308,7 +297,8 @@ extension SignUpViewController : UITextFieldDelegate { } } -// Alert 창 +// MARK: - Extension : CustomAlertDelegate + extension SignUpViewController : CustomAlertDelegate { func cancel() { if backBtnPressed { @@ -318,13 +308,14 @@ extension SignUpViewController : CustomAlertDelegate { } } - func confirmAction() { print("confirmed") } } -// 아이디 허용 가능한 문자 : 대문자, 소문자, 숫자, _(언더바), .(마침표) +// MARK: - Extension : String + +// 아이디 허용 가능한 문자 제한 : 대문자, 소문자, 숫자, _(언더바), .(마침표) extension String { func hasCharacters() -> Bool{ do{ diff --git a/pochak/pochak/UI/Login/SocialJoinViewController.swift b/pochak/pochak/UI/Login/SocialJoinViewController.swift index c3f33c70..6c292180 100644 --- a/pochak/pochak/UI/Login/SocialJoinViewController.swift +++ b/pochak/pochak/UI/Login/SocialJoinViewController.swift @@ -13,47 +13,22 @@ protocol SendDelegate { func sendAgreed(agree : Bool) } -class SocialJoinViewController: UIViewController, SendDelegate { - func sendAgreed(agree: Bool) { - if agree { - guard let makeProfileVC = self.storyboard?.instantiateViewController(withIdentifier: "MakeProfileVC") as? MakeProfileViewController else {return} - self.navigationController?.pushViewController(makeProfileVC, animated: true) - } else { - print("not agreed yet!") - } - } +class SocialJoinViewController: UIViewController { - - // MARK: - Data + // MARK: - Views @IBOutlet weak var startPochak: UILabel! @IBOutlet weak var googleLoginBtn: UIButton! @IBOutlet weak var appleLoginBtn: UIButton! + // MARK: - Lifecycle - // MARK: - View LifeCycle override func viewDidLoad() { super.viewDidLoad() - - // Title - // let attrs : [NSAttributedString.Key : Any] = [ - // NSAttributedString.Key.foregroundColor: UIColor.black, - // NSAttributedString.Key.font: UIFont(name: "Pretendard-Bold", size: 20)! - //// ] - // - // UINavigationBar.appearance().titleTextAttributes = attrs - // self.navigationController?.navigationBar.titleTextAttributes = attrs - - // 네비게이션 바 Back Button 커스텀 - /// 주의점 : backBarButtonItem 사용 시 FirstViewController에서 지정! -// let backBarButtonItem = UIBarButtonItem(title: nil, style: .plain, target: nil, action: nil) -// backBarButtonItem.tintColor = .black -// self.navigationItem.backBarButtonItem = backBarButtonItem - - // 로그인 버튼 디자인 커스텀 btnLayout() } - override func viewWillAppear(_ animated: Bool){ + + override func viewWillAppear(_ animated: Bool) { // 뷰가 나타날 때에는 네비게이션 바 숨기기 self.navigationController?.setNavigationBarHidden(true, animated: true) } @@ -63,7 +38,7 @@ class SocialJoinViewController: UIViewController, SendDelegate { self.navigationController?.setNavigationBarHidden(false, animated: true) } - // MARK: - Google Login + // MARK: - Actions @IBAction func googleLoginAction(_ sender: Any) { GIDSignIn.sharedInstance.signIn(withPresenting: self) { signInResult, error in @@ -75,13 +50,13 @@ class SocialJoinViewController: UIViewController, SendDelegate { let accessToken = user.accessToken.tokenString print("googleLogin 시스템 안의 accessToken : \(accessToken)") - // 로딩모달 + // 로딩 모달 self.showProgressBar() - + GoogleLoginDataManager.shared.googleLoginDataManager(accessToken, {resultData in print("GoogleLoginDataManager 안의 resultData : \(resultData)") - // 사용자 기본 데이터 저장 : socialId / email / socialType + // 사용자 기본 데이터 저장 : socialId, email, socialType UserDefaultsManager.setData(value: resultData.socialId, key: .socialId) UserDefaultsManager.setData(value: resultData.email, key: .email) UserDefaultsManager.setData(value: resultData.socialType, key: .socialType) @@ -95,8 +70,6 @@ class SocialJoinViewController: UIViewController, SendDelegate { } } - // MARK: - Apple Login - @IBAction func appleLoginAction(_ sender: Any) { let appleIDProvider = ASAuthorizationAppleIDProvider() let request = appleIDProvider.createRequest() @@ -108,19 +81,19 @@ class SocialJoinViewController: UIViewController, SendDelegate { authorizationController.performRequests() } - // MARK: - Function + // MARK: - Functions - private func btnLayout(){ + private func btnLayout() { googleLoginBtn.layer.cornerRadius = 30 googleLoginBtn.layer.borderWidth = 1 googleLoginBtn.layer.borderColor = UIColor(named: "gray02")?.cgColor appleLoginBtn.layer.cornerRadius = 30 } - private func changeViewControllerAccordingToisNewMemeberStateForGoogle(_ isNewMember : Bool, _ resultDataForGoogle : GoogleLoginModel){ + private func changeViewControllerAccordingToisNewMemeberStateForGoogle(_ isNewMember : Bool, _ resultDataForGoogle : GoogleLoginModel) { if isNewMember == true { guard let termsOfAgreeVC = self.storyboard?.instantiateViewController(withIdentifier: "TermsOfAgreeVC") as? TermsOfAgreeViewController else {return} - termsOfAgreeVC.modalPresentationStyle = .overCurrentContext // 투명도가 있으면 투명도에 맞춰서 나오게 해주는 코드(뒤에있는 배경이 보일 수 있게) + termsOfAgreeVC.modalPresentationStyle = .overCurrentContext // 투명도가 있으면 투명도에 맞춰서 나오게 해주는 코드(뒤에있는 배경이 보일 수 있게) termsOfAgreeVC.delegate = self self.present(termsOfAgreeVC, animated: false, completion: nil) } else { @@ -133,19 +106,18 @@ class SocialJoinViewController: UIViewController, SendDelegate { } catch { print(error) } - + // UserDefaults에 handle 정보 저장 UserDefaultsManager.setData(value: resultDataForGoogle.handle, key: .handle) // 홈탭으로 이동 toHomeTabPage() } } - private func changeViewControllerAccordingToisNewMemeberStateForApple(_ isNewMember : Bool, _ resultDataForApple : AppleLoginModel){ + private func changeViewControllerAccordingToisNewMemeberStateForApple(_ isNewMember : Bool, _ resultDataForApple : AppleLoginModel) { if isNewMember == true { - print("inside changeVCForApple") // 프로필 설정 페이지로 이동 guard let termsOfAgreeVC = self.storyboard?.instantiateViewController(withIdentifier: "TermsOfAgreeVC") as? TermsOfAgreeViewController else {return} - termsOfAgreeVC.modalPresentationStyle = .overCurrentContext // 투명도가 있으면 투명도에 맞춰서 나오게 해주는 코드(뒤에있는 배경이 보일 수 있게) + termsOfAgreeVC.modalPresentationStyle = .overCurrentContext termsOfAgreeVC.delegate = self self.present(termsOfAgreeVC, animated: false, completion: nil) } else { @@ -158,16 +130,15 @@ class SocialJoinViewController: UIViewController, SendDelegate { } catch { print(error) } + // UserDefaults에 handle 정보 저장 UserDefaultsManager.setData(value: resultDataForApple.handle, key: .handle) // 홈탭으로 이동 toHomeTabPage() } } - private func toHomeTabPage(){ - + private func toHomeTabPage() { let tabBarController = CustomTabBarController() - let sceneDelegate = UIApplication.shared.connectedScenes.first?.delegate as? SceneDelegate guard let delegate = sceneDelegate else { return @@ -176,14 +147,15 @@ class SocialJoinViewController: UIViewController, SendDelegate { } } -// MARK: - Apple Login Extension -extension SocialJoinViewController: ASAuthorizationControllerDelegate, ASAuthorizationControllerPresentationContextProviding{ +// MARK: - Extension : ASAuthorizationControllerDelegate, ASAuthorizationControllerPresentationContextProviding + +extension SocialJoinViewController: ASAuthorizationControllerDelegate, ASAuthorizationControllerPresentationContextProviding { func presentationAnchor(for controller: ASAuthorizationController) -> ASPresentationAnchor { return self.view.window! } func authorizationController(controller: ASAuthorizationController, didCompleteWithAuthorization authorization: ASAuthorization) { - //로그인 성공 + //로그인 성공 시 switch authorization.credential { case let appleIDCredential as ASAuthorizationAppleIDCredential: // You can create an account in your system. @@ -201,11 +173,11 @@ extension SocialJoinViewController: ASAuthorizationControllerDelegate, ASAuthori print("authCodeString: \(authCodeString)") print("identifyTokenString: \(identifyTokenString)") - // 로딩모달 + // 로딩 모달 self.showProgressBar() // API request : POST - AppleLoginDataManager.shared.appleLoginDataManager(identifyTokenString, authCodeString, {resultData in + AppleLoginDataManager.shared.appleLoginDataManager(identifyTokenString, authCodeString, { resultData in // 사용자 기본 데이터 저장 : id / email / socialType / isNewMember UserDefaultsManager.setData(value: resultData.socialId, key: .socialId) @@ -218,9 +190,7 @@ extension SocialJoinViewController: ASAuthorizationControllerDelegate, ASAuthori // 로딩 숨김 self.hideProgressBar() }) - } - case let passwordCredential as ASPasswordCredential: // Sign in using an existing iCloud Keychain credential. let username = passwordCredential.user @@ -234,9 +204,22 @@ extension SocialJoinViewController: ASAuthorizationControllerDelegate, ASAuthori } } - func authorizationController(controller: ASAuthorizationController, didCompleteWithError error: Error) { - // 로그인 실패(유저의 취소도 포함) + // 로그인 실패 시 (유저의 취소도 포함) print("login failed - \(error.localizedDescription)") } } + +// MARK: - Extension : SendDelegate + +extension SocialJoinViewController: SendDelegate { + func sendAgreed(agree: Bool) { + if agree { + guard let signUpVC = self.storyboard?.instantiateViewController(withIdentifier: "SignUpVC") + as? SignUpViewController else { return } + self.navigationController?.pushViewController(signUpVC, animated: true) + } else { + print("not agreed yet!") + } + } +} diff --git a/pochak/pochak/UI/Login/TermsOfAgreeViewController.swift b/pochak/pochak/UI/Login/TermsOfAgreeViewController.swift index 4695cfb4..fc5097d1 100644 --- a/pochak/pochak/UI/Login/TermsOfAgreeViewController.swift +++ b/pochak/pochak/UI/Login/TermsOfAgreeViewController.swift @@ -9,7 +9,15 @@ import UIKit import SafariServices class TermsOfAgreeViewController: UIViewController, UIViewControllerTransitioningDelegate { - + + // MARK: - Properties + + var didAgreeForPrivacyPolicy : Bool = false + var didAgreeForTermsOfUse : Bool = false + var delegate : SendDelegate? + + // MARK: - Views + @IBOutlet weak var pochakLabel: UILabel! @IBOutlet weak var pochakCorpLabel: UILabel! @IBOutlet weak var titleLabel: UILabel! @@ -19,14 +27,9 @@ class TermsOfAgreeViewController: UIViewController, UIViewControllerTransitionin @IBOutlet weak var seePrivacyPolicy: UIButton! @IBOutlet weak var seeTermsOfUse: UIButton! @IBOutlet weak var agreeAndContinueButton: UIButton! - @IBOutlet weak var backgroundView: UIView! - - var didAgreeForPrivacyPolicy : Bool = false - var didAgreeForTermsOfUse : Bool = false - var delegate : SendDelegate? - + // MARK: - Lifecycle override func viewDidLoad() { super.viewDidLoad() @@ -54,17 +57,17 @@ class TermsOfAgreeViewController: UIViewController, UIViewControllerTransitionin agreeForPrivacyPolicy.titleLabel?.font = UIFont(name: "Pretendard-Medium", size: 15) agreeForPrivacyPolicy.setTitleColor(UIColor(named: "gray04"), for: .normal) agreeForPrivacyPolicy.tintColor = UIColor(named: "gray04") - + agreeForTermsOfUSe.setTitle(" [필수] 이용약관 항목", for: .normal) agreeForTermsOfUSe.setImage(UIImage(systemName: "checkmark.circle"), for: .normal) agreeForTermsOfUSe.titleLabel?.font = UIFont(name: "Pretendard-Medium", size: 15) agreeForTermsOfUSe.setTitleColor(UIColor(named: "gray04"), for: .normal) agreeForTermsOfUSe.tintColor = UIColor(named: "gray04") - - // Do any additional setup after loading the view. } + // MARK: - Actions + @IBAction func pressAgreeForPrivacyPolicy(_ sender: Any) { if !didAgreeForPrivacyPolicy { didAgreeForPrivacyPolicy = true @@ -98,10 +101,9 @@ class TermsOfAgreeViewController: UIViewController, UIViewControllerTransitionin @IBAction func openPrivacyPolicy(_ sender: Any) { guard let url = URL(string: "https://pochak.notion.site/e365e34f018949b88543adbe6b0b3746") else { return } let safariVC = SFSafariViewController(url: url) - // delegate 지정 및 presentation style 설정. + // delegate 지정 및 presentation style 설정 safariVC.transitioningDelegate = self safariVC.modalPresentationStyle = .pageSheet - present(safariVC, animated: true, completion: nil) } @@ -109,10 +111,9 @@ class TermsOfAgreeViewController: UIViewController, UIViewControllerTransitionin @IBAction func openTermsOfUSe(_ sender: Any) { guard let url = URL(string: "https://pochak.notion.site/6520996186464c36a8b3a04bc17fa000?pvs=74") else { return } let safariVC = SFSafariViewController(url: url) - // delegate 지정 및 presentation style 설정. + // delegate 지정 및 presentation style 설정 safariVC.transitioningDelegate = self safariVC.modalPresentationStyle = .pageSheet - present(safariVC, animated: true, completion: nil) } @@ -124,9 +125,10 @@ class TermsOfAgreeViewController: UIViewController, UIViewControllerTransitionin print("not agreed yet") } } - } +// MARK: - Extension + extension UIButton { func setUnderline() { guard let title = title(for: .normal) else { return } From 7d13c6ceb5d30919a309f8274ef761153443eaf1 Mon Sep 17 00:00:00 2001 From: Jungyeon Seo Date: Tue, 1 Oct 2024 16:04:27 +0900 Subject: [PATCH 17/54] =?UTF-8?q?Fix=20:=20block=20api=20=EC=88=98?= =?UTF-8?q?=EC=A0=95?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../pochak/Network/APIs/Authentication/SignUpAPI.swift | 4 ++-- .../Profile/BlockList/BlockedUserViewController.swift | 2 ++ .../pochak/UI/Profile/MyProfileTabViewController.swift | 3 ++- .../UI/Profile/UpdateProfileViewController.swift | 10 ++-------- 4 files changed, 8 insertions(+), 11 deletions(-) diff --git a/pochak/pochak/Network/APIs/Authentication/SignUpAPI.swift b/pochak/pochak/Network/APIs/Authentication/SignUpAPI.swift index 8280a91a..d32e7962 100644 --- a/pochak/pochak/Network/APIs/Authentication/SignUpAPI.swift +++ b/pochak/pochak/Network/APIs/Authentication/SignUpAPI.swift @@ -24,13 +24,13 @@ extension SignUpAPI: BaseAPI { var path: String { switch self { - case .signUp: return "/v2/signUp" + case .signUp: return "/v2/signup" } } var parameters: RequestParams? { switch self { - case .signUp(let request): return .body(request) + case .signUp(let request): return .query(request) } } } diff --git a/pochak/pochak/UI/Profile/BlockList/BlockedUserViewController.swift b/pochak/pochak/UI/Profile/BlockList/BlockedUserViewController.swift index ccd21ff2..6b397cd8 100644 --- a/pochak/pochak/UI/Profile/BlockList/BlockedUserViewController.swift +++ b/pochak/pochak/UI/Profile/BlockList/BlockedUserViewController.swift @@ -136,6 +136,8 @@ extension BlockedUserViewController: UITableViewDataSource{ extension BlockedUserViewController: RemoveCellDelegate { func removeCell(at indexPath: IndexPath, _ handle: String) { + cellHandle = handle + cellIndexPath = indexPath showAlert(alertType: .confirmAndCancel, titleText: "유저 차단을 취소하겠습니까?", messageText: "유저 차단을 취소하면, 팔로워와 관련된 \n사진 및 소식을 다시 접할 수 있습니다.", diff --git a/pochak/pochak/UI/Profile/MyProfileTabViewController.swift b/pochak/pochak/UI/Profile/MyProfileTabViewController.swift index 36db036d..f15afd09 100644 --- a/pochak/pochak/UI/Profile/MyProfileTabViewController.swift +++ b/pochak/pochak/UI/Profile/MyProfileTabViewController.swift @@ -155,7 +155,7 @@ class MyProfileTabViewController: UIViewController { // 필요한 데이터 뷰에 반영 self.setUpResponseData(data.result) - // UserDefaultsManager에 새로운 데이터 저장 후 관리 : followerCount, followingCount + // UserDefaultsManager에 데이터 저장 후 관리 self.setUpUserDefaults(data.result) } } @@ -174,5 +174,6 @@ class MyProfileTabViewController: UIViewController { UserDefaultsManager.setData(value: resposeData.message, key: .message) UserDefaultsManager.setData(value: resposeData.followerCount, key: .followerCount) UserDefaultsManager.setData(value: resposeData.followingCount, key: .followingCount) + UserDefaultsManager.setData(value: resposeData.profileImage, key: .profileImgUrl) } } diff --git a/pochak/pochak/UI/Profile/UpdateProfileViewController.swift b/pochak/pochak/UI/Profile/UpdateProfileViewController.swift index 5cf9b008..39c475dd 100644 --- a/pochak/pochak/UI/Profile/UpdateProfileViewController.swift +++ b/pochak/pochak/UI/Profile/UpdateProfileViewController.swift @@ -113,15 +113,9 @@ class UpdateProfileViewController: UIViewController { handleTextField.isUserInteractionEnabled = false handleTextField.textColor = UIColor(named: "gray03") + // load 프로필 이미지 if let url = URL(string: profileImgUrl) { - self.profileImg.kf.setImage(with: url) { result in - switch result { - case .success(let value): - print("Image successfully loaded: \(value.image)") - case .failure(let error): - print("Image failed to load with error: \(error.localizedDescription)") - } - } + self.profileImg.load(with: url) } self.profileImg.contentMode = .scaleAspectFill From b95db28bc4422d5e1524d899ea2a811b2480069c Mon Sep 17 00:00:00 2001 From: Jungyeon Seo Date: Sun, 6 Oct 2024 15:08:02 +0900 Subject: [PATCH 18/54] =?UTF-8?q?Fix=20:=20update=20api=20=EC=88=98?= =?UTF-8?q?=EC=A0=95?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- pochak/pochak/Network/APIs/Profile/ProfileUpdateAPI.swift | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/pochak/pochak/Network/APIs/Profile/ProfileUpdateAPI.swift b/pochak/pochak/Network/APIs/Profile/ProfileUpdateAPI.swift index fa46e1a9..5af31122 100644 --- a/pochak/pochak/Network/APIs/Profile/ProfileUpdateAPI.swift +++ b/pochak/pochak/Network/APIs/Profile/ProfileUpdateAPI.swift @@ -31,7 +31,7 @@ extension ProfileUpdateAPI: BaseAPI { var parameters: RequestParams? { switch self { - case .updateProfile(_, let request): return .body(request) + case .updateProfile(_, let request): return .query(request) } } } From a3a6468941efe1c85d96ac58a7c1a8d47302e245 Mon Sep 17 00:00:00 2001 From: Jungyeon Seo Date: Sun, 6 Oct 2024 15:08:39 +0900 Subject: [PATCH 19/54] =?UTF-8?q?Fix=20:=20=EC=83=88=EB=A1=9C=EA=B3=A0?= =?UTF-8?q?=EC=B9=A8=20=EC=95=A1=EC=85=98=20=EC=88=98=EC=A0=95?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../pochak/UI/Profile/BlockList/BlockedUserViewController.swift | 2 +- .../Profile/FollowList/FollowerListTabmanViewController.swift | 2 +- .../Profile/FollowList/FollowingListTabmanViewController.swift | 2 +- .../UI/Profile/PostList/PochakPostTabmanViewController.swift | 2 +- .../UI/Profile/PostList/PochakedPostTabmanViewController.swift | 2 +- 5 files changed, 5 insertions(+), 5 deletions(-) diff --git a/pochak/pochak/UI/Profile/BlockList/BlockedUserViewController.swift b/pochak/pochak/UI/Profile/BlockList/BlockedUserViewController.swift index 6b397cd8..d056feb6 100644 --- a/pochak/pochak/UI/Profile/BlockList/BlockedUserViewController.swift +++ b/pochak/pochak/UI/Profile/BlockList/BlockedUserViewController.swift @@ -42,7 +42,7 @@ class BlockedUserViewController: UIViewController { blockedUserList = [] currentFetchingPage = 0 setUpData() - DispatchQueue.main.async { + DispatchQueue.main.asyncAfter(deadline: .now() + 0.7) { self.tableView.refreshControl?.endRefreshing() } } diff --git a/pochak/pochak/UI/Profile/FollowList/FollowerListTabmanViewController.swift b/pochak/pochak/UI/Profile/FollowList/FollowerListTabmanViewController.swift index ff72c89f..16910409 100644 --- a/pochak/pochak/UI/Profile/FollowList/FollowerListTabmanViewController.swift +++ b/pochak/pochak/UI/Profile/FollowList/FollowerListTabmanViewController.swift @@ -48,7 +48,7 @@ class FollowerListTabmanViewController: UIViewController { imageArray = [] currentFetchingPage = 0 setUpData() - DispatchQueue.main.async { + DispatchQueue.main.asyncAfter(deadline: .now() + 0.7) { self.followerCollectionView.refreshControl?.endRefreshing() } } diff --git a/pochak/pochak/UI/Profile/FollowList/FollowingListTabmanViewController.swift b/pochak/pochak/UI/Profile/FollowList/FollowingListTabmanViewController.swift index 6c6d55a9..716da840 100644 --- a/pochak/pochak/UI/Profile/FollowList/FollowingListTabmanViewController.swift +++ b/pochak/pochak/UI/Profile/FollowList/FollowingListTabmanViewController.swift @@ -40,7 +40,7 @@ class FollowingListTabmanViewController: UIViewController { imageArray = [] currentFetchingPage = 0 setUpData() - DispatchQueue.main.async { + DispatchQueue.main.asyncAfter(deadline: .now() + 0.7) { self.followingCollectionView.refreshControl?.endRefreshing() } } diff --git a/pochak/pochak/UI/Profile/PostList/PochakPostTabmanViewController.swift b/pochak/pochak/UI/Profile/PostList/PochakPostTabmanViewController.swift index c201ec65..4eb4317d 100644 --- a/pochak/pochak/UI/Profile/PostList/PochakPostTabmanViewController.swift +++ b/pochak/pochak/UI/Profile/PostList/PochakPostTabmanViewController.swift @@ -40,7 +40,7 @@ class PochakPostTabmanViewController: UIViewController { imageArray = [] currentFetchingPage = 0 setUpData() - DispatchQueue.main.async { + DispatchQueue.main.asyncAfter(deadline: .now() + 0.7) { self.postCollectionView.refreshControl?.endRefreshing() } } diff --git a/pochak/pochak/UI/Profile/PostList/PochakedPostTabmanViewController.swift b/pochak/pochak/UI/Profile/PostList/PochakedPostTabmanViewController.swift index 61332def..d25fec62 100644 --- a/pochak/pochak/UI/Profile/PostList/PochakedPostTabmanViewController.swift +++ b/pochak/pochak/UI/Profile/PostList/PochakedPostTabmanViewController.swift @@ -39,7 +39,7 @@ class PochakedPostTabmanViewController: UIViewController { imageArray = [] currentFetchingPage = 0 setUpData() - DispatchQueue.main.async { + DispatchQueue.main.asyncAfter(deadline: .now() + 0.7) { self.postCollectionView.refreshControl?.endRefreshing() } } From d93688677a9336c0d6fcf41ab9b0aaea4cc6c85a Mon Sep 17 00:00:00 2001 From: Jungyeon Seo Date: Sun, 6 Oct 2024 15:08:53 +0900 Subject: [PATCH 20/54] =?UTF-8?q?Fix=20:=20=ED=94=84=EB=A1=9C=ED=95=84=20?= =?UTF-8?q?=EB=8D=B0=EC=9D=B4=ED=84=B0=20=EC=83=88=EB=A1=9C=EA=B3=A0?= =?UTF-8?q?=EC=B9=A8?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../FollowerListTabmanViewController.swift | 16 +++++++++------- .../Profile/OtherUserProfileViewController.swift | 14 ++++++++------ 2 files changed, 17 insertions(+), 13 deletions(-) diff --git a/pochak/pochak/UI/Profile/FollowList/FollowerListTabmanViewController.swift b/pochak/pochak/UI/Profile/FollowList/FollowerListTabmanViewController.swift index 16910409..9ca3c76d 100644 --- a/pochak/pochak/UI/Profile/FollowList/FollowerListTabmanViewController.swift +++ b/pochak/pochak/UI/Profile/FollowList/FollowerListTabmanViewController.swift @@ -165,6 +165,8 @@ extension FollowerListTabmanViewController : UICollectionViewDelegateFlowLayout extension FollowerListTabmanViewController: RemoveImageDelegate { func removeFromCollectionView(at indexPath: IndexPath, _ handle: String) { + cellHandle = handle + cellIndexPath = indexPath showAlert(alertType: .confirmAndCancel, titleText: "팔로워를 삭제하시겠습니까?", messageText: "팔로워를 삭제하면, 팔로워와 관련된 \n사진이 사라집니다.", @@ -180,24 +182,24 @@ extension FollowerListTabmanViewController : CustomAlertDelegate { func confirmAction() { let request = DeleteFollowerRequest(followerHandle: cellHandle ?? "") - UserService.deleteFollower(handle: receivedHandle ?? "", request: request) { [weak self] data, failed in + UserService.deleteFollower(handle: receivedHandle ?? "", request: request) { data, failed in guard let data = data else { switch failed { case .disconnected: - self?.present(UIAlertController.networkErrorAlert(title: failed!.localizedDescription), animated: true) + self.present(UIAlertController.networkErrorAlert(title: failed!.localizedDescription), animated: true) case .serverError: - self?.present(UIAlertController.networkErrorAlert(title: failed!.localizedDescription), animated: true) + self.present(UIAlertController.networkErrorAlert(title: failed!.localizedDescription), animated: true) case .unknownError: - self?.present(UIAlertController.networkErrorAlert(title: failed!.localizedDescription), animated: true) + self.present(UIAlertController.networkErrorAlert(title: failed!.localizedDescription), animated: true) default: - self?.present(UIAlertController.networkErrorAlert(title: "요청에 실패하였습니다."), animated: true) + self.present(UIAlertController.networkErrorAlert(title: "요청에 실패하였습니다."), animated: true) } return } print(data.message) - self?.imageArray.remove(at: self?.cellIndexPath?.row ?? 10000) - self?.followerCollectionView.reloadData() + self.imageArray.remove(at: self.cellIndexPath!.row) + self.followerCollectionView.reloadData() } } diff --git a/pochak/pochak/UI/Profile/OtherUserProfileViewController.swift b/pochak/pochak/UI/Profile/OtherUserProfileViewController.swift index 9186740a..ba8ba8bc 100644 --- a/pochak/pochak/UI/Profile/OtherUserProfileViewController.swift +++ b/pochak/pochak/UI/Profile/OtherUserProfileViewController.swift @@ -95,10 +95,11 @@ class OtherUserProfileViewController: UIViewController { return } print(data.message) + self?.receivedIsFollow = true + sender.setTitle("팔로잉", for: .normal) + sender.backgroundColor = UIColor(named: "gray03") + self?.setUpData() } - self.receivedIsFollow = true - sender.setTitle("팔로잉", for: .normal) - sender.backgroundColor = UIColor(named: "gray03") } } @@ -288,10 +289,11 @@ extension OtherUserProfileViewController: CustomAlertDelegate { return } print(data.message) + self?.receivedIsFollow = false + self?.followToggleBtn.setTitle("팔로우", for: .normal) + self?.followToggleBtn.backgroundColor = UIColor(named: "yellow00") + self?.setUpData() } - self.receivedIsFollow = false - followToggleBtn.setTitle("팔로우", for: .normal) - followToggleBtn.backgroundColor = UIColor(named: "yellow00") } } From ac2393f836d9b8ca97bbf01b7915fee589226480 Mon Sep 17 00:00:00 2001 From: Jungyeon Seo Date: Mon, 14 Oct 2024 23:08:39 +0900 Subject: [PATCH 21/54] =?UTF-8?q?Feat=20:=20scrollview=20=EC=B6=94?= =?UTF-8?q?=EA=B0=80?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../Profile/MyProfileTabViewController.swift | 54 ++++++++- .../OtherUserProfileViewController.swift | 55 +++++++++ .../PochakPostTabmanViewController.swift | 2 +- .../PochakedPostTabmanViewController.swift | 10 +- .../pochak/UI/Profile/ProfileTab.storyboard | 111 ++++++++---------- 5 files changed, 167 insertions(+), 65 deletions(-) diff --git a/pochak/pochak/UI/Profile/MyProfileTabViewController.swift b/pochak/pochak/UI/Profile/MyProfileTabViewController.swift index f15afd09..24fd0a91 100644 --- a/pochak/pochak/UI/Profile/MyProfileTabViewController.swift +++ b/pochak/pochak/UI/Profile/MyProfileTabViewController.swift @@ -44,8 +44,11 @@ class MyProfileTabViewController: UIViewController { override func viewDidLoad() { super.viewDidLoad() - setUpViewController() + addSubview() + setUpUIConstraints() + setUpRefreshControl() setUpData() + setUpViewController() } override func viewWillAppear(_ animated: Bool) { @@ -88,9 +91,58 @@ class MyProfileTabViewController: UIViewController { followListVC.followingCount = UserDefaultsManager.getData(type: Int.self, forKey: .followingCount) ?? 0 self.navigationController?.pushViewController(followListVC, animated: true) } + + @objc private func refreshData(_ sender: Any) { + print("refresh") +// imageArray = [] +// currentFetchingPage = 0 + setUpData() + DispatchQueue.main.asyncAfter(deadline: .now() + 0.7) { + self.contentScrollView.refreshControl?.endRefreshing() + } + } // MARK: - Functions + private let contentScrollView: UIScrollView = { + let scrollView = UIScrollView() + scrollView.translatesAutoresizingMaskIntoConstraints = false +// scrollView.backgroundColor = UIColor(named: "gray01") + scrollView.backgroundColor = .red + scrollView.showsVerticalScrollIndicator = false + + return scrollView + }() + + private func addSubview() { + self.view.addSubview(contentScrollView) + contentScrollView.addSubview(topUIView) + contentScrollView.addSubview(postListTabmanView) + } + + private func setUpUIConstraints() { + NSLayoutConstraint.activate([ + contentScrollView.topAnchor.constraint(equalTo: self.view.topAnchor), + contentScrollView.leadingAnchor.constraint(equalTo: self.view.leadingAnchor), + contentScrollView.trailingAnchor.constraint(equalTo: self.view.trailingAnchor), + contentScrollView.bottomAnchor.constraint(equalTo: self.view.bottomAnchor), + contentScrollView.heightAnchor.constraint(equalTo: self.view.heightAnchor), + topUIView.topAnchor.constraint(equalTo: contentScrollView.topAnchor, constant: 15), + topUIView.leadingAnchor.constraint(equalTo: contentScrollView.leadingAnchor), + topUIView.trailingAnchor.constraint(equalTo: contentScrollView.trailingAnchor), + topUIView.bottomAnchor.constraint(equalTo: contentScrollView.bottomAnchor), + ]) + // 세로 방향의 스크롤뷰 + let constraint = topUIView.widthAnchor.constraint(equalTo: contentScrollView.widthAnchor) + constraint.priority = UILayoutPriority(250) + constraint.isActive = true + } + + private func setUpRefreshControl() { + contentScrollView.refreshControl = UIRefreshControl() + contentScrollView.refreshControl?.addTarget(self, action: #selector(refreshData(_:)), for: .valueChanged) + } + private func setUpViewController() { self.navigationController?.isNavigationBarHidden = true diff --git a/pochak/pochak/UI/Profile/OtherUserProfileViewController.swift b/pochak/pochak/UI/Profile/OtherUserProfileViewController.swift index ba8ba8bc..d027a372 100644 --- a/pochak/pochak/UI/Profile/OtherUserProfileViewController.swift +++ b/pochak/pochak/UI/Profile/OtherUserProfileViewController.swift @@ -41,6 +41,7 @@ class OtherUserProfileViewController: UIViewController { @IBOutlet weak var followToggleBtn: UIButton! @IBOutlet weak var postListTabmanView: UIView! @IBOutlet weak var updateProfileBtn: UIButton! + @IBOutlet weak var topUIView: UIView! // MARK: - Lifecycle @@ -55,6 +56,9 @@ class OtherUserProfileViewController: UIViewController { override func viewDidLoad() { super.viewDidLoad() + addSubview() + setUpUIConstraints() + setUpRefreshControl() setUpNavigationBar() setUpViewController() setUpData() @@ -139,8 +143,59 @@ class OtherUserProfileViewController: UIViewController { present(profileMenuVC, animated: true) } + @objc private func refreshData(_ sender: Any) { + print("refresh") + // imageArray = [] + // currentFetchingPage = 0 + setUpData() + DispatchQueue.main.asyncAfter(deadline: .now() + 0.7) { + self.contentScrollView.refreshControl?.endRefreshing() + } + } + // MARK: - Functions + private let contentScrollView: UIScrollView = { + let scrollView = UIScrollView() + scrollView.translatesAutoresizingMaskIntoConstraints = false +// scrollView.backgroundColor = UIColor(named: "gray01") + scrollView.backgroundColor = .red + scrollView.showsVerticalScrollIndicator = false + + return scrollView + }() + + private func addSubview() { + self.view.addSubview(contentScrollView) + contentScrollView.addSubview(topUIView) + contentScrollView.addSubview(postListTabmanView) + } + + private func setUpUIConstraints() { + NSLayoutConstraint.activate([ + contentScrollView.topAnchor.constraint(equalTo: self.view.topAnchor), + contentScrollView.leadingAnchor.constraint(equalTo: self.view.leadingAnchor), + contentScrollView.trailingAnchor.constraint(equalTo: self.view.trailingAnchor), + contentScrollView.bottomAnchor.constraint(equalTo: self.view.bottomAnchor), + contentScrollView.heightAnchor.constraint(equalTo: self.view.heightAnchor), + topUIView.topAnchor.constraint(equalTo: contentScrollView.topAnchor, constant: 60), + topUIView.leadingAnchor.constraint(equalTo: contentScrollView.leadingAnchor), + topUIView.trailingAnchor.constraint(equalTo: contentScrollView.trailingAnchor), + topUIView.bottomAnchor.constraint(equalTo: contentScrollView.bottomAnchor), + topUIView.widthAnchor.constraint(equalTo: contentScrollView.widthAnchor), // 세로 방향의 스크롤뷰 + ]) + // 세로 방향의 스크롤뷰 +// let constraint = topUIView.widthAnchor.constraint(equalTo: contentScrollView.widthAnchor) +// constraint.priority = UILayoutPriority(250) +// constraint.isActive = true + } + + private func setUpRefreshControl() { + contentScrollView.refreshControl = UIRefreshControl() + contentScrollView.refreshControl?.addTarget(self, action: #selector(refreshData(_:)), for: .valueChanged) + } + + @IBAction func updateProfile(_ sender: Any) { guard let updateProfileVC = self.storyboard?.instantiateViewController(withIdentifier: "UpdateProfileVC") as? UpdateProfileViewController else {return} self.navigationController?.pushViewController(updateProfileVC, animated: true) diff --git a/pochak/pochak/UI/Profile/PostList/PochakPostTabmanViewController.swift b/pochak/pochak/UI/Profile/PostList/PochakPostTabmanViewController.swift index 4eb4317d..a8830f90 100644 --- a/pochak/pochak/UI/Profile/PostList/PochakPostTabmanViewController.swift +++ b/pochak/pochak/UI/Profile/PostList/PochakPostTabmanViewController.swift @@ -28,7 +28,7 @@ class PochakPostTabmanViewController: UIViewController { currentFetchingPage = 0 setUpCollectionView() - setUpRefreshControl() +// setUpRefreshControl() setUpData() } diff --git a/pochak/pochak/UI/Profile/PostList/PochakedPostTabmanViewController.swift b/pochak/pochak/UI/Profile/PostList/PochakedPostTabmanViewController.swift index d25fec62..b33ac56f 100644 --- a/pochak/pochak/UI/Profile/PostList/PochakedPostTabmanViewController.swift +++ b/pochak/pochak/UI/Profile/PostList/PochakedPostTabmanViewController.swift @@ -13,6 +13,8 @@ class PochakedPostTabmanViewController: UIViewController { var receivedHandle: String? var imageArray: [ProfilePostList] = [] + private let minimumLineSpacing: CGFloat = 9 + private let minimumInterItemSpacing: CGFloat = 8 private var isLastPage: Bool = false private var isCurrentlyFetching: Bool = false private var currentFetchingPage: Int = 0 @@ -28,7 +30,7 @@ class PochakedPostTabmanViewController: UIViewController { currentFetchingPage = 0 setUpCollectionView() - setUpRefreshControl() +// setUpRefreshControl() setUpData() } @@ -127,15 +129,15 @@ extension PochakedPostTabmanViewController : UICollectionViewDelegate, UICollect } func collectionView(_ collectionView: UICollectionView, layout collectionViewLayout: UICollectionViewLayout, minimumLineSpacingForSectionAt: Int) -> CGFloat { - return 5 + return minimumLineSpacing } func collectionView(_ collectionView: UICollectionView, layout collectionViewLayout: UICollectionViewLayout, minimumInteritemSpacingForSectionAt section: Int) -> CGFloat { - return 5 + return minimumInterItemSpacing } func collectionView(_ collectionView: UICollectionView, layout collectionViewLayout: UICollectionViewLayout, sizeForItemAt indexPath: IndexPath) -> CGSize { - let width = CGFloat((collectionView.frame.width - 10) / 3) + let width = CGFloat((collectionView.frame.width - (20 * 2) - (minimumInterItemSpacing * 2)) / 3) return CGSize(width: width, height: width * 4 / 3) } diff --git a/pochak/pochak/UI/Profile/ProfileTab.storyboard b/pochak/pochak/UI/Profile/ProfileTab.storyboard index c3c1ee0c..162f7e68 100644 --- a/pochak/pochak/UI/Profile/ProfileTab.storyboard +++ b/pochak/pochak/UI/Profile/ProfileTab.storyboard @@ -1,9 +1,9 @@ - + - + @@ -29,11 +29,11 @@ - - + + - - + + @@ -65,11 +65,11 @@ - - + + - + - + - + - @@ -695,7 +691,7 @@ - + @@ -715,7 +711,7 @@ - + @@ -729,10 +725,10 @@ - - + + - + @@ -752,7 +748,7 @@ - + @@ -766,9 +762,9 @@ - - - + + + @@ -858,11 +854,11 @@ - - + + - - + + @@ -872,7 +868,7 @@ - + @@ -304,13 +304,13 @@ - + @@ -358,7 +358,7 @@ - + @@ -859,11 +859,11 @@ - - + + - - + + @@ -888,6 +888,7 @@ + @@ -896,19 +897,19 @@ - + - + - + - + - + @@ -304,13 +304,13 @@ - + @@ -358,7 +358,7 @@ - + @@ -859,13 +859,13 @@ - + - + - + @@ -887,7 +887,6 @@ - @@ -896,19 +895,19 @@ - + - + - + - + - + - - + + - - + + - - + + - - - - - - - - - - - - - - - - - - - @@ -1015,9 +996,6 @@ - - - @@ -1044,7 +1022,7 @@ - + From 8c296b2f4a1a56834c184b0e0bd9fc3ee8650df3 Mon Sep 17 00:00:00 2001 From: Jungyeon Seo Date: Mon, 2 Dec 2024 23:29:52 +0900 Subject: [PATCH 38/54] =?UTF-8?q?Fix=20:=20=EC=8A=A4=ED=81=AC=EB=A1=A4?= =?UTF-8?q?=EB=B7=B0=20=ED=8E=98=EC=9D=B4=EC=A7=95=20=EC=88=98=EC=A0=95?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../OtherUserProfileViewController.swift | 47 +++++++------------ .../PochakPostTabmanViewController.swift | 28 +++++++++-- .../PochakedPostTabmanViewController.swift | 21 +++++---- 3 files changed, 55 insertions(+), 41 deletions(-) diff --git a/pochak/pochak/UI/Profile/OtherUserProfileViewController.swift b/pochak/pochak/UI/Profile/OtherUserProfileViewController.swift index 5ffd15c7..f8fcfa77 100644 --- a/pochak/pochak/UI/Profile/OtherUserProfileViewController.swift +++ b/pochak/pochak/UI/Profile/OtherUserProfileViewController.swift @@ -69,6 +69,8 @@ final class OtherUserProfileViewController: UIViewController { override func viewDidLoad() { super.viewDidLoad() + + // Notification 구독 addSubview() setUpUIConstraints() @@ -76,6 +78,7 @@ final class OtherUserProfileViewController: UIViewController { setUpNavigationBar() setUpViewController() setUpData() + initializeSingleTon() NotificationCenter.default.addObserver(self, selector: #selector(totalHeightUpdated), name: .didUpdateTotalHeight, object: nil) } @@ -214,6 +217,16 @@ final class OtherUserProfileViewController: UIViewController { topUIView.addSubview(postListTabmanView) } + private func initializeSingleTon() { + ProfileDataSingleton.shared.currentTabIndex = 0 + ProfileDataSingleton.shared.firstTabHeight = 0.0 + ProfileDataSingleton.shared.secondTabHeight = 0.0 + ProfileDataSingleton.shared.firstTabIsCurrentlyFetching = false + ProfileDataSingleton.shared.secondTabIsCurrentlyFetching = false + ProfileDataSingleton.shared.firstTabIsLastPage = false + ProfileDataSingleton.shared.secondTabIsLastPage = false + } + private func setUpUIConstraints() { contentScrollView.translatesAutoresizingMaskIntoConstraints = false topUIView.translatesAutoresizingMaskIntoConstraints = false @@ -412,6 +425,7 @@ final class OtherUserProfileViewController: UIViewController { deinit { // Observer 해제 NotificationCenter.default.removeObserver(self) + print("observer removed!") } } @@ -468,40 +482,15 @@ extension OtherUserProfileViewController: UIScrollViewDelegate { func scrollViewDidScroll(_ scrollView: UIScrollView) { if (contentScrollView.contentOffset.y > (contentScrollView.contentSize.height - contentScrollView.frame.size.height)) { print("has hit the bottom") - print("ProfileDataSingleton.shared.currentTabIndex :: \(ProfileDataSingleton.shared.currentTabIndex)") - if (!ProfileDataSingleton.shared.firstTabIsCurrentlyFetching && !ProfileDataSingleton.shared.firstTabIsLastPage) { - print("has hit the first tab bottom && reloading") - print("firstTabHeight : \(ProfileDataSingleton.shared.firstTabHeight)") - print("secondTabHeight : \(ProfileDataSingleton.shared.secondTabHeight)") - print("currentTabIndex : \(ProfileDataSingleton.shared.currentTabIndex)") - // Notification을 통해 TabmanVC에 데이터 새로고침을 요청 + print("bottom ProfileDataSingleton.shared.firstTabHeight :: \(ProfileDataSingleton.shared.firstTabHeight)") + print("bottom ProfileDataSingleton.shared.secondTabHeight :: \(ProfileDataSingleton.shared.secondTabHeight)") + if (ProfileDataSingleton.shared.currentTabIndex == 0 && !ProfileDataSingleton.shared.firstTabIsCurrentlyFetching && !ProfileDataSingleton.shared.firstTabIsLastPage) { NotificationCenter.default.post(name: .didHitBottom, object: nil) -// ProfileDataSingleton.shared.didHitBottom = true - } else if (!ProfileDataSingleton.shared.secondTabIsCurrentlyFetching && !ProfileDataSingleton.shared.secondTabIsLastPage){ + } else if (ProfileDataSingleton.shared.currentTabIndex == 1 && !ProfileDataSingleton.shared.secondTabIsCurrentlyFetching && !ProfileDataSingleton.shared.secondTabIsLastPage){ print("has hit the second tab bottom && reloading") - print("firstTabHeight : \(ProfileDataSingleton.shared.firstTabHeight)") - print("secondTabHeight : \(ProfileDataSingleton.shared.secondTabHeight)") - print("currentTabIndex : \(ProfileDataSingleton.shared.currentTabIndex)") // Notification을 통해 TabmanVC에 데이터 새로고침을 요청 NotificationCenter.default.post(name: .didHitBottom, object: nil) -// ProfileDataSingleton.shared.didHitBottom = true } -// } else if (currentTabIndex == 0 && firstTabHeight >= contentScrollView.frame.size.height) { -// print("firstTabHeight : \(firstTabHeight)") -// print("firstTabHeight contentScrollView.frame.size.height : \(contentScrollView.frame.size.height)") -// if (!isLastPage && !isCurrentlyFetching) { -// print("change of first tabman height") -// // Notification을 통해 TabmanVC에 데이터 새로고침을 요청 -// NotificationCenter.default.post(name: .didHitBottom, object: nil, userInfo: ["tabIndex": currentTabIndex]) -// } -// } else if (currentTabIndex == 1 && secondTabHeight >= contentScrollView.frame.size.height) { -// print("secondTabHeight : \(secondTabHeight)") -// print("secondTabHeight contentScrollView.frame.size.height : \(contentScrollView.frame.size.height)") -// if (!isLastPage && !isCurrentlyFetching) { -// print("change of second tabman height") -// // Notification을 통해 TabmanVC에 데이터 새로고침을 요청 -// NotificationCenter.default.post(name: .didHitBottom, object: nil, userInfo: ["tabIndex": currentTabIndex]) -// } } } } diff --git a/pochak/pochak/UI/Profile/PostList/PochakPostTabmanViewController.swift b/pochak/pochak/UI/Profile/PostList/PochakPostTabmanViewController.swift index 1a682f09..9ead6177 100644 --- a/pochak/pochak/UI/Profile/PostList/PochakPostTabmanViewController.swift +++ b/pochak/pochak/UI/Profile/PostList/PochakPostTabmanViewController.swift @@ -28,17 +28,26 @@ final class PochakPostTabmanViewController: UIViewController { override func viewDidLoad() { super.viewDidLoad() + print("inside PochakPostTabmanViewController viewdidload!!") + NotificationCenter.default.addObserver(self, selector: #selector(didReceiveRefreshRequest), name: .didHitBottom, object: nil) currentFetchingPage = 0 setUpCollectionView() setUpData() } - override func viewDidLayoutSubviews() { - super.viewDidLayoutSubviews() + override func viewDidAppear(_ animated: Bool) { + super.viewDidAppear(animated) + print("inside viewDidAppear!!") calculateCurentHeight() } +// override func viewDidLayoutSubviews() { +// super.viewDidLayoutSubviews() +// print("inside viewDidLayoutSubviews!!") +// } + + // MARK: - Functions private func setUpCollectionView() { @@ -74,9 +83,18 @@ final class PochakPostTabmanViewController: UIViewController { } } + private func initializeSingleTon() { + ProfileDataSingleton.shared.currentTabIndex = 0 + ProfileDataSingleton.shared.firstTabHeight = 0.0 + ProfileDataSingleton.shared.secondTabHeight = 0.0 + ProfileDataSingleton.shared.firstTabIsCurrentlyFetching = false + ProfileDataSingleton.shared.secondTabIsCurrentlyFetching = false + ProfileDataSingleton.shared.firstTabIsLastPage = false + ProfileDataSingleton.shared.secondTabIsLastPage = false + } + func setUpData() { isCurrentlyFetching = true -// NotificationCenter.default.post(name: .didStartFetchingData, object: nil, userInfo: ["tabIndex": currentTabIndex]) ProfileDataSingleton.shared.secondTabIsCurrentlyFetching = true let request = ProfileRetrievalRequest(page: currentFetchingPage) if let handle = receivedHandle { @@ -103,7 +121,6 @@ final class PochakPostTabmanViewController: UIViewController { self?.isLastPage = data.result.pageInfo.lastPage if self?.isLastPage == true { -// NotificationCenter.default.post(name: .didReachLastPage, object: nil, userInfo: ["tabIndex": self?.currentTabIndex]) ProfileDataSingleton.shared.secondTabIsLastPage = true } @@ -118,6 +135,9 @@ final class PochakPostTabmanViewController: UIViewController { self?.isCurrentlyFetching = false ProfileDataSingleton.shared.secondTabIsCurrentlyFetching = false self?.currentFetchingPage += 1; + + self?.calculateCurentHeight() + } } } else { diff --git a/pochak/pochak/UI/Profile/PostList/PochakedPostTabmanViewController.swift b/pochak/pochak/UI/Profile/PostList/PochakedPostTabmanViewController.swift index d5504f9d..2f075bcf 100644 --- a/pochak/pochak/UI/Profile/PostList/PochakedPostTabmanViewController.swift +++ b/pochak/pochak/UI/Profile/PostList/PochakedPostTabmanViewController.swift @@ -28,22 +28,25 @@ class PochakedPostTabmanViewController: UIViewController { override func viewDidLoad() { super.viewDidLoad() + print("inside PochakedPostTabmanViewController viewdidload!!") NotificationCenter.default.addObserver(self, selector: #selector(didReceiveRefreshRequest), name: .didHitBottom, object: nil) currentFetchingPage = 0 setUpCollectionView() setUpData() - - // storyboard에서 OtherVC 인스턴스를 가져오기 - if let otherUserProfileVC = storyboard?.instantiateViewController(withIdentifier: "OtherUserProfileVC") as? OtherUserProfileViewController { - self.otherUserProfileVC = otherUserProfileVC - } } - override func viewDidLayoutSubviews() { - super.viewDidLayoutSubviews() + override func viewDidAppear(_ animated: Bool) { + super.viewDidAppear(animated) + print("inside viewDidAppear!!") calculateCurentHeight() } +// override func viewDidLayoutSubviews() { +// super.viewDidLayoutSubviews() +// print("inside viewDidLayoutSubviews!!") +// calculateCurentHeight() +// } + // MARK: - Functions private func setUpCollectionView() { @@ -55,6 +58,7 @@ class PochakedPostTabmanViewController: UIViewController { postCollectionView.isScrollEnabled = false postCollectionView.backgroundColor = .green } + private func calculateCurentHeight() { DispatchQueue.main.async { @@ -82,7 +86,6 @@ class PochakedPostTabmanViewController: UIViewController { func setUpData() { isCurrentlyFetching = true -// NotificationCenter.default.post(name: .didStartFetchingData, object: nil, userInfo: ["tabIndex": currentTabIndex]) ProfileDataSingleton.shared.firstTabIsCurrentlyFetching = true let request = ProfileRetrievalRequest(page: currentFetchingPage) if let handle = receivedHandle { @@ -127,6 +130,8 @@ class PochakedPostTabmanViewController: UIViewController { self?.isCurrentlyFetching = false ProfileDataSingleton.shared.firstTabIsCurrentlyFetching = false self?.currentFetchingPage += 1 + self?.calculateCurentHeight() + } } } else { From d25079052a5abb4adee814bf562eba47c618097f Mon Sep 17 00:00:00 2001 From: Jungyeon Seo Date: Tue, 3 Dec 2024 00:03:00 +0900 Subject: [PATCH 39/54] =?UTF-8?q?Add=20:=20=ED=94=84=EB=A1=9C=ED=95=84=20?= =?UTF-8?q?=EB=8D=B0=EC=9D=B4=ED=84=B0=20=EA=B4=80=EB=A6=AC=20=EC=9C=84?= =?UTF-8?q?=ED=95=9C=20singleton=20=ED=8C=8C=EC=9D=BC=20=EC=B6=94=EA=B0=80?= =?UTF-8?q?=ED=95=98=EC=97=AC?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- pochak/pochak/Global/Extensions/Notification+.swift | 13 +++++++++++++ 1 file changed, 13 insertions(+) create mode 100644 pochak/pochak/Global/Extensions/Notification+.swift diff --git a/pochak/pochak/Global/Extensions/Notification+.swift b/pochak/pochak/Global/Extensions/Notification+.swift new file mode 100644 index 00000000..11fe574d --- /dev/null +++ b/pochak/pochak/Global/Extensions/Notification+.swift @@ -0,0 +1,13 @@ +// +// Notification.swift +// pochak +// +// Created by Seo Cindy on 12/2/24. +// + +import Foundation + +extension Notification.Name { + static let didUpdateTotalHeight = Notification.Name("didUpdateTotalHeight") + static let didHitBottom = Notification.Name("didHitBottom") +} From a7d6319a2e15c2d9fac00ef3acd480fe540915dc Mon Sep 17 00:00:00 2001 From: Jungyeon Seo Date: Tue, 3 Dec 2024 00:03:10 +0900 Subject: [PATCH 40/54] =?UTF-8?q?Fix=20:=20=ED=8E=98=EC=9D=B4=EC=A7=95=20?= =?UTF-8?q?=EC=88=98=EC=A0=95?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- pochak/pochak.xcodeproj/project.pbxproj | 4 + .../OtherUserProfileViewController.swift | 120 ++++++------------ .../PochakPostTabmanViewController.swift | 96 +++++--------- .../PochakedPostTabmanViewController.swift | 93 +++++--------- .../PostList/PostListViewController.swift | 3 - .../UI/Profile/ProfileDataSingleton.swift | 27 +++- 6 files changed, 135 insertions(+), 208 deletions(-) diff --git a/pochak/pochak.xcodeproj/project.pbxproj b/pochak/pochak.xcodeproj/project.pbxproj index a5d9fbf4..6a00baab 100644 --- a/pochak/pochak.xcodeproj/project.pbxproj +++ b/pochak/pochak.xcodeproj/project.pbxproj @@ -172,6 +172,7 @@ 37D311E32B56754D00A1D7C1 /* GetToken.swift in Sources */ = {isa = PBXBuildFile; fileRef = 37D311E22B56754D00A1D7C1 /* GetToken.swift */; }; 37D311E52B567AE000A1D7C1 /* OtherUserProfileViewController.swift in Sources */ = {isa = PBXBuildFile; fileRef = 37D311E42B567AE000A1D7C1 /* OtherUserProfileViewController.swift */; }; 37EED79D2CFDDC3800254471 /* ProfileDataSingleton.swift in Sources */ = {isa = PBXBuildFile; fileRef = 37EED79C2CFDDC1F00254471 /* ProfileDataSingleton.swift */; }; + 37EED79F2CFDFE9100254471 /* Notification+.swift in Sources */ = {isa = PBXBuildFile; fileRef = 37EED79E2CFDFE9100254471 /* Notification+.swift */; }; A6D48ED7F8B86CF57C481991 /* Pods_pochak_pochakUITests.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = BC75B5747D3AC9026B862E11 /* Pods_pochak_pochakUITests.framework */; }; AF5AAB97DDEAC75EAEDDCFE4 /* Pods_pochak.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = A65A7656D9D72CC873C98FD4 /* Pods_pochak.framework */; }; EA01079A2A59556800A3AE85 /* CommentViewController.swift in Sources */ = {isa = PBXBuildFile; fileRef = EA0107952A59556800A3AE85 /* CommentViewController.swift */; }; @@ -419,6 +420,7 @@ 37D311E22B56754D00A1D7C1 /* GetToken.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = GetToken.swift; sourceTree = ""; }; 37D311E42B567AE000A1D7C1 /* OtherUserProfileViewController.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = OtherUserProfileViewController.swift; sourceTree = ""; }; 37EED79C2CFDDC1F00254471 /* ProfileDataSingleton.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = ProfileDataSingleton.swift; sourceTree = ""; }; + 37EED79E2CFDFE9100254471 /* Notification+.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = "Notification+.swift"; sourceTree = ""; }; 67EA6B5B881844A22EE2A55B /* Pods-pochak.debug.xcconfig */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = text.xcconfig; name = "Pods-pochak.debug.xcconfig"; path = "Target Support Files/Pods-pochak/Pods-pochak.debug.xcconfig"; sourceTree = ""; }; 6E1916A70A802F298FF38F24 /* Pods_pochakTests.framework */ = {isa = PBXFileReference; explicitFileType = wrapper.framework; includeInIndex = 0; path = Pods_pochakTests.framework; sourceTree = BUILT_PRODUCTS_DIR; }; 9D5440AA571B5DB6291304B2 /* Pods-pochakTests.debug.xcconfig */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = text.xcconfig; name = "Pods-pochakTests.debug.xcconfig"; path = "Target Support Files/Pods-pochakTests/Pods-pochakTests.debug.xcconfig"; sourceTree = ""; }; @@ -859,6 +861,7 @@ 08E8DCDB2C38118000EC78C2 /* UILabel+.swift */, 08EB99B32C53D76C00FAC08A /* UIScrollView+.swift */, 0889D1372C5CB69F00206C86 /* String+.swift */, + 37EED79E2CFDFE9100254471 /* Notification+.swift */, ); path = Extensions; sourceTree = ""; @@ -1767,6 +1770,7 @@ 374261642C2FEF5F00B67886 /* ProfileMenuViewController.swift in Sources */, 3759CF372CAAE79F00408A4E /* FollowingRetrievalAPI.swift in Sources */, EAC582742C3074EA006F44AF /* UIColor+.swift in Sources */, + 37EED79F2CFDFE9100254471 /* Notification+.swift in Sources */, 3769D6BB2B3C347000294CD1 /* FollowListViewController.swift in Sources */, 376EA1292CAAADCF00FEFB63 /* ProfileRetrievalAPI.swift in Sources */, EA96D0522C8F186900D80562 /* TagApproveAPI.swift in Sources */, diff --git a/pochak/pochak/UI/Profile/OtherUserProfileViewController.swift b/pochak/pochak/UI/Profile/OtherUserProfileViewController.swift index f8fcfa77..5dadfdbb 100644 --- a/pochak/pochak/UI/Profile/OtherUserProfileViewController.swift +++ b/pochak/pochak/UI/Profile/OtherUserProfileViewController.swift @@ -6,15 +6,12 @@ // import UIKit +import Foundation protocol SecondViewControllerDelegate: AnyObject { func dismissSecondViewController() } -protocol TabIndexDelegate: AnyObject { - func getCurrentTabIndex(index : Int) -} - final class OtherUserProfileViewController: UIViewController { // MARK: - Properties @@ -32,8 +29,7 @@ final class OtherUserProfileViewController: UIViewController { private let contentScrollView: UIScrollView = { let scrollView = UIScrollView() scrollView.translatesAutoresizingMaskIntoConstraints = false - // scrollView.backgroundColor = UIColor(named: "gray01") - scrollView.backgroundColor = .red + scrollView.backgroundColor = UIColor(named: "gray01") scrollView.showsVerticalScrollIndicator = false return scrollView @@ -69,16 +65,13 @@ final class OtherUserProfileViewController: UIViewController { override func viewDidLoad() { super.viewDidLoad() - - - // Notification 구독 addSubview() setUpUIConstraints() setUpRefreshControl() setUpNavigationBar() setUpViewController() setUpData() - initializeSingleTon() + initializeSingleton() NotificationCenter.default.addObserver(self, selector: #selector(totalHeightUpdated), name: .didUpdateTotalHeight, object: nil) } @@ -129,6 +122,11 @@ final class OtherUserProfileViewController: UIViewController { } } + @IBAction func updateProfile(_ sender: Any) { + guard let updateProfileVC = self.storyboard?.instantiateViewController(withIdentifier: "UpdateProfileVC") as? UpdateProfileViewController else {return} + self.navigationController?.pushViewController(updateProfileVC, animated: true) + } + @objc private func viewFollowerTapped() { guard let followListVC = self.storyboard?.instantiateViewController(withIdentifier: "FollowListVC") as? FollowListViewController else {return} followListVC.index = 0 @@ -156,15 +154,11 @@ final class OtherUserProfileViewController: UIViewController { sheet?.prefersGrabberVisible = true sheet?.prefersScrollingExpandsWhenScrolledToEdge = false - // delegate 채택 profileMenuVC.delegate = self present(profileMenuVC, animated: true) } @objc private func refreshData(_ sender: Any) { - print("refresh") - // imageArray = [] - // currentFetchingPage = 0 setUpData() DispatchQueue.main.asyncAfter(deadline: .now() + 0.5) { self.contentScrollView.refreshControl?.endRefreshing() @@ -172,13 +166,11 @@ final class OtherUserProfileViewController: UIViewController { } @objc private func totalHeightUpdated() { - // TotalHeight를 받아서 사용 - print("totalHeightUpdated : \(ProfileDataSingleton.shared.firstTabHeight)") - print("totalHeightUpdated : \(ProfileDataSingleton.shared.currentTabIndex)") - ProfileDataSingleton.shared.currentTabIndex == 0 ? (updatePostListTabmanViewHeight(ProfileDataSingleton.shared.firstTabHeight)) : (updatePostListTabmanViewHeight(ProfileDataSingleton.shared.secondTabHeight)) + ProfileDataSingleton.shared.currentTabIndex == 0 ? + (updatePostListTabmanViewHeight(ProfileDataSingleton.shared.firstTabHeight)) : + (updatePostListTabmanViewHeight(ProfileDataSingleton.shared.secondTabHeight)) } - // MARK: - Functions func updatePostListTabmanViewHeight(_ height: CGFloat) { @@ -203,30 +195,15 @@ final class OtherUserProfileViewController: UIViewController { width: self.contentScrollView.frame.width, height: self.topUIView.frame.height ) - print("contentScrollView.contentSize : \(self.contentScrollView.contentSize)") - } } - private func addSubview() { self.view.addSubview(contentScrollView) - topUIView.backgroundColor = .yellow contentScrollView.addSubview(topUIView) - postListTabmanView.backgroundColor = .green topUIView.addSubview(postListTabmanView) } - private func initializeSingleTon() { - ProfileDataSingleton.shared.currentTabIndex = 0 - ProfileDataSingleton.shared.firstTabHeight = 0.0 - ProfileDataSingleton.shared.secondTabHeight = 0.0 - ProfileDataSingleton.shared.firstTabIsCurrentlyFetching = false - ProfileDataSingleton.shared.secondTabIsCurrentlyFetching = false - ProfileDataSingleton.shared.firstTabIsLastPage = false - ProfileDataSingleton.shared.secondTabIsLastPage = false - } - private func setUpUIConstraints() { contentScrollView.translatesAutoresizingMaskIntoConstraints = false topUIView.translatesAutoresizingMaskIntoConstraints = false @@ -239,8 +216,6 @@ final class OtherUserProfileViewController: UIViewController { profileImage.translatesAutoresizingMaskIntoConstraints = false updateProfileBtn.translatesAutoresizingMaskIntoConstraints = false - - NSLayoutConstraint.activate([ contentScrollView.topAnchor.constraint(equalTo: view.topAnchor), contentScrollView.leadingAnchor.constraint(equalTo: view.leadingAnchor), @@ -250,10 +225,10 @@ final class OtherUserProfileViewController: UIViewController { let scrollContentGuide = contentScrollView.contentLayoutGuide NSLayoutConstraint.activate([ - // topUIView topUIView.topAnchor.constraint(equalTo: scrollContentGuide.topAnchor), topUIView.leadingAnchor.constraint(equalTo: view.leadingAnchor), topUIView.trailingAnchor.constraint(equalTo: view.trailingAnchor), + topUIView.bottomAnchor.constraint(equalTo: postListTabmanView.bottomAnchor), // Dynamic height for topUIView profileBackground.topAnchor.constraint(equalTo: topUIView.topAnchor, constant: 20), profileBackground.leadingAnchor.constraint(equalTo: topUIView.leadingAnchor, constant: 20), @@ -281,14 +256,10 @@ final class OtherUserProfileViewController: UIViewController { followToggleBtn.leadingAnchor.constraint(equalTo: whiteBackground.leadingAnchor), followToggleBtn.trailingAnchor.constraint(equalTo: whiteBackground.trailingAnchor), - // postListTabmanView postListTabmanView.topAnchor.constraint(equalTo: followToggleBtn.bottomAnchor, constant: 5), postListTabmanView.leadingAnchor.constraint(equalTo: topUIView.leadingAnchor), postListTabmanView.trailingAnchor.constraint(equalTo: topUIView.trailingAnchor), postListTabmanView.heightAnchor.constraint(equalTo: scrollContentGuide.heightAnchor), - - // Dynamic height for topUIView - topUIView.bottomAnchor.constraint(equalTo: postListTabmanView.bottomAnchor), ]) } @@ -297,12 +268,6 @@ final class OtherUserProfileViewController: UIViewController { contentScrollView.refreshControl?.addTarget(self, action: #selector(refreshData(_:)), for: .valueChanged) } - - @IBAction func updateProfile(_ sender: Any) { - guard let updateProfileVC = self.storyboard?.instantiateViewController(withIdentifier: "UpdateProfileVC") as? UpdateProfileViewController else {return} - self.navigationController?.pushViewController(updateProfileVC, animated: true) - } - private func setUpNavigationBar() { navigationController?.isNavigationBarHidden = false navigationController?.hidesBarsOnSwipe = true @@ -315,28 +280,14 @@ final class OtherUserProfileViewController: UIViewController { profileBackground.layer.cornerRadius = 58 profileImage.layer.cornerRadius = 55 profileImage.contentMode = .scaleAspectFill - whiteBackground.layer.cornerRadius = 8 followToggleBtn.layer.cornerRadius = 8 - viewFollowerList() viewFollowingList() - updateProfileBtn.layer.isHidden = true - contentScrollView.delegate = self } - private func viewFollowerList() { // UITapGestureRecognizer 사용 - let tapGestureRecognizer = UITapGestureRecognizer(target: self, action: #selector(viewFollowerTapped)) - followerList.addGestureRecognizer(tapGestureRecognizer) - } - - private func viewFollowingList() { // UITapGestureRecognizer 사용 - let tapGestureRecognizer = UITapGestureRecognizer(target: self, action: #selector(viewFollowingTapped)) - followingList.addGestureRecognizer(tapGestureRecognizer) - } - private func setUpData() { let request = ProfileRetrievalRequest(page: 0) if let handle = receivedHandle { @@ -365,9 +316,6 @@ final class OtherUserProfileViewController: UIViewController { return } - print("=== Profile, setup data succeeded ===") - print("== data: \(data)") - // load 프로필 이미지 if let url = URL(string: data.result.profileImage ?? "") { self.profileImage.load(with: url) @@ -384,6 +332,26 @@ final class OtherUserProfileViewController: UIViewController { } } + private func initializeSingleton() { + ProfileDataSingleton.shared.currentTabIndex = 0 + ProfileDataSingleton.shared.firstTabHeight = 0.0 + ProfileDataSingleton.shared.secondTabHeight = 0.0 + ProfileDataSingleton.shared.firstTabIsCurrentlyFetching = false + ProfileDataSingleton.shared.secondTabIsCurrentlyFetching = false + ProfileDataSingleton.shared.firstTabIsLastPage = false + ProfileDataSingleton.shared.secondTabIsLastPage = false + } + + private func viewFollowerList() { // UITapGestureRecognizer 사용 + let tapGestureRecognizer = UITapGestureRecognizer(target: self, action: #selector(viewFollowerTapped)) + followerList.addGestureRecognizer(tapGestureRecognizer) + } + + private func viewFollowingList() { // UITapGestureRecognizer 사용 + let tapGestureRecognizer = UITapGestureRecognizer(target: self, action: #selector(viewFollowingTapped)) + followingList.addGestureRecognizer(tapGestureRecognizer) + } + private func setUpResponseData(_ responseData: ProfileRetrievalResult) { self.userName.text = String(responseData.name ?? "") self.userMessage.text = String(responseData.message ?? "") @@ -422,10 +390,9 @@ final class OtherUserProfileViewController: UIViewController { } } } + deinit { - // Observer 해제 NotificationCenter.default.removeObserver(self) - print("observer removed!") } } @@ -481,25 +448,16 @@ extension OtherUserProfileViewController: UIScrollViewDelegate { func scrollViewDidScroll(_ scrollView: UIScrollView) { if (contentScrollView.contentOffset.y > (contentScrollView.contentSize.height - contentScrollView.frame.size.height)) { - print("has hit the bottom") - print("bottom ProfileDataSingleton.shared.firstTabHeight :: \(ProfileDataSingleton.shared.firstTabHeight)") - print("bottom ProfileDataSingleton.shared.secondTabHeight :: \(ProfileDataSingleton.shared.secondTabHeight)") - if (ProfileDataSingleton.shared.currentTabIndex == 0 && !ProfileDataSingleton.shared.firstTabIsCurrentlyFetching && !ProfileDataSingleton.shared.firstTabIsLastPage) { + if (ProfileDataSingleton.shared.currentTabIndex == 0 && + !ProfileDataSingleton.shared.firstTabIsCurrentlyFetching && + !ProfileDataSingleton.shared.firstTabIsLastPage) { NotificationCenter.default.post(name: .didHitBottom, object: nil) - } else if (ProfileDataSingleton.shared.currentTabIndex == 1 && !ProfileDataSingleton.shared.secondTabIsCurrentlyFetching && !ProfileDataSingleton.shared.secondTabIsLastPage){ + } else if (ProfileDataSingleton.shared.currentTabIndex == 1 && + !ProfileDataSingleton.shared.secondTabIsCurrentlyFetching && + !ProfileDataSingleton.shared.secondTabIsLastPage) { print("has hit the second tab bottom && reloading") - // Notification을 통해 TabmanVC에 데이터 새로고침을 요청 NotificationCenter.default.post(name: .didHitBottom, object: nil) } } } } - -extension Notification.Name { - static let didUpdateTotalHeight = Notification.Name("didUpdateTotalHeight") - static let didHitBottom = Notification.Name("didHitBottom") - static let didReachLastPage = Notification.Name("didReachLastPage") - static let didStartFetchingData = Notification.Name("didStartFetchingData") - static let didFinishFetchingData = Notification.Name("didFinishFetchingData") - static let sendTabIndex = Notification.Name("sendTabIndex") -} diff --git a/pochak/pochak/UI/Profile/PostList/PochakPostTabmanViewController.swift b/pochak/pochak/UI/Profile/PostList/PochakPostTabmanViewController.swift index 9ead6177..a40ea684 100644 --- a/pochak/pochak/UI/Profile/PostList/PochakPostTabmanViewController.swift +++ b/pochak/pochak/UI/Profile/PostList/PochakPostTabmanViewController.swift @@ -17,7 +17,6 @@ final class PochakPostTabmanViewController: UIViewController { private var currentFetchingPage: Int = 0 private let minimumLineSpacing: CGFloat = 9 private let minimumInterItemSpacing: CGFloat = 8 - private let currentTabIndex:Int = 1 private var isLastPage: Bool = false // MARK: - Views @@ -29,69 +28,26 @@ final class PochakPostTabmanViewController: UIViewController { override func viewDidLoad() { super.viewDidLoad() print("inside PochakPostTabmanViewController viewdidload!!") - + NotificationCenter.default.addObserver(self, selector: #selector(didReceiveRefreshRequest), name: .didHitBottom, object: nil) currentFetchingPage = 0 - setUpCollectionView() setUpData() + setUpCollectionView() } override func viewDidAppear(_ animated: Bool) { super.viewDidAppear(animated) - print("inside viewDidAppear!!") calculateCurentHeight() } + // MARK: - Actions -// override func viewDidLayoutSubviews() { -// super.viewDidLayoutSubviews() -// print("inside viewDidLayoutSubviews!!") -// } - - - // MARK: - Functions - - private func setUpCollectionView() { - postCollectionView.delegate = self - postCollectionView.dataSource = self - postCollectionView.register( - UINib(nibName: ProfilePostCollectionViewCell.identifier, bundle: nil), - forCellWithReuseIdentifier: ProfilePostCollectionViewCell.identifier) - postCollectionView.isScrollEnabled = false - } - - private func calculateCurentHeight() { - DispatchQueue.main.async { - if let flowLayout = self.postCollectionView.collectionViewLayout as? UICollectionViewFlowLayout { - let delegateInsets = (self.collectionView( - self.postCollectionView, - layout: flowLayout, - insetForSectionAt: 0 - )) - print("Delegate Insets: \(delegateInsets)") - - // UIEdgeInsets의 top, bottom 값 추출 - let topInset = delegateInsets.top - let bottomInset = delegateInsets.bottom - print("Delegate Insets - Top: \(topInset), Bottom: \(bottomInset)") - let contentHeight = self.postCollectionView.collectionViewLayout.collectionViewContentSize.height - print("contentHeight : \(contentHeight)") - let totalHeight = contentHeight + topInset + bottomInset - print("Total height with section insets: \(totalHeight)") - ProfileDataSingleton.shared.secondTabHeight = totalHeight - NotificationCenter.default.post(name: .didUpdateTotalHeight, object: nil) - } + @objc private func didReceiveRefreshRequest(_ notification: Notification) { + if ProfileDataSingleton.shared.currentTabIndex == 1 { + setUpData() } } - private func initializeSingleTon() { - ProfileDataSingleton.shared.currentTabIndex = 0 - ProfileDataSingleton.shared.firstTabHeight = 0.0 - ProfileDataSingleton.shared.secondTabHeight = 0.0 - ProfileDataSingleton.shared.firstTabIsCurrentlyFetching = false - ProfileDataSingleton.shared.secondTabIsCurrentlyFetching = false - ProfileDataSingleton.shared.firstTabIsLastPage = false - ProfileDataSingleton.shared.secondTabIsLastPage = false - } + // MARK: - Functions func setUpData() { isCurrentlyFetching = true @@ -127,17 +83,13 @@ final class PochakPostTabmanViewController: UIViewController { DispatchQueue.main.async { if self?.currentFetchingPage == 0 { self?.postCollectionView.reloadData() // collectionView를 새로고침하여 이미지 업데이트 - print(">>>>>>> PochakPostDataManager is currently reloading!!!!!!!") } else { self?.postCollectionView.insertItems(at: newIndexPaths) - print(">>>>>>> PochakPostDataManager is currently fethcing!!!!!!!") } self?.isCurrentlyFetching = false ProfileDataSingleton.shared.secondTabIsCurrentlyFetching = false self?.currentFetchingPage += 1; - self?.calculateCurentHeight() - } } } else { @@ -145,19 +97,37 @@ final class PochakPostTabmanViewController: UIViewController { } } - @objc private func didReceiveRefreshRequest(_ notification: Notification) { - if ProfileDataSingleton.shared.currentTabIndex == 1 { - print("Second tab received didHitBottom notification!") - // 알림 처리 로직 - setUpData() + private func setUpCollectionView() { + postCollectionView.delegate = self + postCollectionView.dataSource = self + postCollectionView.register( + UINib(nibName: ProfilePostCollectionViewCell.identifier, bundle: nil), + forCellWithReuseIdentifier: ProfilePostCollectionViewCell.identifier) + postCollectionView.isScrollEnabled = false + } + + private func calculateCurentHeight() { + DispatchQueue.main.async { + if let flowLayout = self.postCollectionView.collectionViewLayout as? UICollectionViewFlowLayout { + let delegateInsets = (self.collectionView( + self.postCollectionView, + layout: flowLayout, + insetForSectionAt: 0 + )) + + // UIEdgeInsets의 top, bottom 값 추출 + let topInset = delegateInsets.top + let bottomInset = delegateInsets.bottom + let contentHeight = self.postCollectionView.collectionViewLayout.collectionViewContentSize.height + let totalHeight = contentHeight + topInset + bottomInset + ProfileDataSingleton.shared.secondTabHeight = totalHeight + } } } deinit { - // Observer 해제 NotificationCenter.default.removeObserver(self) } - } // MARK: - Extension : UICollectionViewDelegate, UICollectionViewDataSource, UICollectionViewDelegateFlowLayout, UIScrollViewDelegate @@ -165,7 +135,6 @@ final class PochakPostTabmanViewController: UIViewController { extension PochakPostTabmanViewController : UICollectionViewDelegate, UICollectionViewDataSource, UICollectionViewDelegateFlowLayout { func collectionView(_ collectionView: UICollectionView, numberOfItemsInSection section: Int) -> Int { - print("===imageArray.count:\(imageArray.count)===") return max(0,(imageArray.count)) } @@ -197,7 +166,6 @@ extension PochakPostTabmanViewController : UICollectionViewDelegate, UICollectio return CGSize(width: width, height: width * 4 / 3) } - // post 클릭 시 해당 post로 이동 func collectionView(_ collectionView: UICollectionView, didSelectItemAt indexPath: IndexPath) { let exploreTabSb = UIStoryboard(name: "ExploreTab", bundle: nil) guard let postVC = exploreTabSb.instantiateViewController(withIdentifier: "PostVC") as? PostViewController diff --git a/pochak/pochak/UI/Profile/PostList/PochakedPostTabmanViewController.swift b/pochak/pochak/UI/Profile/PostList/PochakedPostTabmanViewController.swift index 2f075bcf..3b1a0968 100644 --- a/pochak/pochak/UI/Profile/PostList/PochakedPostTabmanViewController.swift +++ b/pochak/pochak/UI/Profile/PostList/PochakedPostTabmanViewController.swift @@ -6,16 +6,15 @@ // import UIKit +import Foundation class PochakedPostTabmanViewController: UIViewController { // MARK: - Properties var receivedHandle: String? var imageArray: [ProfilePostList]! = [] - var otherUserProfileVC: OtherUserProfileViewController? private var isCurrentlyFetching: Bool = false private var currentFetchingPage: Int = 0 - private let currentTabIndex: Int = 0 private let minimumLineSpacing: CGFloat = 9 private let minimumInterItemSpacing: CGFloat = 8 private var isLastPage: Bool = false @@ -28,62 +27,27 @@ class PochakedPostTabmanViewController: UIViewController { override func viewDidLoad() { super.viewDidLoad() - print("inside PochakedPostTabmanViewController viewdidload!!") NotificationCenter.default.addObserver(self, selector: #selector(didReceiveRefreshRequest), name: .didHitBottom, object: nil) currentFetchingPage = 0 - setUpCollectionView() setUpData() + setUpCollectionView() } override func viewDidAppear(_ animated: Bool) { super.viewDidAppear(animated) - print("inside viewDidAppear!!") calculateCurentHeight() } + + // MARK: - Actions -// override func viewDidLayoutSubviews() { -// super.viewDidLayoutSubviews() -// print("inside viewDidLayoutSubviews!!") -// calculateCurentHeight() -// } - - // MARK: - Functions - - private func setUpCollectionView() { - postCollectionView.delegate = self - postCollectionView.dataSource = self - postCollectionView.register( - UINib(nibName: ProfilePostCollectionViewCell.identifier, bundle: nil), - forCellWithReuseIdentifier: ProfilePostCollectionViewCell.identifier) - postCollectionView.isScrollEnabled = false - postCollectionView.backgroundColor = .green - } - - - private func calculateCurentHeight() { - DispatchQueue.main.async { - if let flowLayout = self.postCollectionView.collectionViewLayout as? UICollectionViewFlowLayout { - let delegateInsets = (self.collectionView( - self.postCollectionView, - layout: flowLayout, - insetForSectionAt: 0 - )) - print("Delegate Insets: \(delegateInsets)") - - // UIEdgeInsets의 top, bottom 값 추출 - let topInset = delegateInsets.top - let bottomInset = delegateInsets.bottom - print("Delegate Insets - Top: \(topInset), Bottom: \(bottomInset)") - let contentHeight = self.postCollectionView.collectionViewLayout.collectionViewContentSize.height - print("contentHeight : \(contentHeight)") - let totalHeight = contentHeight + topInset + bottomInset - print("Total height with section insets: \(totalHeight)") - ProfileDataSingleton.shared.firstTabHeight = totalHeight - NotificationCenter.default.post(name: .didUpdateTotalHeight, object: nil) - } + @objc private func didReceiveRefreshRequest(_ notification: Notification) { + if ProfileDataSingleton.shared.currentTabIndex == 0 { + setUpData() } } + // MARK: - Functions + func setUpData() { isCurrentlyFetching = true ProfileDataSingleton.shared.firstTabIsCurrentlyFetching = true @@ -106,11 +70,8 @@ class PochakedPostTabmanViewController: UIViewController { let newPosts = data.result.postList let startIndex = self?.imageArray.count - print("startIndex : \(String(describing: startIndex))") let endIndex = startIndex! + newPosts.count - print("endIndex : \(endIndex)") let newIndexPaths = (startIndex!..>>>>>> PochakedPostDataManager is currently reloading!!!!!!!") } else { self?.postCollectionView.insertItems(at: newIndexPaths) - print(">>>>>>> PochakedPostDataManager is currently fethcing!!!!!!!") } self?.isCurrentlyFetching = false ProfileDataSingleton.shared.firstTabIsCurrentlyFetching = false self?.currentFetchingPage += 1 self?.calculateCurentHeight() - } } } else { @@ -139,16 +96,36 @@ class PochakedPostTabmanViewController: UIViewController { } } - @objc private func didReceiveRefreshRequest(_ notification: Notification) { - - if ProfileDataSingleton.shared.currentTabIndex == 0 { - print("First tab received didHitBottom notification!") - setUpData() + private func setUpCollectionView() { + postCollectionView.delegate = self + postCollectionView.dataSource = self + postCollectionView.register( + UINib(nibName: ProfilePostCollectionViewCell.identifier, bundle: nil), + forCellWithReuseIdentifier: ProfilePostCollectionViewCell.identifier) + postCollectionView.isScrollEnabled = false + postCollectionView.backgroundColor = .green + } + + private func calculateCurentHeight() { + DispatchQueue.main.async { + if let flowLayout = self.postCollectionView.collectionViewLayout as? UICollectionViewFlowLayout { + let delegateInsets = (self.collectionView( + self.postCollectionView, + layout: flowLayout, + insetForSectionAt: 0 + )) + + // UIEdgeInsets의 top, bottom 값 추출 + let topInset = delegateInsets.top + let bottomInset = delegateInsets.bottom + let contentHeight = self.postCollectionView.collectionViewLayout.collectionViewContentSize.height + let totalHeight = contentHeight + topInset + bottomInset + ProfileDataSingleton.shared.firstTabHeight = totalHeight + } } } deinit { - // Observer 해제 NotificationCenter.default.removeObserver(self) } } diff --git a/pochak/pochak/UI/Profile/PostList/PostListViewController.swift b/pochak/pochak/UI/Profile/PostList/PostListViewController.swift index ff449acf..414e2983 100644 --- a/pochak/pochak/UI/Profile/PostList/PostListViewController.swift +++ b/pochak/pochak/UI/Profile/PostList/PostListViewController.swift @@ -75,17 +75,14 @@ extension PostListViewController: PageboyViewControllerDataSource, TMBarDataSour func viewController(for pageboyViewController: PageboyViewController, at index: PageboyViewController.PageIndex) -> UIViewController? { -// NotificationCenter.default.post(name: .sendTabIndex, object: nil, userInfo: ["tabIndex": index]) ProfileDataSingleton.shared.currentTabIndex = index return viewControllers[index] } func defaultPage(for pageboyViewController: PageboyViewController) -> PageboyViewController.Page? { - // index를 통해 처음에 보이는 탭을 설정 return .at(index: 0) } - // 팔로워 페이지 혹은 팔로잉 페이지인지에 따라 defualtPage 다르게 하기 func barItem(for bar: TMBar, at index: Int) -> TMBarItemable { switch index { case 0: diff --git a/pochak/pochak/UI/Profile/ProfileDataSingleton.swift b/pochak/pochak/UI/Profile/ProfileDataSingleton.swift index 1229f80e..ba08f64b 100644 --- a/pochak/pochak/UI/Profile/ProfileDataSingleton.swift +++ b/pochak/pochak/UI/Profile/ProfileDataSingleton.swift @@ -6,17 +6,40 @@ // import CoreFoundation +import Foundation class ProfileDataSingleton { static let shared = ProfileDataSingleton() var currentTabIndex: Int = 0 - var firstTabHeight: CGFloat = 0.0 - var secondTabHeight: CGFloat = 0.0 var firstTabIsCurrentlyFetching: Bool = false var secondTabIsCurrentlyFetching: Bool = false var firstTabIsLastPage: Bool = false var secondTabIsLastPage: Bool = false private init() {} + + private var _firstTabHeight: CGFloat = 0.0 + private var _secondTabHeight: CGFloat = 0.0 + + + var firstTabHeight: CGFloat { + get { + return _firstTabHeight + } + set { + _firstTabHeight = newValue + NotificationCenter.default.post(name: .didUpdateTotalHeight, object: nil) + } + } + + var secondTabHeight: CGFloat { + get { + return _firstTabHeight + } + set { + _firstTabHeight = newValue + NotificationCenter.default.post(name: .didUpdateTotalHeight, object: nil) + } + } } From df588a14a0eafa2ce0e69fc0eaf05f8ed2bcbee1 Mon Sep 17 00:00:00 2001 From: Jungyeon Seo Date: Tue, 3 Dec 2024 01:08:27 +0900 Subject: [PATCH 41/54] =?UTF-8?q?Fix=20:=20=EB=82=B4=20=ED=94=84=EB=A1=9C?= =?UTF-8?q?=ED=95=84=20=EC=8A=A4=ED=81=AC=EB=A1=A4=20=EB=B7=B0=20contraint?= =?UTF-8?q?=20=EC=88=98=EC=A0=95?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../Profile/MyProfileTabViewController.swift | 151 ++++++++++++------ .../OtherUserProfileViewController.swift | 61 ++++--- .../PochakedPostTabmanViewController.swift | 1 - .../pochak/UI/Profile/ProfileTab.storyboard | 2 +- 4 files changed, 135 insertions(+), 80 deletions(-) diff --git a/pochak/pochak/UI/Profile/MyProfileTabViewController.swift b/pochak/pochak/UI/Profile/MyProfileTabViewController.swift index 9015d802..ec44ffe1 100644 --- a/pochak/pochak/UI/Profile/MyProfileTabViewController.swift +++ b/pochak/pochak/UI/Profile/MyProfileTabViewController.swift @@ -12,6 +12,12 @@ final class MyProfileTabViewController: UIViewController { // MARK: - Properties private let handle = UserDefaultsManager.getData(type: String.self, forKey: .handle) ?? "" + private let contentScrollView: UIScrollView = { + let scrollView = UIScrollView() + scrollView.translatesAutoresizingMaskIntoConstraints = false + scrollView.showsVerticalScrollIndicator = false + return scrollView + }() // MARK: - Views @@ -47,8 +53,10 @@ final class MyProfileTabViewController: UIViewController { addSubview() setUpUIConstraints() setUpRefreshControl() - setUpData() setUpViewController() + setUpData() + initializeSingleton() + NotificationCenter.default.addObserver(self, selector: #selector(totalHeightUpdated), name: .didUpdateTotalHeight, object: nil) } override func viewWillAppear(_ animated: Bool) { @@ -87,53 +95,52 @@ final class MyProfileTabViewController: UIViewController { followListVC.handle = handle self.navigationController?.pushViewController(followListVC, animated: true) } - + @objc private func refreshData(_ sender: Any) { print("refresh") -// imageArray = [] -// currentFetchingPage = 0 setUpData() - DispatchQueue.main.asyncAfter(deadline: .now() + 0.7) { + DispatchQueue.main.async() { self.contentScrollView.refreshControl?.endRefreshing() } } - // MARK: - Functions + @objc private func totalHeightUpdated() { + ProfileDataSingleton.shared.currentTabIndex == 0 ? + (updatePostListTabmanViewHeight(ProfileDataSingleton.shared.firstTabHeight)) : + (updatePostListTabmanViewHeight(ProfileDataSingleton.shared.secondTabHeight)) + } - private let contentScrollView: UIScrollView = { - let scrollView = UIScrollView() - scrollView.translatesAutoresizingMaskIntoConstraints = false - scrollView.backgroundColor = UIColor(named: "gray01") - scrollView.showsVerticalScrollIndicator = false - - return scrollView - }() + // MARK: - Functions private func addSubview() { self.view.addSubview(contentScrollView) contentScrollView.addSubview(topUIView) topUIView.addSubview(postListTabmanView) - } private func setUpUIConstraints() { + contentScrollView.translatesAutoresizingMaskIntoConstraints = false topUIView.translatesAutoresizingMaskIntoConstraints = false postListTabmanView.translatesAutoresizingMaskIntoConstraints = false - + NSLayoutConstraint.activate([ - contentScrollView.topAnchor.constraint(equalTo: self.view.topAnchor), - contentScrollView.leadingAnchor.constraint(equalTo: self.view.leadingAnchor), - contentScrollView.trailingAnchor.constraint(equalTo: self.view.trailingAnchor), - contentScrollView.bottomAnchor.constraint(equalTo: self.view.bottomAnchor), - topUIView.topAnchor.constraint(equalTo: contentScrollView.topAnchor), - topUIView.leadingAnchor.constraint(equalTo: contentScrollView.leadingAnchor), - topUIView.trailingAnchor.constraint(equalTo: contentScrollView.trailingAnchor), - topUIView.bottomAnchor.constraint(equalTo: contentScrollView.bottomAnchor), - topUIView.widthAnchor.constraint(equalTo: contentScrollView.widthAnchor), - postListTabmanView.topAnchor.constraint(equalTo: self.whiteBackground1.bottomAnchor, constant: 5), - postListTabmanView.leadingAnchor.constraint(equalTo: topUIView.leadingAnchor), - postListTabmanView.trailingAnchor.constraint(equalTo: topUIView.trailingAnchor), - postListTabmanView.bottomAnchor.constraint(equalTo: topUIView.bottomAnchor), + contentScrollView.topAnchor.constraint(equalTo: view.topAnchor), + contentScrollView.leadingAnchor.constraint(equalTo: view.leadingAnchor), + contentScrollView.trailingAnchor.constraint(equalTo: view.trailingAnchor), + contentScrollView.bottomAnchor.constraint(equalTo: view.bottomAnchor), + ]) + + let scrollContentGuide = contentScrollView.contentLayoutGuide + NSLayoutConstraint.activate([ + topUIView.topAnchor.constraint(equalTo: scrollContentGuide.topAnchor), + topUIView.leadingAnchor.constraint(equalTo: view.leadingAnchor), + topUIView.trailingAnchor.constraint(equalTo: view.trailingAnchor), + topUIView.bottomAnchor.constraint(equalTo: postListTabmanView.bottomAnchor), // Dynamic height for topUIView + + postListTabmanView.topAnchor.constraint(equalTo: whiteBackground1.bottomAnchor, constant: 5), + postListTabmanView.leadingAnchor.constraint(equalTo: topUIView.leadingAnchor), + postListTabmanView.trailingAnchor.constraint(equalTo: topUIView.trailingAnchor), + postListTabmanView.heightAnchor.constraint(equalTo: scrollContentGuide.heightAnchor), ]) } @@ -144,32 +151,17 @@ final class MyProfileTabViewController: UIViewController { private func setUpViewController() { self.navigationController?.isNavigationBarHidden = true - profileBackground.layer.cornerRadius = 58 profileImage.layer.cornerRadius = 55 - whiteBackground1.layer.cornerRadius = 8 - viewFollowerList() viewFollowingList() - userHandle.text = "@\(handle)" - let backBarButtonItem = UIBarButtonItem(title: nil, style: .plain, target: nil, action: nil) backBarButtonItem.tintColor = .black self.navigationItem.backBarButtonItem = backBarButtonItem } - private func viewFollowerList() { /* UITapGestureRecognizer 사용 */ - let tapGestureRecognizer = UITapGestureRecognizer(target: self, action: #selector(viewFollowerTapped)) - followerList.addGestureRecognizer(tapGestureRecognizer) - } - - private func viewFollowingList() { /* UITapGestureRecognizer 사용 */ - let tapGestureRecognizer = UITapGestureRecognizer(target: self, action: #selector(viewFollowingTapped)) - followingList.addGestureRecognizer(tapGestureRecognizer) - } - private func setUpData() { let request = ProfileRetrievalRequest(page: 0) ProfileService.getProfile(handle: handle, request: request) { data, failed in @@ -189,9 +181,6 @@ final class MyProfileTabViewController: UIViewController { return } - print("=== Profile, setup data succeeded ===") - print("== data: \(data)") - // load 프로필 이미지 if let url = URL(string: data.result.profileImage ?? "") { self.profileImage.load(with: url) @@ -205,6 +194,26 @@ final class MyProfileTabViewController: UIViewController { } } + private func initializeSingleton() { + ProfileDataSingleton.shared.currentTabIndex = 0 + ProfileDataSingleton.shared.firstTabHeight = 0.0 + ProfileDataSingleton.shared.secondTabHeight = 0.0 + ProfileDataSingleton.shared.firstTabIsCurrentlyFetching = false + ProfileDataSingleton.shared.secondTabIsCurrentlyFetching = false + ProfileDataSingleton.shared.firstTabIsLastPage = false + ProfileDataSingleton.shared.secondTabIsLastPage = false + } + + private func viewFollowerList() { /* UITapGestureRecognizer 사용 */ + let tapGestureRecognizer = UITapGestureRecognizer(target: self, action: #selector(viewFollowerTapped)) + followerList.addGestureRecognizer(tapGestureRecognizer) + } + + private func viewFollowingList() { /* UITapGestureRecognizer 사용 */ + let tapGestureRecognizer = UITapGestureRecognizer(target: self, action: #selector(viewFollowingTapped)) + followingList.addGestureRecognizer(tapGestureRecognizer) + } + private func setUpResponseData(_ responseData: ProfileRetrievalResult) { self.profileImage.contentMode = .scaleAspectFill self.userName.text = String(responseData.name ?? "") @@ -219,4 +228,52 @@ final class MyProfileTabViewController: UIViewController { UserDefaultsManager.setData(value: responseData.message, key: .message) UserDefaultsManager.setData(value: responseData.profileImage, key: .profileImgUrl) } + + private func updatePostListTabmanViewHeight(_ height: CGFloat) { + // 기존 높이 제약 조건 제거 + postListTabmanView.constraints.forEach { constraint in + if constraint.firstAttribute == .height { + constraint.isActive = false + } + } + + // 새로운 높이 제약 조건 추가 + postListTabmanView.heightAnchor.constraint(equalToConstant: height).isActive = true + + // 레이아웃 애니메이션 처리 + UIView.animate(withDuration: 0.3, animations: { + self.contentScrollView.layoutIfNeeded() + }) { _ in + // ScrollView의 contentSize 업데이트 + self.contentScrollView.contentSize = CGSize( + width: self.contentScrollView.frame.width, + height: self.topUIView.frame.height + ) + } + } + + deinit { + NotificationCenter.default.removeObserver(self) + } } + + +// MARK: - Extension : CustomAlertDelegate, SecondViewControllerDelegate + +extension MyProfileTabViewController: UIScrollViewDelegate { + + func scrollViewDidScroll(_ scrollView: UIScrollView) { + if (contentScrollView.contentOffset.y > (contentScrollView.contentSize.height - contentScrollView.frame.size.height)) { + if (ProfileDataSingleton.shared.currentTabIndex == 0 && + !ProfileDataSingleton.shared.firstTabIsCurrentlyFetching && + !ProfileDataSingleton.shared.firstTabIsLastPage) { + NotificationCenter.default.post(name: .didHitBottom, object: nil) + } else if (ProfileDataSingleton.shared.currentTabIndex == 1 && + !ProfileDataSingleton.shared.secondTabIsCurrentlyFetching && + !ProfileDataSingleton.shared.secondTabIsLastPage) { + NotificationCenter.default.post(name: .didHitBottom, object: nil) + } + } + } +} + diff --git a/pochak/pochak/UI/Profile/OtherUserProfileViewController.swift b/pochak/pochak/UI/Profile/OtherUserProfileViewController.swift index 5dadfdbb..dccfff99 100644 --- a/pochak/pochak/UI/Profile/OtherUserProfileViewController.swift +++ b/pochak/pochak/UI/Profile/OtherUserProfileViewController.swift @@ -22,16 +22,17 @@ final class OtherUserProfileViewController: UIViewController { var receivedIsFollow: Bool? private let socialId = UserDefaultsManager.getData(type: String.self, forKey: .socialId) private var searchBlockedUser: Bool = false + private lazy var moreButton: UIBarButtonItem = { // 업로드 버튼 let barButton = UIBarButtonItem(image: UIImage(named: "moreButtonIcon"), style: .plain, target: self, action: #selector(moreButtonPressed)) return barButton }() + private let contentScrollView: UIScrollView = { let scrollView = UIScrollView() scrollView.translatesAutoresizingMaskIntoConstraints = false - scrollView.backgroundColor = UIColor(named: "gray01") scrollView.showsVerticalScrollIndicator = false - + scrollView.backgroundColor = UIColor(named: "gray01") return scrollView }() @@ -160,7 +161,7 @@ final class OtherUserProfileViewController: UIViewController { @objc private func refreshData(_ sender: Any) { setUpData() - DispatchQueue.main.asyncAfter(deadline: .now() + 0.5) { + DispatchQueue.main.async() { self.contentScrollView.refreshControl?.endRefreshing() } } @@ -173,31 +174,6 @@ final class OtherUserProfileViewController: UIViewController { // MARK: - Functions - func updatePostListTabmanViewHeight(_ height: CGFloat) { - - print("updatePostListTabmanViewHeight : \(height)") - // 기존 높이 제약 조건 제거 - postListTabmanView.constraints.forEach { constraint in - if constraint.firstAttribute == .height { - constraint.isActive = false - } - } - - // 새로운 높이 제약 조건 추가 - postListTabmanView.heightAnchor.constraint(equalToConstant: height).isActive = true - - // 레이아웃 애니메이션 처리 - UIView.animate(withDuration: 0.3, animations: { - self.contentScrollView.layoutIfNeeded() - }) { _ in - // ScrollView의 contentSize 업데이트 - self.contentScrollView.contentSize = CGSize( - width: self.contentScrollView.frame.width, - height: self.topUIView.frame.height - ) - } - } - private func addSubview() { self.view.addSubview(contentScrollView) contentScrollView.addSubview(topUIView) @@ -259,7 +235,7 @@ final class OtherUserProfileViewController: UIViewController { postListTabmanView.topAnchor.constraint(equalTo: followToggleBtn.bottomAnchor, constant: 5), postListTabmanView.leadingAnchor.constraint(equalTo: topUIView.leadingAnchor), postListTabmanView.trailingAnchor.constraint(equalTo: topUIView.trailingAnchor), - postListTabmanView.heightAnchor.constraint(equalTo: scrollContentGuide.heightAnchor), + postListTabmanView.heightAnchor.constraint(equalToConstant: view.frame.height - 270), ]) } @@ -365,7 +341,6 @@ final class OtherUserProfileViewController: UIViewController { private func setUpFollowBtn(_ responseData: ProfileRetrievalResult) { let currentHandle = UserDefaultsManager.getData(type: String.self, forKey: .handle) - // 버튼 설정 if currentHandle == self.receivedHandle { /// 내 프로필 조회한 경우 self.followToggleBtn.layer.isHidden = true @@ -391,6 +366,31 @@ final class OtherUserProfileViewController: UIViewController { } } + private func updatePostListTabmanViewHeight(_ height: CGFloat) { + print("height === \(topUIView.frame.height)") + // 기존 높이 제약 조건 제거 + postListTabmanView.constraints.forEach { constraint in + if constraint.firstAttribute == .height { + print("inside contraint") + constraint.isActive = false + } + } + + // 새로운 높이 제약 조건 추가 + postListTabmanView.heightAnchor.constraint(equalToConstant: height).isActive = true + + // 레이아웃 애니메이션 처리 + UIView.animate(withDuration: 0.3, animations: { + self.contentScrollView.layoutIfNeeded() + }) { _ in + // ScrollView의 contentSize 업데이트 + self.contentScrollView.contentSize = CGSize( + width: self.contentScrollView.frame.width, + height: self.topUIView.frame.height + ) + } + } + deinit { NotificationCenter.default.removeObserver(self) } @@ -455,7 +455,6 @@ extension OtherUserProfileViewController: UIScrollViewDelegate { } else if (ProfileDataSingleton.shared.currentTabIndex == 1 && !ProfileDataSingleton.shared.secondTabIsCurrentlyFetching && !ProfileDataSingleton.shared.secondTabIsLastPage) { - print("has hit the second tab bottom && reloading") NotificationCenter.default.post(name: .didHitBottom, object: nil) } } diff --git a/pochak/pochak/UI/Profile/PostList/PochakedPostTabmanViewController.swift b/pochak/pochak/UI/Profile/PostList/PochakedPostTabmanViewController.swift index 3b1a0968..6c2b9292 100644 --- a/pochak/pochak/UI/Profile/PostList/PochakedPostTabmanViewController.swift +++ b/pochak/pochak/UI/Profile/PostList/PochakedPostTabmanViewController.swift @@ -103,7 +103,6 @@ class PochakedPostTabmanViewController: UIViewController { UINib(nibName: ProfilePostCollectionViewCell.identifier, bundle: nil), forCellWithReuseIdentifier: ProfilePostCollectionViewCell.identifier) postCollectionView.isScrollEnabled = false - postCollectionView.backgroundColor = .green } private func calculateCurentHeight() { diff --git a/pochak/pochak/UI/Profile/ProfileTab.storyboard b/pochak/pochak/UI/Profile/ProfileTab.storyboard index 71213778..ed877fc5 100644 --- a/pochak/pochak/UI/Profile/ProfileTab.storyboard +++ b/pochak/pochak/UI/Profile/ProfileTab.storyboard @@ -1022,7 +1022,7 @@ - + From b8ddc11723faf9a617d07820ac574ec36423e66a Mon Sep 17 00:00:00 2001 From: Jungyeon Seo Date: Mon, 9 Dec 2024 15:12:44 +0900 Subject: [PATCH 42/54] =?UTF-8?q?Fix=20:=20=EB=82=B4=20=ED=94=84=EB=A1=9C?= =?UTF-8?q?=ED=95=84=20=ED=83=AD=20constraint=20=EC=88=98=EC=A0=95?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../Profile/MyProfileTabViewController.swift | 72 ++++++++++++++----- .../OtherUserProfileViewController.swift | 37 +++++----- .../pochak/UI/Profile/ProfileTab.storyboard | 55 ++++++-------- 3 files changed, 93 insertions(+), 71 deletions(-) diff --git a/pochak/pochak/UI/Profile/MyProfileTabViewController.swift b/pochak/pochak/UI/Profile/MyProfileTabViewController.swift index ec44ffe1..19183174 100644 --- a/pochak/pochak/UI/Profile/MyProfileTabViewController.swift +++ b/pochak/pochak/UI/Profile/MyProfileTabViewController.swift @@ -16,6 +16,7 @@ final class MyProfileTabViewController: UIViewController { let scrollView = UIScrollView() scrollView.translatesAutoresizingMaskIntoConstraints = false scrollView.showsVerticalScrollIndicator = false + scrollView.backgroundColor = UIColor(named: "gray01") return scrollView }() @@ -122,6 +123,14 @@ final class MyProfileTabViewController: UIViewController { contentScrollView.translatesAutoresizingMaskIntoConstraints = false topUIView.translatesAutoresizingMaskIntoConstraints = false postListTabmanView.translatesAutoresizingMaskIntoConstraints = false + profileBackground.translatesAutoresizingMaskIntoConstraints = false + whiteBackground1.translatesAutoresizingMaskIntoConstraints = false + userName.translatesAutoresizingMaskIntoConstraints = false + userHandle.translatesAutoresizingMaskIntoConstraints = false + userMessage.translatesAutoresizingMaskIntoConstraints = false + profileImage.translatesAutoresizingMaskIntoConstraints = false + updateProfileBtn.translatesAutoresizingMaskIntoConstraints = false + settingBtn.translatesAutoresizingMaskIntoConstraints = false NSLayoutConstraint.activate([ contentScrollView.topAnchor.constraint(equalTo: view.topAnchor), @@ -137,10 +146,38 @@ final class MyProfileTabViewController: UIViewController { topUIView.trailingAnchor.constraint(equalTo: view.trailingAnchor), topUIView.bottomAnchor.constraint(equalTo: postListTabmanView.bottomAnchor), // Dynamic height for topUIView + userHandle.topAnchor.constraint(equalTo: topUIView.topAnchor, constant: 15), + userHandle.leadingAnchor.constraint(equalTo: view.leadingAnchor, constant: 20), + + settingBtn.trailingAnchor.constraint(equalTo: view.trailingAnchor), + settingBtn.centerYAnchor.constraint(equalTo: userHandle.centerYAnchor), + + profileBackground.topAnchor.constraint(equalTo: userHandle.bottomAnchor, constant: 25), + profileBackground.leadingAnchor.constraint(equalTo: topUIView.leadingAnchor, constant: 20), + + userName.topAnchor.constraint(equalTo: profileBackground.topAnchor, constant: 15), + userName.leadingAnchor.constraint(equalTo: profileBackground.trailingAnchor, constant: 20), + userName.trailingAnchor.constraint(equalTo: topUIView.trailingAnchor), + + profileImage.centerXAnchor.constraint(equalTo: profileBackground.centerXAnchor), + profileImage.centerYAnchor.constraint(equalTo: profileBackground.centerYAnchor), + + updateProfileBtn.bottomAnchor.constraint(equalTo: profileBackground.bottomAnchor, constant: -5), + updateProfileBtn.trailingAnchor.constraint(equalTo: profileBackground.trailingAnchor, constant: -5), + + userMessage.topAnchor.constraint(equalTo: userName.bottomAnchor, constant: 10), + userMessage.leadingAnchor.constraint(equalTo: profileBackground.trailingAnchor, constant: 20), + userMessage.trailingAnchor.constraint(equalTo: topUIView.trailingAnchor), + + whiteBackground1.topAnchor.constraint(equalTo: profileBackground.bottomAnchor, constant: 20), + whiteBackground1.leadingAnchor.constraint(equalTo: profileBackground.leadingAnchor), + whiteBackground1.centerXAnchor.constraint(equalTo: topUIView.centerXAnchor), + whiteBackground1.trailingAnchor.constraint(equalTo: topUIView.trailingAnchor, constant: -20), + postListTabmanView.topAnchor.constraint(equalTo: whiteBackground1.bottomAnchor, constant: 5), postListTabmanView.leadingAnchor.constraint(equalTo: topUIView.leadingAnchor), postListTabmanView.trailingAnchor.constraint(equalTo: topUIView.trailingAnchor), - postListTabmanView.heightAnchor.constraint(equalTo: scrollContentGuide.heightAnchor), + postListTabmanView.heightAnchor.constraint(equalToConstant: view.frame.height), ]) } @@ -230,26 +267,27 @@ final class MyProfileTabViewController: UIViewController { } private func updatePostListTabmanViewHeight(_ height: CGFloat) { - // 기존 높이 제약 조건 제거 postListTabmanView.constraints.forEach { constraint in if constraint.firstAttribute == .height { - constraint.isActive = false + if height >= constraint.constant && constraint.constant != 0 { + constraint.isActive = false + + // 새로운 높이 제약 조건 추가 + postListTabmanView.heightAnchor.constraint(equalToConstant: height).isActive = true + UIView.animate(withDuration: 0.3, animations: { + self.contentScrollView.layoutIfNeeded() + }) { _ in + // ScrollView의 contentSize 업데이트 + self.contentScrollView.contentSize = CGSize( + width: self.contentScrollView.frame.width, + height: self.topUIView.frame.height + ) + } + } else { + print("no posts yet") + } } } - - // 새로운 높이 제약 조건 추가 - postListTabmanView.heightAnchor.constraint(equalToConstant: height).isActive = true - - // 레이아웃 애니메이션 처리 - UIView.animate(withDuration: 0.3, animations: { - self.contentScrollView.layoutIfNeeded() - }) { _ in - // ScrollView의 contentSize 업데이트 - self.contentScrollView.contentSize = CGSize( - width: self.contentScrollView.frame.width, - height: self.topUIView.frame.height - ) - } } deinit { diff --git a/pochak/pochak/UI/Profile/OtherUserProfileViewController.swift b/pochak/pochak/UI/Profile/OtherUserProfileViewController.swift index dccfff99..f73cc879 100644 --- a/pochak/pochak/UI/Profile/OtherUserProfileViewController.swift +++ b/pochak/pochak/UI/Profile/OtherUserProfileViewController.swift @@ -235,7 +235,7 @@ final class OtherUserProfileViewController: UIViewController { postListTabmanView.topAnchor.constraint(equalTo: followToggleBtn.bottomAnchor, constant: 5), postListTabmanView.leadingAnchor.constraint(equalTo: topUIView.leadingAnchor), postListTabmanView.trailingAnchor.constraint(equalTo: topUIView.trailingAnchor), - postListTabmanView.heightAnchor.constraint(equalToConstant: view.frame.height - 270), + postListTabmanView.heightAnchor.constraint(equalToConstant: view.frame.height), ]) } @@ -367,28 +367,27 @@ final class OtherUserProfileViewController: UIViewController { } private func updatePostListTabmanViewHeight(_ height: CGFloat) { - print("height === \(topUIView.frame.height)") - // 기존 높이 제약 조건 제거 postListTabmanView.constraints.forEach { constraint in if constraint.firstAttribute == .height { - print("inside contraint") - constraint.isActive = false + if height >= constraint.constant && constraint.constant != 0 { + constraint.isActive = false + + // 새로운 높이 제약 조건 추가 + postListTabmanView.heightAnchor.constraint(equalToConstant: height).isActive = true + UIView.animate(withDuration: 0.3, animations: { + self.contentScrollView.layoutIfNeeded() + }) { _ in + // ScrollView의 contentSize 업데이트 + self.contentScrollView.contentSize = CGSize( + width: self.contentScrollView.frame.width, + height: self.topUIView.frame.height + ) + } + } else { + print("no posts yet") + } } } - - // 새로운 높이 제약 조건 추가 - postListTabmanView.heightAnchor.constraint(equalToConstant: height).isActive = true - - // 레이아웃 애니메이션 처리 - UIView.animate(withDuration: 0.3, animations: { - self.contentScrollView.layoutIfNeeded() - }) { _ in - // ScrollView의 contentSize 업데이트 - self.contentScrollView.contentSize = CGSize( - width: self.contentScrollView.frame.width, - height: self.topUIView.frame.height - ) - } } deinit { diff --git a/pochak/pochak/UI/Profile/ProfileTab.storyboard b/pochak/pochak/UI/Profile/ProfileTab.storyboard index ed877fc5..0dca9502 100644 --- a/pochak/pochak/UI/Profile/ProfileTab.storyboard +++ b/pochak/pochak/UI/Profile/ProfileTab.storyboard @@ -30,20 +30,20 @@ - + - + - - - - - - - - - - - - - - - - - @@ -215,7 +200,7 @@ - + From 231432fe9278aab550eafe4d924b6d43f440944c Mon Sep 17 00:00:00 2001 From: Jungyeon Seo Date: Mon, 9 Dec 2024 15:19:22 +0900 Subject: [PATCH 43/54] =?UTF-8?q?Fix=20:=20=ED=94=84=EB=A1=9C=ED=95=84=20?= =?UTF-8?q?=EC=82=AC=EC=A7=84=20=EB=86=92=EC=9D=B4=20=EC=88=98=EC=A0=95?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- pochak/pochak/UI/Profile/MyProfileTabViewController.swift | 2 +- pochak/pochak/UI/Profile/OtherUserProfileViewController.swift | 2 +- 2 files changed, 2 insertions(+), 2 deletions(-) diff --git a/pochak/pochak/UI/Profile/MyProfileTabViewController.swift b/pochak/pochak/UI/Profile/MyProfileTabViewController.swift index 19183174..f2fdcff0 100644 --- a/pochak/pochak/UI/Profile/MyProfileTabViewController.swift +++ b/pochak/pochak/UI/Profile/MyProfileTabViewController.swift @@ -152,7 +152,7 @@ final class MyProfileTabViewController: UIViewController { settingBtn.trailingAnchor.constraint(equalTo: view.trailingAnchor), settingBtn.centerYAnchor.constraint(equalTo: userHandle.centerYAnchor), - profileBackground.topAnchor.constraint(equalTo: userHandle.bottomAnchor, constant: 25), + profileBackground.topAnchor.constraint(equalTo: topUIView.bottomAnchor, constant: 28), profileBackground.leadingAnchor.constraint(equalTo: topUIView.leadingAnchor, constant: 20), userName.topAnchor.constraint(equalTo: profileBackground.topAnchor, constant: 15), diff --git a/pochak/pochak/UI/Profile/OtherUserProfileViewController.swift b/pochak/pochak/UI/Profile/OtherUserProfileViewController.swift index f73cc879..56f5bf8f 100644 --- a/pochak/pochak/UI/Profile/OtherUserProfileViewController.swift +++ b/pochak/pochak/UI/Profile/OtherUserProfileViewController.swift @@ -206,7 +206,7 @@ final class OtherUserProfileViewController: UIViewController { topUIView.trailingAnchor.constraint(equalTo: view.trailingAnchor), topUIView.bottomAnchor.constraint(equalTo: postListTabmanView.bottomAnchor), // Dynamic height for topUIView - profileBackground.topAnchor.constraint(equalTo: topUIView.topAnchor, constant: 20), + profileBackground.topAnchor.constraint(equalTo: topUIView.topAnchor, constant: 28), profileBackground.leadingAnchor.constraint(equalTo: topUIView.leadingAnchor, constant: 20), userName.topAnchor.constraint(equalTo: profileBackground.topAnchor, constant: 15), From 4838cec1fb1caa332a878021e2d60d0df67b2b35 Mon Sep 17 00:00:00 2001 From: Jungyeon Seo Date: Mon, 9 Dec 2024 15:26:30 +0900 Subject: [PATCH 44/54] =?UTF-8?q?Fix=20:=20=ED=94=84=EB=A1=9C=ED=95=84=20?= =?UTF-8?q?=EC=82=AC=EC=A7=84=20=EB=86=92=EC=9D=B4=20=EC=88=98=EC=A0=95?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- pochak/pochak/UI/Profile/MyProfileTabViewController.swift | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/pochak/pochak/UI/Profile/MyProfileTabViewController.swift b/pochak/pochak/UI/Profile/MyProfileTabViewController.swift index f2fdcff0..dc2562d5 100644 --- a/pochak/pochak/UI/Profile/MyProfileTabViewController.swift +++ b/pochak/pochak/UI/Profile/MyProfileTabViewController.swift @@ -146,13 +146,13 @@ final class MyProfileTabViewController: UIViewController { topUIView.trailingAnchor.constraint(equalTo: view.trailingAnchor), topUIView.bottomAnchor.constraint(equalTo: postListTabmanView.bottomAnchor), // Dynamic height for topUIView - userHandle.topAnchor.constraint(equalTo: topUIView.topAnchor, constant: 15), + userHandle.topAnchor.constraint(equalTo: topUIView.topAnchor, constant: 20), userHandle.leadingAnchor.constraint(equalTo: view.leadingAnchor, constant: 20), settingBtn.trailingAnchor.constraint(equalTo: view.trailingAnchor), settingBtn.centerYAnchor.constraint(equalTo: userHandle.centerYAnchor), - profileBackground.topAnchor.constraint(equalTo: topUIView.bottomAnchor, constant: 28), + profileBackground.topAnchor.constraint(equalTo: userHandle.bottomAnchor, constant: 28), profileBackground.leadingAnchor.constraint(equalTo: topUIView.leadingAnchor, constant: 20), userName.topAnchor.constraint(equalTo: profileBackground.topAnchor, constant: 15), From b8d3e60918b88a7a3ddca5f3f3dde1d2c9225680 Mon Sep 17 00:00:00 2001 From: Jungyeon Seo Date: Mon, 9 Dec 2024 15:59:49 +0900 Subject: [PATCH 45/54] =?UTF-8?q?Feat=20:=20=EB=A6=AC=ED=94=84=EB=A0=88?= =?UTF-8?q?=EC=8B=9C=20=ED=86=A0=ED=81=B0=20=ED=9C=B4=EC=9A=94=EC=84=B1=20?= =?UTF-8?q?=EA=B2=80=EC=82=AC=20=EC=B6=94=EA=B0=80?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- pochak/pochak/App/AppDelegate.swift | 58 +++++++++++++++++-- .../pochak/Network/UserDefaultsManager.swift | 1 + .../UI/Login/SignUpViewController.swift | 8 ++- 3 files changed, 60 insertions(+), 7 deletions(-) diff --git a/pochak/pochak/App/AppDelegate.swift b/pochak/pochak/App/AppDelegate.swift index 954e5785..ef7ea1d4 100644 --- a/pochak/pochak/App/AppDelegate.swift +++ b/pochak/pochak/App/AppDelegate.swift @@ -13,6 +13,8 @@ import FirebaseCore @main class AppDelegate: UIResponder, UIApplicationDelegate { + var realmManager = RecentSearchRealmManager() + func application(_ application: UIApplication, didFinishLaunchingWithOptions launchOptions: [UIApplication.LaunchOptionsKey: Any]?) -> Bool { // Override point for customization after application launch. sleep(2) @@ -64,22 +66,68 @@ class AppDelegate: UIResponder, UIApplicationDelegate { removeKeychainAtFirstLaunch() return true } - + private func removeKeychainAtFirstLaunch() { guard UserDefaults.isFirstLaunch() else { return } + do { + try KeychainManager.delete(account: "accessToken") + try KeychainManager.delete(account: "refreshToken") + } catch { + print(error) + } + } + + // 리프레시 토큰 유효성 검사 + func applicationDidBecomeActive(_ application: UIApplication) { + handleRefreshToken() + } + + private func handleRefreshToken() { + if !isRefreshTokenValid() { + deleteUserData() + moveToMainPage() + } + } + + private func isRefreshTokenValid() -> Bool { + guard let issuedAt = UserDefaultsManager.getData(type: Date.self, forKey: .refreshTokenIssuedAt) else { + return false // 발급 시점을 알 수 없으면 토큰이 유효하지 않음 + } + let validityPeriod: TimeInterval = 30 * 24 * 60 * 60 // 1달(30일)을 초 단위로 + let expirationDate = issuedAt.addingTimeInterval(validityPeriod) - // 첫 실행이라면 keyChain 정보를 삭제 + return Date() < expirationDate // 현재 시간과 만료 시간을 비교 + } + + private func deleteUserData() { do { + // Keychain 삭제 try KeychainManager.delete(account: "accessToken") try KeychainManager.delete(account: "refreshToken") + + // 최근 검색 기록 삭제 + if realmManager.deleteAllData() { + print("Successfully deleted all data") + } else { + print("Failed to delete all data") + } + + // UserDefaults 삭제 + UserDefaultsManager.UserDefaultsKeys.allCases.forEach { key in + UserDefaultsManager.removeData(key: key) + } } catch { print(error) } } - - // MARK: UISceneSession Lifecycle + + private func moveToMainPage() { + let mainVCBundle = UIStoryboard.init(name: "Login", bundle: nil) + guard let mainVC = mainVCBundle.instantiateViewController(withIdentifier: "NavigationVC") as? NavigationController else { return } + (UIApplication.shared.connectedScenes.first?.delegate as? SceneDelegate)?.changeRootViewController(mainVC, animated: false) + } func application(_ application: UIApplication, configurationForConnecting connectingSceneSession: UISceneSession, options: UIScene.ConnectionOptions) -> UISceneConfiguration { // Called when a new scene session is being created. @@ -93,7 +141,7 @@ class AppDelegate: UIResponder, UIApplicationDelegate { // Use this method to release any resources that were specific to the discarded scenes, as they will not return. } - // Google 로그인 + // Google 로그인 등록 func application(_ application: UIApplication, open url: URL, options: [UIApplication.OpenURLOptionsKey: Any]) -> Bool { return GIDSignIn.sharedInstance.handle(url) } diff --git a/pochak/pochak/Network/UserDefaultsManager.swift b/pochak/pochak/Network/UserDefaultsManager.swift index fc4d9c07..09adb710 100644 --- a/pochak/pochak/Network/UserDefaultsManager.swift +++ b/pochak/pochak/Network/UserDefaultsManager.swift @@ -21,6 +21,7 @@ class UserDefaultsManager { case profileImgUrl case followerCount case followingCount + case refreshTokenIssuedAt } static func setData(value: T, key: UserDefaultsKeys) { diff --git a/pochak/pochak/UI/Login/SignUpViewController.swift b/pochak/pochak/UI/Login/SignUpViewController.swift index f38f5db5..85170fbf 100644 --- a/pochak/pochak/UI/Login/SignUpViewController.swift +++ b/pochak/pochak/UI/Login/SignUpViewController.swift @@ -187,8 +187,7 @@ final class SignUpViewController: UIViewController { } catch { print(error) } - - // 회원가입 성공 시 홈 화면으로 전환 + self?.saveRefreshTokenIssuedAt() self?.toHomeTabPage() } } @@ -217,6 +216,11 @@ final class SignUpViewController: UIViewController { } delegate.window?.rootViewController = tabBarController } + + private func saveRefreshTokenIssuedAt() { + let issuedAt = Date() // 현재 시간 저장 + UserDefaultsManager.setData(value: issuedAt, key: .refreshTokenIssuedAt) + } } // MARK: - Extension : UIImagePickerControllerDelegate, UINavigationControllerDelegate From 3e26e9e0af85807b736259155378622c355fd477 Mon Sep 17 00:00:00 2001 From: Jungyeon Seo Date: Mon, 9 Dec 2024 16:03:50 +0900 Subject: [PATCH 46/54] =?UTF-8?q?Fix=20:=20=EB=B6=88=ED=95=84=EC=9A=94?= =?UTF-8?q?=ED=95=9C=20print=EB=AC=B8=20=EC=A0=9C=EA=B1=B0?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../AuthenticationCredential.swift | 3 +- .../Authentication/Authenticator.swift | 72 ++++++------------- 2 files changed, 24 insertions(+), 51 deletions(-) diff --git a/pochak/pochak/Network/Authentication/AuthenticationCredential.swift b/pochak/pochak/Network/Authentication/AuthenticationCredential.swift index 30fc4f28..e930de90 100644 --- a/pochak/pochak/Network/Authentication/AuthenticationCredential.swift +++ b/pochak/pochak/Network/Authentication/AuthenticationCredential.swift @@ -4,6 +4,7 @@ // // Created by Seo Cindy on 1/16/24. // + import Foundation import Alamofire @@ -11,7 +12,5 @@ struct MyAuthenticationCredential: AuthenticationCredential, Codable { let accessToken: String let refreshToken: String let expiredAt: Date - - // 유효시간이 앞으로 5분 이하 남았다면 refresh가 필요하다고 true를 리턴 (false를 리턴하면 refresh 필요x) var requiresRefresh: Bool { Date(timeIntervalSinceNow: 60 * 10) > expiredAt } } diff --git a/pochak/pochak/Network/Authentication/Authenticator.swift b/pochak/pochak/Network/Authentication/Authenticator.swift index 408b58e3..1cf27b71 100644 --- a/pochak/pochak/Network/Authentication/Authenticator.swift +++ b/pochak/pochak/Network/Authentication/Authenticator.swift @@ -7,88 +7,62 @@ import Alamofire -// MARK: - Token Refresh Data Model struct TokenRefreshResponse: Codable { let isSuccess: Bool let code: String let message: String let result: TokenRefreshDataModel } + struct TokenRefreshDataModel: Codable { let accessToken : String } class MyAuthenticator : Authenticator { typealias Credential = MyAuthenticationCredential - + // 1. api요청 시 AuthenticatorIndicator객체가 존재하면, 요청 전에 가로채서 apply에서 Header에 bearerToken 추가 func apply(_ credential: Credential, to urlRequest: inout URLRequest) { - print("--------------- 1. apply Function 실행 중 ---------------") - print(">>>>> apply 현재 토큰 : \(credential.accessToken)") urlRequest.addValue(credential.accessToken, forHTTPHeaderField: "Authorization") -// urlRequest.addValue("application/json", forHTTPHeaderField: "Content-Type") - print(">>>>> apply 현재 urlRequest : \(urlRequest)") - - print(">>>> requiresRefresh?? : \(credential.requiresRefresh)") - print(">>>> expiredAt?? : \(credential.expiredAt)") } // 2. api요청 후 error가 떨어진 경우, 401에러(인증에러)인 경우만 refresh가 되도록 필터링 func didRequest(_ urlRequest: URLRequest, with response: HTTPURLResponse, failDueToAuthenticationError error: Error) -> Bool { - print("--------------- 2. didRequest Function 실행 중 ---------------") -// if let data = response.data, let errorMessage = String(data: data, encoding: .utf8) { -// print("Failure Data: \(errorMessage)") -// } - print(">>>>> didRequest 현재 response : \(response)") - print(">>>>> didRequest 현재 statusCode : \(response.statusCode)") - print(">>>>> didRequest 현재 error : \(error)") return response.statusCode == 401 } // 3. 인증이 필요한 urlRequest에 대해서만 refresh가 되도록, 이 경우에만 true를 리턴하여 refresh 요청 func isRequest(_ urlRequest: URLRequest, authenticatedWith credential: MyAuthenticationCredential) -> Bool { // bearerToken의 urlRequest대해서만 refresh를 시도 (true) - print("--------------- 3. isRequest Function 실행 중 ---------------") let bearerToken = HTTPHeader.authorization(bearerToken: credential.accessToken).value let startIndex = bearerToken.index(bearerToken.startIndex, offsetBy: 7) - let newBearerToken = String(bearerToken[startIndex...]) // 12:00:00 - print(">>>>> headers bearerToken: \(urlRequest.headers["Authorization"])") - print(">>>>> bearerToken : \(newBearerToken)") - print(">>>>> bearerToken이 맞는건지 확인합니다 : \(urlRequest.headers["Authorization"] == newBearerToken)") + let newBearerToken = String(bearerToken[startIndex...]) return urlRequest.headers["Authorization"] == newBearerToken } - // 4. accesToken을 refresh 하는 부분 - // 추가 할 것 :: refreshtoken 만료 시 로그아웃 하도록 처리(유효기간 1달) + // 4. accesToken을 refresh func refresh(_ credential: MyAuthenticationCredential, for session: Alamofire.Session, completion: @escaping (Result) -> Void) { - print("--------------- 4. refresh Function 실행 중 ---------------") let url = "\(APIConstants.baseURL)/api/v2/refresh" - let header : HTTPHeaders = ["Authorization": credential.accessToken, "RefreshToken" : credential.refreshToken, "Content-type": "application/json"] + let header : HTTPHeaders = ["Authorization": credential.accessToken, + "RefreshToken" : credential.refreshToken, + "Content-type": "application/json"] - print(">>>>> url : \(url)") - print(">>>>> header : \(header)") AF.request(url, method: .post, headers: header).validate().responseDecodable(of: TokenRefreshResponse.self) { response in - switch response.result { - case .success(let result): - print(result.message) - print("inside Refresh Success!!!!") - let newAccessToken = result.result.accessToken - print(">>>>> newAccessToken : \(newAccessToken)") - do { - try KeychainManager.update(account: "accessToken", value: newAccessToken) - } catch { - print(error) - } - let credential = Credential(accessToken: GetToken.getAccessToken(), refreshToken: credential.refreshToken, expiredAt: Date(timeIntervalSinceNow: 60 * 30)) - completion(.success(credential)) - // 새로운 토큰으로 API 재요청 - case .failure(let error): - print("inside Refresh Fail!!!!") - if let data = response.data, let errorMessage = String(data: data, encoding: .utf8) { - print("Failure Data: \(errorMessage)") - } - print(error) - } - } + switch response.result { + case .success(let result): + let newAccessToken = result.result.accessToken + do { + try KeychainManager.update(account: "accessToken", value: newAccessToken) + } catch { + print(error) + } + let credential = Credential(accessToken: GetToken.getAccessToken(), refreshToken: credential.refreshToken, expiredAt: Date(timeIntervalSinceNow: 60 * 30)) + completion(.success(credential)) + case .failure(let error): + if let data = response.data, let errorMessage = String(data: data, encoding: .utf8) { + print("Failure Data: \(errorMessage)") + } + } + } } } From 2fb13a5e442b641e49f220912bcdfb75248972f1 Mon Sep 17 00:00:00 2001 From: Jungyeon Seo Date: Mon, 9 Dec 2024 16:50:10 +0900 Subject: [PATCH 47/54] =?UTF-8?q?Fix=20:=20=EC=B0=A8=EB=8B=A8=ED=95=9C=20?= =?UTF-8?q?=ED=94=84=EB=A1=9C=ED=95=84=20=EC=A1=B0=ED=9A=8C=20=EB=A1=9C?= =?UTF-8?q?=EC=A7=81=20=EC=88=98=EC=A0=95?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- pochak/pochak/App/AppDelegate.swift | 19 +++++++------- .../Models/User/BlockListResponse.swift | 26 +++++++++---------- .../Models/User/FollowListResponse.swift | 22 ++++++++-------- .../pochak/Network/UserDefaultsManager.swift | 2 -- .../cell/FollowingCollectionViewCell.swift | 2 -- .../UI/Profile/SettingsViewController.swift | 4 --- 6 files changed, 33 insertions(+), 42 deletions(-) diff --git a/pochak/pochak/App/AppDelegate.swift b/pochak/pochak/App/AppDelegate.swift index ef7ea1d4..c5710f9c 100644 --- a/pochak/pochak/App/AppDelegate.swift +++ b/pochak/pochak/App/AppDelegate.swift @@ -12,9 +12,7 @@ import FirebaseCore @main class AppDelegate: UIResponder, UIApplicationDelegate { - - var realmManager = RecentSearchRealmManager() - + func application(_ application: UIApplication, didFinishLaunchingWithOptions launchOptions: [UIApplication.LaunchOptionsKey: Any]?) -> Bool { // Override point for customization after application launch. sleep(2) @@ -86,6 +84,14 @@ class AppDelegate: UIResponder, UIApplicationDelegate { private func handleRefreshToken() { if !isRefreshTokenValid() { + print("Refresh Token 만료됨.. 재로그인 필요") + AuthenticationService.logOut { data, failed in + guard let data = data else { + return + } + let message = data.message + print(message) + } deleteUserData() moveToMainPage() } @@ -107,13 +113,6 @@ class AppDelegate: UIResponder, UIApplicationDelegate { try KeychainManager.delete(account: "accessToken") try KeychainManager.delete(account: "refreshToken") - // 최근 검색 기록 삭제 - if realmManager.deleteAllData() { - print("Successfully deleted all data") - } else { - print("Failed to delete all data") - } - // UserDefaults 삭제 UserDefaultsManager.UserDefaultsKeys.allCases.forEach { key in UserDefaultsManager.removeData(key: key) diff --git a/pochak/pochak/Network/Models/User/BlockListResponse.swift b/pochak/pochak/Network/Models/User/BlockListResponse.swift index 38a0f849..172d08aa 100644 --- a/pochak/pochak/Network/Models/User/BlockListResponse.swift +++ b/pochak/pochak/Network/Models/User/BlockListResponse.swift @@ -8,26 +8,26 @@ import Foundation struct BlockListResponse : Codable { - var isSuccess: Bool - var code: String - var message: String - var result : BlockListResult + let isSuccess: Bool + let code: String + let message: String + let result : BlockListResult } struct BlockListResult : Codable { - var pageInfo: BlockListPageInfo - var blockList: [BlockList] + let pageInfo: BlockListPageInfo + let blockList: [BlockList] } struct BlockListPageInfo : Codable { - var lastPage : Bool - var totalPages: Int - var totalElements: Int - var size: Int + let lastPage : Bool + let totalPages: Int + let totalElements: Int + let size: Int } struct BlockList : Codable { - var profileImage: String - var handle: String - var name: String + let profileImage: String + let handle: String + let name: String } diff --git a/pochak/pochak/Network/Models/User/FollowListResponse.swift b/pochak/pochak/Network/Models/User/FollowListResponse.swift index 86fabc49..41d1d58d 100644 --- a/pochak/pochak/Network/Models/User/FollowListResponse.swift +++ b/pochak/pochak/Network/Models/User/FollowListResponse.swift @@ -15,21 +15,21 @@ struct FollowListResponse: Codable { } struct FollowListResult: Codable { - var pageInfo: FollowListPageInfo - var memberList: [MemberListData] + let pageInfo: FollowListPageInfo + let memberList: [MemberListData] } struct FollowListPageInfo: Codable { - var lastPage : Bool - var totalPages : Int - var totalElements : Int - var size : Int + let lastPage : Bool + let totalPages : Int + let totalElements : Int + let size : Int } struct MemberListData: Codable { - var memberId: Int - var profileImage: String - var handle: String - var name: String - var isFollow: Bool? + let memberId: Int + let profileImage: String + let handle: String + let name: String + let isFollow: Bool? } diff --git a/pochak/pochak/Network/UserDefaultsManager.swift b/pochak/pochak/Network/UserDefaultsManager.swift index 09adb710..a48e1011 100644 --- a/pochak/pochak/Network/UserDefaultsManager.swift +++ b/pochak/pochak/Network/UserDefaultsManager.swift @@ -19,8 +19,6 @@ class UserDefaultsManager { case handle case message case profileImgUrl - case followerCount - case followingCount case refreshTokenIssuedAt } diff --git a/pochak/pochak/UI/Profile/FollowList/cell/FollowingCollectionViewCell.swift b/pochak/pochak/UI/Profile/FollowList/cell/FollowingCollectionViewCell.swift index 3a00027d..928cdd12 100644 --- a/pochak/pochak/UI/Profile/FollowList/cell/FollowingCollectionViewCell.swift +++ b/pochak/pochak/UI/Profile/FollowList/cell/FollowingCollectionViewCell.swift @@ -37,7 +37,6 @@ final class FollowingCollectionViewCell: UICollectionViewCell { print("error") return } - print(data.message) if data.message == "성공적으로 팔로우를 취소하였습니다." { sender.setTitle("팔로우", for: .normal) sender.backgroundColor = UIColor(named: "yellow00") @@ -54,7 +53,6 @@ final class FollowingCollectionViewCell: UICollectionViewCell { profileImageBtn.imageView?.contentMode = .scaleAspectFill profileImageBtn.clipsToBounds = true profileImageBtn.layer.cornerRadius = 26 - followStateToggleBtn.isHidden = false } diff --git a/pochak/pochak/UI/Profile/SettingsViewController.swift b/pochak/pochak/UI/Profile/SettingsViewController.swift index d870528c..d18f2d62 100644 --- a/pochak/pochak/UI/Profile/SettingsViewController.swift +++ b/pochak/pochak/UI/Profile/SettingsViewController.swift @@ -125,8 +125,6 @@ final class SettingsViewController: UIViewController { let handle = UserDefaultsManager.getData(type: String.self, forKey: .handle) ?? "handle not found" let message = UserDefaultsManager.getData(type: String.self, forKey: .message) ?? "message not found" let profileImgUrl = UserDefaultsManager.getData(type: String.self, forKey: .profileImgUrl) ?? "profileImgUrl not found" - let followerCount = UserDefaultsManager.getData(type: Int.self, forKey: .followerCount) ?? -1 - let followingCount = UserDefaultsManager.getData(type: Int.self, forKey: .followingCount) ?? -1 // Print values print("Access Token: \(accessToken)") @@ -140,8 +138,6 @@ final class SettingsViewController: UIViewController { print("Handle: \(handle)") print("Message: \(message)") print("Profile Image URL: \(profileImgUrl)") - print("Follower Count: \(followerCount)") - print("Following Count: \(followingCount)") } } From dfeb5a2652a7c60b9b67e0caef83fc72b3700751 Mon Sep 17 00:00:00 2001 From: Jungyeon Seo Date: Mon, 9 Dec 2024 20:01:26 +0900 Subject: [PATCH 48/54] =?UTF-8?q?Fix=20:=20=EC=B0=A8=EB=8B=A8=20=EC=9C=A0?= =?UTF-8?q?=EC=A0=80=20=ED=94=84=EB=A1=9C=ED=95=84=20=EC=A1=B0=ED=9A=8C=20?= =?UTF-8?q?=EC=88=98=EC=A0=95?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../UI/Profile/OtherUserProfileViewController.swift | 8 ++++---- 1 file changed, 4 insertions(+), 4 deletions(-) diff --git a/pochak/pochak/UI/Profile/OtherUserProfileViewController.swift b/pochak/pochak/UI/Profile/OtherUserProfileViewController.swift index 56f5bf8f..40f3cbc4 100644 --- a/pochak/pochak/UI/Profile/OtherUserProfileViewController.swift +++ b/pochak/pochak/UI/Profile/OtherUserProfileViewController.swift @@ -206,7 +206,7 @@ final class OtherUserProfileViewController: UIViewController { topUIView.trailingAnchor.constraint(equalTo: view.trailingAnchor), topUIView.bottomAnchor.constraint(equalTo: postListTabmanView.bottomAnchor), // Dynamic height for topUIView - profileBackground.topAnchor.constraint(equalTo: topUIView.topAnchor, constant: 28), + profileBackground.topAnchor.constraint(equalTo: topUIView.topAnchor, constant: 20), profileBackground.leadingAnchor.constraint(equalTo: topUIView.leadingAnchor, constant: 20), userName.topAnchor.constraint(equalTo: profileBackground.topAnchor, constant: 15), @@ -271,8 +271,7 @@ final class OtherUserProfileViewController: UIViewController { guard let data = data else { switch failed { case .clientError: - self.navigationController?.popViewController(animated: true) - self.navigationItem.title = "" + print("its client Error!") self.searchBlockedUser = true self.showAlert(alertType: .confirmOnly, titleText: "차단한 유저의 프로필입니다.", @@ -401,7 +400,8 @@ extension OtherUserProfileViewController: CustomAlertDelegate { func confirmAction() { if searchBlockedUser { - print("confirm selected!") + self.navigationController?.popViewController(animated: true) + self.navigationItem.title = "" } else { if let handle = receivedHandle { UserService.postFollowRequest(handle: handle) { [weak self] data, failed in From 4809ad4bf2068323a9bd93208dda2326d2bedc7f Mon Sep 17 00:00:00 2001 From: Jungyeon Seo Date: Mon, 9 Dec 2024 20:13:19 +0900 Subject: [PATCH 49/54] =?UTF-8?q?Fix=20:=20=EC=B0=A8=EB=8B=A8=20=EC=9C=A0?= =?UTF-8?q?=EC=A0=80=20=ED=94=84=EB=A1=9C=ED=95=84=20=EC=A1=B0=ED=9A=8C?= =?UTF-8?q?=EC=8B=9C=20=EB=84=A4=ED=8A=B8=EC=9B=8C=ED=81=AC=20=EC=97=90?= =?UTF-8?q?=EB=9F=AC=20=EC=95=8C=EB=A6=BC=20=EC=88=98=EC=A0=95?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- pochak/pochak/UI/Profile/OtherUserProfileViewController.swift | 3 +-- .../UI/Profile/PostList/PochakPostTabmanViewController.swift | 2 ++ .../UI/Profile/PostList/PochakedPostTabmanViewController.swift | 2 ++ 3 files changed, 5 insertions(+), 2 deletions(-) diff --git a/pochak/pochak/UI/Profile/OtherUserProfileViewController.swift b/pochak/pochak/UI/Profile/OtherUserProfileViewController.swift index 40f3cbc4..97fba943 100644 --- a/pochak/pochak/UI/Profile/OtherUserProfileViewController.swift +++ b/pochak/pochak/UI/Profile/OtherUserProfileViewController.swift @@ -271,7 +271,7 @@ final class OtherUserProfileViewController: UIViewController { guard let data = data else { switch failed { case .clientError: - print("its client Error!") + self.navigationItem.title = "" self.searchBlockedUser = true self.showAlert(alertType: .confirmOnly, titleText: "차단한 유저의 프로필입니다.", @@ -401,7 +401,6 @@ extension OtherUserProfileViewController: CustomAlertDelegate { func confirmAction() { if searchBlockedUser { self.navigationController?.popViewController(animated: true) - self.navigationItem.title = "" } else { if let handle = receivedHandle { UserService.postFollowRequest(handle: handle) { [weak self] data, failed in diff --git a/pochak/pochak/UI/Profile/PostList/PochakPostTabmanViewController.swift b/pochak/pochak/UI/Profile/PostList/PochakPostTabmanViewController.swift index a40ea684..690fd899 100644 --- a/pochak/pochak/UI/Profile/PostList/PochakPostTabmanViewController.swift +++ b/pochak/pochak/UI/Profile/PostList/PochakPostTabmanViewController.swift @@ -57,6 +57,8 @@ final class PochakPostTabmanViewController: UIViewController { ProfileService.getProfilePochakPosts(handle: handle, request: request) { [weak self] data, failed in guard let data = data else { switch failed { + case .clientError: + print("client error") case .disconnected: self?.present(UIAlertController.networkErrorAlert(title: failed!.localizedDescription), animated: true) case .serverError: diff --git a/pochak/pochak/UI/Profile/PostList/PochakedPostTabmanViewController.swift b/pochak/pochak/UI/Profile/PostList/PochakedPostTabmanViewController.swift index 6c2b9292..e1acc89e 100644 --- a/pochak/pochak/UI/Profile/PostList/PochakedPostTabmanViewController.swift +++ b/pochak/pochak/UI/Profile/PostList/PochakedPostTabmanViewController.swift @@ -56,6 +56,8 @@ class PochakedPostTabmanViewController: UIViewController { ProfileService.getProfile(handle: handle, request: request) { [weak self] data, failed in guard let data = data else { switch failed { + case .clientError: + print("client error") case .disconnected: self?.present(UIAlertController.networkErrorAlert(title: failed!.localizedDescription), animated: true) case .serverError: From 4da24f4989644d917da49457ffa866c5b60a65b8 Mon Sep 17 00:00:00 2001 From: Jungyeon Seo Date: Mon, 9 Dec 2024 20:22:35 +0900 Subject: [PATCH 50/54] =?UTF-8?q?Fix=20:=20enum=EC=9C=BC=EB=A1=9C=20?= =?UTF-8?q?=EC=88=98=EC=A0=95?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- pochak/pochak.xcodeproj/project.pbxproj | 4 +++ .../Global/Types/HandleDuplicationType.swift | 25 +++++++++++++++++++ .../UI/Login/SignUpViewController.swift | 12 ++++++--- 3 files changed, 37 insertions(+), 4 deletions(-) create mode 100644 pochak/pochak/Global/Types/HandleDuplicationType.swift diff --git a/pochak/pochak.xcodeproj/project.pbxproj b/pochak/pochak.xcodeproj/project.pbxproj index 6a00baab..a71a6ed5 100644 --- a/pochak/pochak.xcodeproj/project.pbxproj +++ b/pochak/pochak.xcodeproj/project.pbxproj @@ -173,6 +173,7 @@ 37D311E52B567AE000A1D7C1 /* OtherUserProfileViewController.swift in Sources */ = {isa = PBXBuildFile; fileRef = 37D311E42B567AE000A1D7C1 /* OtherUserProfileViewController.swift */; }; 37EED79D2CFDDC3800254471 /* ProfileDataSingleton.swift in Sources */ = {isa = PBXBuildFile; fileRef = 37EED79C2CFDDC1F00254471 /* ProfileDataSingleton.swift */; }; 37EED79F2CFDFE9100254471 /* Notification+.swift in Sources */ = {isa = PBXBuildFile; fileRef = 37EED79E2CFDFE9100254471 /* Notification+.swift */; }; + 37EED7A12D07094F00254471 /* HandleDuplicationType.swift in Sources */ = {isa = PBXBuildFile; fileRef = 37EED7A02D07094F00254471 /* HandleDuplicationType.swift */; }; A6D48ED7F8B86CF57C481991 /* Pods_pochak_pochakUITests.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = BC75B5747D3AC9026B862E11 /* Pods_pochak_pochakUITests.framework */; }; AF5AAB97DDEAC75EAEDDCFE4 /* Pods_pochak.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = A65A7656D9D72CC873C98FD4 /* Pods_pochak.framework */; }; EA01079A2A59556800A3AE85 /* CommentViewController.swift in Sources */ = {isa = PBXBuildFile; fileRef = EA0107952A59556800A3AE85 /* CommentViewController.swift */; }; @@ -421,6 +422,7 @@ 37D311E42B567AE000A1D7C1 /* OtherUserProfileViewController.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = OtherUserProfileViewController.swift; sourceTree = ""; }; 37EED79C2CFDDC1F00254471 /* ProfileDataSingleton.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = ProfileDataSingleton.swift; sourceTree = ""; }; 37EED79E2CFDFE9100254471 /* Notification+.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = "Notification+.swift"; sourceTree = ""; }; + 37EED7A02D07094F00254471 /* HandleDuplicationType.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = HandleDuplicationType.swift; sourceTree = ""; }; 67EA6B5B881844A22EE2A55B /* Pods-pochak.debug.xcconfig */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = text.xcconfig; name = "Pods-pochak.debug.xcconfig"; path = "Target Support Files/Pods-pochak/Pods-pochak.debug.xcconfig"; sourceTree = ""; }; 6E1916A70A802F298FF38F24 /* Pods_pochakTests.framework */ = {isa = PBXFileReference; explicitFileType = wrapper.framework; includeInIndex = 0; path = Pods_pochakTests.framework; sourceTree = BUILT_PRODUCTS_DIR; }; 9D5440AA571B5DB6291304B2 /* Pods-pochakTests.debug.xcconfig */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = text.xcconfig; name = "Pods-pochakTests.debug.xcconfig"; path = "Target Support Files/Pods-pochakTests/Pods-pochakTests.debug.xcconfig"; sourceTree = ""; }; @@ -788,6 +790,7 @@ 089E27B62C4E8C2D00828F4C /* AlarmType.swift */, 089E27B82C4E8CB800828F4C /* AlertType.swift */, 080FEF002C551C3200951460 /* ReportType.swift */, + 37EED7A02D07094F00254471 /* HandleDuplicationType.swift */, ); path = Types; sourceTree = ""; @@ -1780,6 +1783,7 @@ 3747E9722BF3827500364BED /* SettingsViewController.swift in Sources */, 3769D6D22B3C56F100294CD1 /* PochakPostTabmanViewController.swift in Sources */, 371D337A2B4E8D1F0084FF6A /* KeychainManager.swift in Sources */, + 37EED7A12D07094F00254471 /* HandleDuplicationType.swift in Sources */, EAF918542AA4692E0037C270 /* NetworkResult.swift in Sources */, 0822A07D2CA19A9A00F87E2C /* UICommentModel.swift in Sources */, 3759CF3F2CAB145500408A4E /* CheckDuplicateHandleAPI.swift in Sources */, diff --git a/pochak/pochak/Global/Types/HandleDuplicationType.swift b/pochak/pochak/Global/Types/HandleDuplicationType.swift new file mode 100644 index 00000000..271bfb96 --- /dev/null +++ b/pochak/pochak/Global/Types/HandleDuplicationType.swift @@ -0,0 +1,25 @@ +// +// HandleDuplicationType.swift +// pochak +// +// Created by Seo Cindy on 12/9/24. +// + +import Foundation + +enum MemberCode: String { + case success = "MEMBER2001" // 중복 검사 성공 + case duplicationError = "MEMBER4002" // 중복된 아이디 + case unknown // 알 수 없는 코드 + + init(rawValue: String) { + switch rawValue { + case "MEMBER2001": + self = .success + case "MEMBER4002": + self = .duplicationError + default: + self = .unknown + } + } +} diff --git a/pochak/pochak/UI/Login/SignUpViewController.swift b/pochak/pochak/UI/Login/SignUpViewController.swift index 85170fbf..f6eac8c2 100644 --- a/pochak/pochak/UI/Login/SignUpViewController.swift +++ b/pochak/pochak/UI/Login/SignUpViewController.swift @@ -104,22 +104,26 @@ final class SignUpViewController: UIViewController { AuthenticationService.checkDuplicateHandle(request: request) { [weak self] data, failed in guard let data = data else { - print(failed) return } - if data.code == "MEMBER2001" { - // 중복 검사 버튼 상태 변경 + + let code = data.code + let memberCode = MemberCode(rawValue: code) + switch memberCode { + case .success: self?.checkHandleDuplicationBtn.setImage(UIImage(named: "checkedHandle"), for: .normal) self?.handleTextField.textColor = UIColor(named: "yellow00") self?.checkHandleDuplicationBtn.isEnabled = false self?.handleDuplicationChecked = true - } else if data.code == "MEMBER4002" { + case .duplicationError: self?.showAlert(alertType: .confirmOnly, titleText: "중복된 아이디입니다", messageText: "다른 아이디를 입력해주세요.", cancelButtonText: "", confirmButtonText: "확인" ) + case .unknown: + print("Unknown code: \(code)") } } } From c9f83224eeb7099bd7b15fd79b0895210b09f2b7 Mon Sep 17 00:00:00 2001 From: Jungyeon Seo Date: Mon, 9 Dec 2024 20:53:37 +0900 Subject: [PATCH 51/54] =?UTF-8?q?Refactor=20:=20=EB=A1=9C=EA=B7=B8?= =?UTF-8?q?=EC=9D=B8,=20=ED=9A=8C=EC=9B=90=EA=B0=80=EC=9E=85=20=ED=83=AD?= =?UTF-8?q?=20=EB=A6=AC=ED=8C=A9=ED=86=A0=EB=A7=81?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../AppleLogin/AppleLoginDataManager.swift | 31 +-- .../AppleLogin/AppleLoginDataModel.swift | 18 +- .../GoogleLogin/GoogleLoginDataManager.swift | 25 +- .../UI/Login/SignUpViewController.swift | 230 +++++++++--------- .../UI/Login/SocialJoinViewController.swift | 60 ++--- .../UI/Login/TermsOfAgreeViewController.swift | 17 +- 6 files changed, 166 insertions(+), 215 deletions(-) diff --git a/pochak/pochak/UI/Login/AppleLogin/AppleLoginDataManager.swift b/pochak/pochak/UI/Login/AppleLogin/AppleLoginDataManager.swift index fe30c404..ac576b02 100644 --- a/pochak/pochak/UI/Login/AppleLogin/AppleLoginDataManager.swift +++ b/pochak/pochak/UI/Login/AppleLogin/AppleLoginDataManager.swift @@ -12,25 +12,20 @@ class AppleLoginDataManager { static let shared = AppleLoginDataManager() - func appleLoginDataManager(_ IdentityToken : String, _ authorizationCode : String, _ completion: @escaping (AppleLoginModel) -> Void) { + func appleLoginDataManager(_ IdentityToken: String, _ authorizationCode: String, _ completion: @escaping (AppleLoginModel) -> Void) { let url = "\(APIConstants.baseURL)/apple/login" - let header : HTTPHeaders = ["IdentityToken": IdentityToken, "AuthorizationCode" : authorizationCode] - - print(">>>>> appleLoginDataManager url == \(url)") - print(">>>>> appleLoginDataManager header == \(header)") + let header: HTTPHeaders = ["IdentityToken": IdentityToken, "AuthorizationCode": authorizationCode] + AF.request(url, method: .post, headers: header).validate().responseDecodable(of: AppleLoginResponse.self) { response in - print(response.result) - switch response.result { - case .success(let result): - let resultData = result.result - print(result) - completion(resultData) - case .failure(let error): - print("appleLoginDataManager error : \(error.localizedDescription)") - if let data = response.data, let errorMessage = String(data: data, encoding: .utf8) { - print("Failure Data: \(errorMessage)") - } - } - } + switch response.result { + case .success(let result): + let resultData = result.result + completion(resultData) + case .failure(let error): + if let data = response.data, let errorMessage = String(data: data, encoding: .utf8) { + print("Failure Data: \(errorMessage)") + } + } + } } } diff --git a/pochak/pochak/UI/Login/AppleLogin/AppleLoginDataModel.swift b/pochak/pochak/UI/Login/AppleLogin/AppleLoginDataModel.swift index e45941e6..d64df1d6 100644 --- a/pochak/pochak/UI/Login/AppleLogin/AppleLoginDataModel.swift +++ b/pochak/pochak/UI/Login/AppleLogin/AppleLoginDataModel.swift @@ -14,13 +14,13 @@ struct AppleLoginResponse: Codable { let result: AppleLoginModel } -struct AppleLoginModel : Codable { - var socialId : String? - var name : String? - var email : String? - var handle : String? - var socialType : String? - var accessToken : String? - var refreshToken : String? - var isNewMember : Bool? +struct AppleLoginModel: Codable { + let socialId: String? + let name: String? + let email: String? + let handle: String? + let socialType: String? + let accessToken: String? + let refreshToken: String? + let isNewMember: Bool? } diff --git a/pochak/pochak/UI/Login/GoogleLogin/GoogleLoginDataManager.swift b/pochak/pochak/UI/Login/GoogleLogin/GoogleLoginDataManager.swift index 0b438d1c..35d1a775 100644 --- a/pochak/pochak/UI/Login/GoogleLogin/GoogleLoginDataManager.swift +++ b/pochak/pochak/UI/Login/GoogleLogin/GoogleLoginDataManager.swift @@ -11,20 +11,19 @@ class GoogleLoginDataManager { static let shared = GoogleLoginDataManager() - func googleLoginDataManager(_ accessToken : String, _ completion: @escaping (GoogleLoginModel) -> Void) { + func googleLoginDataManager(_ accessToken: String, _ completion: @escaping (GoogleLoginModel) -> Void) { let url = "\(APIConstants.baseURL)/google/login/\(accessToken)" - + AF.request(url, method: .get).validate().responseDecodable(of: GoogleLoginResponse.self) { response in - switch response.result { - case .success(let result): - let resultData = result.result - completion(resultData) - case .failure(let error): - print("googleLoginDataManager error : \(error)") - if let data = response.data, let errorMessage = String(data: data, encoding: .utf8) { - print("Failure Data: \(errorMessage)") - } - } - } + switch response.result { + case .success(let result): + let resultData = result.result + completion(resultData) + case .failure(let error): + if let data = response.data, let errorMessage = String(data: data, encoding: .utf8) { + print("Failure Data: \(errorMessage)") + } + } + } } } diff --git a/pochak/pochak/UI/Login/SignUpViewController.swift b/pochak/pochak/UI/Login/SignUpViewController.swift index f6eac8c2..5dd27a57 100644 --- a/pochak/pochak/UI/Login/SignUpViewController.swift +++ b/pochak/pochak/UI/Login/SignUpViewController.swift @@ -11,17 +11,17 @@ final class SignUpViewController: UIViewController { // MARK: - Properties + private var backBtnPressed: Bool = false + private var handleDuplicationChecked: Bool = false private let textViewPlaceHolder = "소개를 입력해주세요.\n(최대 50자, 3줄)" private let email = UserDefaultsManager.getData(type: String.self, forKey: .email) ?? "email not found" private let socialType = UserDefaultsManager.getData(type: String.self, forKey: .socialType) ?? "socialType not found" private let socialId = UserDefaultsManager.getData(type: String.self, forKey: .socialId) ?? "socialId not found" private let socialRefreshToken = UserDefaultsManager.getData(type: String.self, forKey: .socialRefreshToken) ?? "NOTAPPLELOGINUSER" - private var backBtnPressed : Bool = false - private var handleDuplicationChecked : Bool = false private let imagePickerController = UIImagePickerController() // MARK: - Views - + @IBOutlet weak var profileImg: UIButton! @IBOutlet weak var nameTextField: UITextField! @IBOutlet weak var handleTextField: UITextField! @@ -29,86 +29,25 @@ final class SignUpViewController: UIViewController { @IBOutlet weak var checkHandleDuplicationBtn: UIButton! // MARK: - Lifecycle - + override func viewDidLoad() { super.viewDidLoad() - - // UINavigationController 스와이프해서 뒤로가기 막기 - self.navigationController?.interactivePopGestureRecognizer?.isEnabled = false - - // 네비게이션바 완료 버튼 커스텀 - let button = UIButton() - button.setTitle("완료", for: .normal) - button.setTitleColor(UIColor(named: "yellow00"), for: .normal) - button.titleLabel?.font = UIFont(name: "Pretendard-Bold", size: 16) - button.addTarget(self, action: #selector(doneBtnTapped), for: .touchUpInside) - let barButton = UIBarButtonItem(customView: button) - self.navigationItem.rightBarButtonItem = barButton - - // 네비게이션바 title 커스텀 - self.navigationController?.navigationBar.tintColor = .black - self.navigationItem.title = "프로필 설정" - self.navigationController?.navigationBar.titleTextAttributes = [ NSAttributedString.Key.foregroundColor : UIColor.black, NSAttributedString.Key.font : UIFont(name: "Pretendard-Bold", size: 20) ?? UIFont.systemFont(ofSize: 20, weight: .bold)] - - // 네비게이션바 Back 버튼 커스텀 - let backBarButtonItem = UIBarButtonItem(image: UIImage(named: "ChevronLeft")?.withRenderingMode(.alwaysOriginal), style: .plain, target: self, action: #selector(backbuttonPressed)) - backBarButtonItem.imageInsets = UIEdgeInsets(top: 0, left: 2, bottom: 0, right: 0) - self.navigationItem.leftBarButtonItem = backBarButtonItem - // self.navigationItem.backBarButtonItem = UIBarButtonItem(title: nil, style: .plain, target: nil, action: nil) - - - // 프로필 image 레이아웃 - profileImg.setImage(UIImage(named: "chooseProfileIcon"), for: .normal) - profileImg.imageView?.contentMode = .scaleAspectFill - profileImg.layer.masksToBounds = true - profileImg.layer.cornerRadius = 58 - - // textView 레이아웃 설정 - messageTextView.delegate = self - messageTextView.textContainer.lineFragmentPadding = 0 // textView 기본 마진 제거 - messageTextView.textContainerInset = .zero // textView 기본 마진 제거 - messageTextView.text = textViewPlaceHolder // PlaceHolder 커스텀 - messageTextView.textColor = UIColor(named: "gray03") // PlaceHolder 커스텀 - - // 중복확인 버튼 기본 이미지 세팅 - checkHandleDuplicationBtn.setImage(UIImage(named: "checkHandle"), for: .normal) - - // 핸들 입력 중이면 중복확인 버튼 및 텍스트필드 글자 색 세팅 원래대로 변경 - handleTextField.addTarget(self, action: #selector(self.textFieldDidChange(_:)), for: .editingChanged) - handleTextField.delegate = self + setUpViewController() + setUpNavigationBar() } // MARK: - Actions - - @objc private func backbuttonPressed(_ sender: Any) { - backBtnPressed = true - showAlert(alertType: .confirmAndCancel, - titleText: "프로필 설정을 취소하고\n페이지를 나갈까요?", - messageText: "페이지를 벗어나면 현재 입력된 내용은\n저장되지 않으며, 모두 사라집니다.", - cancelButtonText: "나가기", - confirmButtonText: "계속하기" - ) - } - - @objc func textFieldDidChange(_ sender: Any?) { - handleDuplicationChecked = false - checkHandleDuplicationBtn.isEnabled = true - handleTextField.textColor = .black - checkHandleDuplicationBtn.setImage(UIImage(named: "checkHandle"), for: .normal) - } - @IBAction func checkHandleDuplication(_ sender: Any) { guard let handle = handleTextField.text else { return } let request = CheckDuplicateHandleRequest(handle: handle) AuthenticationService.checkDuplicateHandle(request: request) { [weak self] data, failed in - guard let data = data else { - return - } + guard let data = data else { return } let code = data.code let memberCode = MemberCode(rawValue: code) + switch memberCode { case .success: self?.checkHandleDuplicationBtn.setImage(UIImage(named: "checkedHandle"), for: .normal) @@ -120,27 +59,52 @@ final class SignUpViewController: UIViewController { titleText: "중복된 아이디입니다", messageText: "다른 아이디를 입력해주세요.", cancelButtonText: "", - confirmButtonText: "확인" - ) + confirmButtonText: "확인") case .unknown: print("Unknown code: \(code)") } } } - @objc private func doneBtnTapped(_ sender: Any) { - // 새로운 유저 정보 UserDefaults에 저장 : name / handle / message - guard let name = nameTextField.text else {return} - guard let handle = handleTextField.text else {return} - guard let message = messageTextView.text else {return} - guard let profileImage = profileImg.currentImage else {return} + // 프로필 사진 설정 + /* + 1. 권한 설정: Info.plist > Photo Library Usage 권한 추가 + 2. UIImagePickerController 선언 + 3. @IBAction 정의 + 4. 프로토콜 채택 + */ + @IBAction func profileBtnTapped(_ sender: Any) { + self.imagePickerController.delegate = self + self.imagePickerController.sourceType = .photoLibrary + present(self.imagePickerController, animated: true, completion: nil) + } + + @objc func backbuttonPressed(_ sender: Any) { + backBtnPressed = true + showAlert(alertType: .confirmAndCancel, + titleText: "프로필 설정을 취소하고\n페이지를 나갈까요?", + messageText: "페이지를 벗어나면 현재 입력된 내용은\n저장되지 않으며, 모두 사라집니다.", + cancelButtonText: "나가기", + confirmButtonText: "계속하기" + ) + } + + @objc func textFieldDidChange(_ sender: Any?) { + handleDuplicationChecked = false + checkHandleDuplicationBtn.isEnabled = true + handleTextField.textColor = .black + checkHandleDuplicationBtn.setImage(UIImage(named: "checkHandle"), for: .normal) + } + + @objc func doneBtnTapped(_ sender: Any) { + guard let name = nameTextField.text else { return } + guard let handle = handleTextField.text else { return } + guard let message = messageTextView.text else { return } + guard let profileImage = profileImg.currentImage else { return } let profileImageData: Data? = profileImg.currentImage?.jpegData(compressionQuality: 0.2) - if (name == "" || - handle == "" || - message == textViewPlaceHolder || - message == "" || - profileImage == UIImage(named: "chooseProfileIcon")) { + if (name == "" || handle == "" || message == textViewPlaceHolder || message == "" + || profileImage == UIImage(named: "chooseProfileIcon")) { showAlert(alertType: .confirmOnly, titleText: "프로필 정보를 모두 입력해주세요.", messageText: "", @@ -169,22 +133,18 @@ final class SignUpViewController: UIViewController { } AuthenticationService.signUp(request: request, files: files) { [weak self] data, failed in - guard let data = data else { - print(failed) - return - } - // 새로운 유저 정보 UserDefaults에 저장 : id / name / handle / message / IsNewMember + guard let data = data else { return } + + // 새로운 유저 정보 UserDefaults에 저장: id, name, handle, message, isNewMember UserDefaultsManager.setData(value: data.result.name, key: .name) UserDefaultsManager.setData(value: data.result.id, key: .memberId) UserDefaultsManager.setData(value: handle, key: .handle) UserDefaultsManager.setData(value: message, key: .message) UserDefaultsManager.setData(value: data.result.isNewMember, key: .isNewMember) - // 유저 토큰 정보 저장 @KeyChainManager + // 유저 토큰 정보 KeyChainManager에 저장 guard let accountAccessToken = data.result.accessToken else { return } guard let accountRefreshToken = data.result.refreshToken else { return } - print("JoinDataManager accountAccessToken = \(accountAccessToken)") - print("JoinDataManager accountRefreshToken = \(accountRefreshToken)") do { try KeychainManager.save(account: "accessToken", value: accountAccessToken, isForce: true) try KeychainManager.save(account: "refreshToken", value: accountRefreshToken, isForce: true) @@ -197,27 +157,57 @@ final class SignUpViewController: UIViewController { } } - // 프로필 사진 설정 - /* - 1. 권한 설정 : Info.plist > Photo Library Usage 권한 추가 - 2. UIImagePickerController 선언 - 3. @IBAction 정의 - 4. 프로토콜 채택 - */ - @IBAction func profileBtnTapped(_ sender: Any) { - self.imagePickerController.delegate = self - self.imagePickerController.sourceType = .photoLibrary - present(self.imagePickerController, animated: true, completion: nil) + // MARK: - Functions + + private func setUpViewController() { + // 프로필 image 레이아웃 + profileImg.setImage(UIImage(named: "chooseProfileIcon"), for: .normal) + profileImg.imageView?.contentMode = .scaleAspectFill + profileImg.layer.masksToBounds = true + profileImg.layer.cornerRadius = 58 + + // textView 레이아웃 설정 + messageTextView.delegate = self + messageTextView.textContainer.lineFragmentPadding = 0 // textView 기본 마진 제거 + messageTextView.textContainerInset = .zero // textView 기본 마진 제거 + messageTextView.text = textViewPlaceHolder // PlaceHolder 커스텀 + messageTextView.textColor = UIColor(named: "gray03") // PlaceHolder 커스텀 + + // 중복확인 버튼 기본 이미지 세팅 + checkHandleDuplicationBtn.setImage(UIImage(named: "checkHandle"), for: .normal) + + // 핸들 입력 중이면 중복확인 버튼 및 텍스트필드 글자 색 세팅 원래대로 변경 + handleTextField.addTarget(self, action: #selector(self.textFieldDidChange(_:)), for: .editingChanged) + handleTextField.delegate = self } - // MARK: - Functions - - private func toHomeTabPage(){ + private func setUpNavigationBar() { + self.navigationController?.interactivePopGestureRecognizer?.isEnabled = false + + // 네비게이션바 완료 버튼 커스텀 + let button = UIButton() + button.setTitle("완료", for: .normal) + button.setTitleColor(UIColor(named: "yellow00"), for: .normal) + button.titleLabel?.font = UIFont(name: "Pretendard-Bold", size: 16) + button.addTarget(self, action: #selector(doneBtnTapped), for: .touchUpInside) + let barButton = UIBarButtonItem(customView: button) + self.navigationItem.rightBarButtonItem = barButton + + // 네비게이션바 title 커스텀 + self.navigationController?.navigationBar.tintColor = .black + self.navigationItem.title = "프로필 설정" + self.navigationController?.navigationBar.titleTextAttributes = [ NSAttributedString.Key.foregroundColor: UIColor.black, NSAttributedString.Key.font: UIFont(name: "Pretendard-Bold", size: 20) ?? UIFont.systemFont(ofSize: 20, weight: .bold)] + + // 네비게이션바 Back 버튼 커스텀 + let backBarButtonItem = UIBarButtonItem(image: UIImage(named: "ChevronLeft")?.withRenderingMode(.alwaysOriginal), style: .plain, target: self, action: #selector(backbuttonPressed)) + backBarButtonItem.imageInsets = UIEdgeInsets(top: 0, left: 2, bottom: 0, right: 0) + self.navigationItem.leftBarButtonItem = backBarButtonItem + } + + private func toHomeTabPage() { let tabBarController = CustomTabBarController() let sceneDelegate = UIApplication.shared.connectedScenes.first?.delegate as? SceneDelegate - guard let delegate = sceneDelegate else { - return - } + guard let delegate = sceneDelegate else { return } delegate.window?.rootViewController = tabBarController } @@ -227,18 +217,18 @@ final class SignUpViewController: UIViewController { } } -// MARK: - Extension : UIImagePickerControllerDelegate, UINavigationControllerDelegate +// MARK: - Extension: UIImagePickerControllerDelegate, UINavigationControllerDelegate // 앨범 사진 선택 프로토콜 채택 extension SignUpViewController: UIImagePickerControllerDelegate, UINavigationControllerDelegate { // 선택한 사진 사용 func imagePickerController(_ picker: UIImagePickerController, - didFinishPickingMediaWithInfo info: [UIImagePickerController.InfoKey : Any]) { + didFinishPickingMediaWithInfo info: [UIImagePickerController.InfoKey: Any]) { if let image = info[UIImagePickerController.InfoKey.originalImage] as? UIImage { profileImg.setImage(image, for: .normal) } - picker.dismiss(animated: true, completion: nil) // 주의점 : picker 숨기기 위한 dismiss를 직접 해야함 + picker.dismiss(animated: true, completion: nil) // 주의점: picker 숨기기 위한 dismiss를 직접 해야함 } // 취소 @@ -247,7 +237,7 @@ extension SignUpViewController: UIImagePickerControllerDelegate, UINavigationCon } } -// MARK: - Extension : UITextViewDelegate, UITextFieldDelegate +// MARK: - Extension: UITextViewDelegate, UITextFieldDelegate extension SignUpViewController: UITextViewDelegate { @@ -268,7 +258,7 @@ extension SignUpViewController: UITextViewDelegate { // 최대 글자 수 50자 제한 func textView(_ textView: UITextView, shouldChangeTextIn range: NSRange, replacementText text: String) -> Bool { let currentText = textView.text ?? "" - guard let stringRange = Range(range, in: currentText) else {return false} + guard let stringRange = Range(range, in: currentText) else { return false } let changedText = currentText.replacingCharacters(in: stringRange, with: text) return changedText.count <= 50 } @@ -284,7 +274,7 @@ extension SignUpViewController: UITextViewDelegate { var consecutiveLineBreakCount = 0 // 연속된 줄 바꿈 횟수 print("lines == \(lines)") - for line in lines { + for _ in lines { consecutiveLineBreakCount += 1 if consecutiveLineBreakCount > maxNumberOfLines { textView.text = String(text.dropLast()) // 마지막 입력 문자를 제거 @@ -294,20 +284,18 @@ extension SignUpViewController: UITextViewDelegate { } } -extension SignUpViewController : UITextFieldDelegate { +extension SignUpViewController: UITextFieldDelegate { func textField(_ textField: UITextField, shouldChangeCharactersIn range: NSRange, replacementString string: String) -> Bool { let utf8Char = string.cString(using: .utf8) let isBackSpace = strcmp(utf8Char, "\\b") - if string.hasCharacters() || isBackSpace == -92{ - return true - } + if string.hasCharacters() || isBackSpace == -92 { return true } return false } } -// MARK: - Extension : CustomAlertDelegate +// MARK: - Extension: CustomAlertDelegate -extension SignUpViewController : CustomAlertDelegate { +extension SignUpViewController: CustomAlertDelegate { func cancel() { if backBtnPressed { self.navigationController?.popViewController(animated: true) @@ -321,9 +309,9 @@ extension SignUpViewController : CustomAlertDelegate { } } -// MARK: - Extension : String +// MARK: - Extension: String -// 아이디 허용 가능한 문자 제한 : 대문자, 소문자, 숫자, _(언더바), .(마침표) +// 아이디 허용 가능한 문자 제한: 대문자, 소문자, 숫자, _(언더바), .(마침표) extension String { func hasCharacters() -> Bool { do { diff --git a/pochak/pochak/UI/Login/SocialJoinViewController.swift b/pochak/pochak/UI/Login/SocialJoinViewController.swift index 2c5bace3..04b9618d 100644 --- a/pochak/pochak/UI/Login/SocialJoinViewController.swift +++ b/pochak/pochak/UI/Login/SocialJoinViewController.swift @@ -10,7 +10,7 @@ import GoogleSignIn import AuthenticationServices // 애플 로그인 protocol SendDelegate { - func sendAgreed(agree : Bool) + func sendAgreed(agree: Bool) } final class SocialJoinViewController: UIViewController { @@ -48,15 +48,11 @@ final class SocialJoinViewController: UIViewController { // Get User Info let user = signInResult.user let accessToken = user.accessToken.tokenString - print("googleLogin 시스템 안의 accessToken : \(accessToken)") - // 로딩 모달 self.showProgressBar() - GoogleLoginDataManager.shared.googleLoginDataManager(accessToken, {resultData in - - print("GoogleLoginDataManager 안의 resultData : \(resultData)") - // 사용자 기본 데이터 저장 : socialId, email, socialType + GoogleLoginDataManager.shared.googleLoginDataManager(accessToken, { resultData in + // 사용자 기본 데이터 저장: socialId, email, socialType UserDefaultsManager.setData(value: resultData.socialId, key: .socialId) UserDefaultsManager.setData(value: resultData.email, key: .email) UserDefaultsManager.setData(value: resultData.socialType, key: .socialType) @@ -64,7 +60,6 @@ final class SocialJoinViewController: UIViewController { guard let isNewMember = resultData.isNewMember else { return } self.changeViewControllerAccordingToisNewMemeberStateForGoogle(isNewMember, resultData) - // 로딩 숨김 self.hideProgressBar() }) } @@ -90,14 +85,13 @@ final class SocialJoinViewController: UIViewController { appleLoginBtn.layer.cornerRadius = 30 } - private func changeViewControllerAccordingToisNewMemeberStateForGoogle(_ isNewMember : Bool, _ resultDataForGoogle : GoogleLoginModel) { + private func changeViewControllerAccordingToisNewMemeberStateForGoogle(_ isNewMember: Bool, _ resultDataForGoogle: GoogleLoginModel) { if isNewMember == true { - guard let termsOfAgreeVC = self.storyboard?.instantiateViewController(withIdentifier: "TermsOfAgreeVC") as? TermsOfAgreeViewController else {return} + guard let termsOfAgreeVC = self.storyboard?.instantiateViewController(withIdentifier: "TermsOfAgreeVC") as? TermsOfAgreeViewController else { return } termsOfAgreeVC.modalPresentationStyle = .overCurrentContext // 투명도가 있으면 투명도에 맞춰서 나오게 해주는 코드(뒤에있는 배경이 보일 수 있게) termsOfAgreeVC.delegate = self self.present(termsOfAgreeVC, animated: false, completion: nil) } else { - // 이미 회원인 유저의 경우 토큰 정보 저장 @KeyChainManager guard let accountAccessToken = resultDataForGoogle.accessToken else { return } guard let accountRefreshToken = resultDataForGoogle.refreshToken else { return } do { @@ -106,22 +100,18 @@ final class SocialJoinViewController: UIViewController { } catch { print(error) } - // UserDefaults에 handle 정보 저장 UserDefaultsManager.setData(value: resultDataForGoogle.handle, key: .handle) - // 홈탭으로 이동 toHomeTabPage() } } - private func changeViewControllerAccordingToisNewMemeberStateForApple(_ isNewMember : Bool, _ resultDataForApple : AppleLoginModel) { + private func changeViewControllerAccordingToisNewMemeberStateForApple(_ isNewMember: Bool, _ resultDataForApple: AppleLoginModel) { if isNewMember == true { - // 프로필 설정 페이지로 이동 - guard let termsOfAgreeVC = self.storyboard?.instantiateViewController(withIdentifier: "TermsOfAgreeVC") as? TermsOfAgreeViewController else {return} + guard let termsOfAgreeVC = self.storyboard?.instantiateViewController(withIdentifier: "TermsOfAgreeVC") as? TermsOfAgreeViewController else { return } termsOfAgreeVC.modalPresentationStyle = .overCurrentContext termsOfAgreeVC.delegate = self self.present(termsOfAgreeVC, animated: false, completion: nil) } else { - // 이미 회원인 유저의 경우 토큰 정보 저장 @KeyChainManager guard let accountAccessToken = resultDataForApple.accessToken else { return } guard let accountRefreshToken = resultDataForApple.refreshToken else { return } do { @@ -130,9 +120,7 @@ final class SocialJoinViewController: UIViewController { } catch { print(error) } - // UserDefaults에 handle 정보 저장 UserDefaultsManager.setData(value: resultDataForApple.handle, key: .handle) - // 홈탭으로 이동 toHomeTabPage() } } @@ -140,16 +128,15 @@ final class SocialJoinViewController: UIViewController { private func toHomeTabPage() { let tabBarController = CustomTabBarController() let sceneDelegate = UIApplication.shared.connectedScenes.first?.delegate as? SceneDelegate - guard let delegate = sceneDelegate else { - return - } + guard let delegate = sceneDelegate else { return } delegate.window?.rootViewController = tabBarController } } -// MARK: - Extension : ASAuthorizationControllerDelegate, ASAuthorizationControllerPresentationContextProviding +// MARK: - Extension: ASAuthorizationControllerDelegate, ASAuthorizationControllerPresentationContextProviding extension SocialJoinViewController: ASAuthorizationControllerDelegate, ASAuthorizationControllerPresentationContextProviding { + func presentationAnchor(for controller: ASAuthorizationController) -> ASPresentationAnchor { return self.view.window! } @@ -164,22 +151,16 @@ extension SocialJoinViewController: ASAuthorizationControllerDelegate, ASAuthori let email = appleIDCredential.email - if let authorizationCode = appleIDCredential.authorizationCode, - let identityToken = appleIDCredential.identityToken, - let authCodeString = String(data: authorizationCode, encoding: .utf8), - let identifyTokenString = String(data: identityToken, encoding: .utf8) { - print("authorizationCode: \(authorizationCode)") - print("identityToken: \(identityToken)") - print("authCodeString: \(authCodeString)") - print("identifyTokenString: \(identifyTokenString)") + if let authorizationCode = appleIDCredential.authorizationCode, + let identityToken = appleIDCredential.identityToken, + let authCodeString = String(data: authorizationCode, encoding: .utf8), + let identifyTokenString = String(data: identityToken, encoding: .utf8) { - // 로딩 모달 self.showProgressBar() - // API request : POST + // API request: POST AppleLoginDataManager.shared.appleLoginDataManager(identifyTokenString, authCodeString, { resultData in - - // 사용자 기본 데이터 저장 : id / email / socialType / isNewMember + // 사용자 기본 데이터 저장: id, email, socialType, isNewMember UserDefaultsManager.setData(value: resultData.socialId, key: .socialId) UserDefaultsManager.setData(value: resultData.email, key: .email) UserDefaultsManager.setData(value: resultData.socialType, key: .socialType) @@ -187,7 +168,6 @@ extension SocialJoinViewController: ASAuthorizationControllerDelegate, ASAuthori guard let isNewMember = resultData.isNewMember else { return } self.changeViewControllerAccordingToisNewMemeberStateForApple(isNewMember, resultData) - // 로딩 숨김 self.hideProgressBar() }) } @@ -195,10 +175,6 @@ extension SocialJoinViewController: ASAuthorizationControllerDelegate, ASAuthori // Sign in using an existing iCloud Keychain credential. let username = passwordCredential.user let password = passwordCredential.password - - print("username: \(username)") - print("password: \(password)") - default: break } @@ -210,7 +186,7 @@ extension SocialJoinViewController: ASAuthorizationControllerDelegate, ASAuthori } } -// MARK: - Extension : SendDelegate +// MARK: - Extension: SendDelegate extension SocialJoinViewController: SendDelegate { func sendAgreed(agree: Bool) { @@ -219,7 +195,7 @@ extension SocialJoinViewController: SendDelegate { as? SignUpViewController else { return } self.navigationController?.pushViewController(signUpVC, animated: true) } else { - print("not agreed yet!") + print("not agreed yet") } } } diff --git a/pochak/pochak/UI/Login/TermsOfAgreeViewController.swift b/pochak/pochak/UI/Login/TermsOfAgreeViewController.swift index 3ce70ac5..56718ec0 100644 --- a/pochak/pochak/UI/Login/TermsOfAgreeViewController.swift +++ b/pochak/pochak/UI/Login/TermsOfAgreeViewController.swift @@ -12,9 +12,9 @@ final class TermsOfAgreeViewController: UIViewController, UIViewControllerTransi // MARK: - Properties - private var didAgreeForPrivacyPolicy : Bool = false - private var didAgreeForTermsOfUse : Bool = false - var delegate : SendDelegate? + var delegate: SendDelegate? + private var didAgreeForPrivacyPolicy: Bool = false + private var didAgreeForTermsOfUse: Bool = false // MARK: - Views @@ -51,7 +51,6 @@ final class TermsOfAgreeViewController: UIViewController, UIViewControllerTransi titleLabel.font = UIFont(name: "Pretendard-SemiBold", size: 18) titleLabel.textColor = .black - agreeForPrivacyPolicy.setTitle(" [필수] 개인정보 제3자 제공 동의", for: .normal) agreeForPrivacyPolicy.setImage(UIImage(systemName: "checkmark.circle"), for: .normal) agreeForPrivacyPolicy.titleLabel?.font = UIFont(name: "Pretendard-Medium", size: 15) @@ -67,7 +66,7 @@ final class TermsOfAgreeViewController: UIViewController, UIViewControllerTransi } // MARK: - Actions - + @IBAction func pressAgreeForPrivacyPolicy(_ sender: Any) { if !didAgreeForPrivacyPolicy { didAgreeForPrivacyPolicy = true @@ -80,7 +79,6 @@ final class TermsOfAgreeViewController: UIViewController, UIViewControllerTransi agreeForPrivacyPolicy.setImage(UIImage(systemName: "checkmark.circle"), for: .normal) agreeForPrivacyPolicy.tintColor = UIColor(named: "gray04") } - } @IBAction func pressAgreeForTermsOfUSe(_ sender: Any) { @@ -97,21 +95,17 @@ final class TermsOfAgreeViewController: UIViewController, UIViewControllerTransi } } - @IBAction func openPrivacyPolicy(_ sender: Any) { guard let url = URL(string: "https://pochak.notion.site/e365e34f018949b88543adbe6b0b3746") else { return } let safariVC = SFSafariViewController(url: url) - // delegate 지정 및 presentation style 설정 safariVC.transitioningDelegate = self safariVC.modalPresentationStyle = .pageSheet present(safariVC, animated: true, completion: nil) } - @IBAction func openTermsOfUSe(_ sender: Any) { guard let url = URL(string: "https://pochak.notion.site/6520996186464c36a8b3a04bc17fa000?pvs=74") else { return } let safariVC = SFSafariViewController(url: url) - // delegate 지정 및 presentation style 설정 safariVC.transitioningDelegate = self safariVC.modalPresentationStyle = .pageSheet present(safariVC, animated: true, completion: nil) @@ -135,8 +129,7 @@ extension UIButton { let attributedString = NSMutableAttributedString(string: title) attributedString.addAttribute(.underlineStyle, value: NSUnderlineStyle.single.rawValue, - range: NSRange(location: 0, length: title.count) - ) + range: NSRange(location: 0, length: title.count)) setAttributedTitle(attributedString, for: .normal) } } From 83de866cfde9c1a58e21d397f3ecce5244c972e9 Mon Sep 17 00:00:00 2001 From: Jungyeon Seo Date: Mon, 9 Dec 2024 21:46:56 +0900 Subject: [PATCH 52/54] =?UTF-8?q?Refactor=20:=20=ED=94=84=EB=A1=9C?= =?UTF-8?q?=ED=95=84=20=ED=83=AD,=20=EB=84=A4=ED=8A=B8=EC=9B=8C=ED=81=AC?= =?UTF-8?q?=20=EB=A6=AC=ED=8C=A9=ED=86=A0=EB=A7=81?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../APIs/Profile/PochakPostRetrievalAPI.swift | 1 - .../Authentication/Authenticator.swift | 1 - pochak/pochak/Network/NetworkResult400.swift | 3 +- .../UI/Login/SignUpViewController.swift | 6 +- .../BlockList/BlockedUserViewController.swift | 17 +++--- .../cell/BlockedUserTableViewCell.swift | 8 +-- .../FollowList/FollowListViewController.swift | 17 +++--- .../FollowerListTabmanViewController.swift | 44 +++++--------- .../FollowingListTabmanViewController.swift | 25 +++----- .../cell/FollowerCollectionViewCell.swift | 59 +++++-------------- .../cell/FollowingCollectionViewCell.swift | 29 +++------ .../Profile/MyProfileTabViewController.swift | 19 +++--- .../OtherUserProfileViewController.swift | 28 ++++----- .../PochakPostTabmanViewController.swift | 12 ++-- .../PochakedPostTabmanViewController.swift | 11 ++-- .../PostList/PostListViewController.swift | 2 +- .../cell/ProfilePostCollectionViewCell.swift | 2 +- .../UI/Profile/ProfileDataSingleton.swift | 1 - .../Profile/ProfileMenuViewController.swift | 8 +-- .../UI/Profile/SettingsViewController.swift | 37 +++++------- .../Profile/UpdateProfileViewController.swift | 56 ++++++++---------- 21 files changed, 147 insertions(+), 239 deletions(-) diff --git a/pochak/pochak/Network/APIs/Profile/PochakPostRetrievalAPI.swift b/pochak/pochak/Network/APIs/Profile/PochakPostRetrievalAPI.swift index 73b7cf3f..a41203d7 100644 --- a/pochak/pochak/Network/APIs/Profile/PochakPostRetrievalAPI.swift +++ b/pochak/pochak/Network/APIs/Profile/PochakPostRetrievalAPI.swift @@ -8,7 +8,6 @@ import Foundation import Alamofire - enum PochakPostRetrievalAPI { case getPochakPost(handle: String, request: ProfileRetrievalRequest) } diff --git a/pochak/pochak/Network/Authentication/Authenticator.swift b/pochak/pochak/Network/Authentication/Authenticator.swift index 1cf27b71..01becaf1 100644 --- a/pochak/pochak/Network/Authentication/Authenticator.swift +++ b/pochak/pochak/Network/Authentication/Authenticator.swift @@ -33,7 +33,6 @@ class MyAuthenticator : Authenticator { // 3. 인증이 필요한 urlRequest에 대해서만 refresh가 되도록, 이 경우에만 true를 리턴하여 refresh 요청 func isRequest(_ urlRequest: URLRequest, authenticatedWith credential: MyAuthenticationCredential) -> Bool { - // bearerToken의 urlRequest대해서만 refresh를 시도 (true) let bearerToken = HTTPHeader.authorization(bearerToken: credential.accessToken).value let startIndex = bearerToken.index(bearerToken.startIndex, offsetBy: 7) let newBearerToken = String(bearerToken[startIndex...]) diff --git a/pochak/pochak/Network/NetworkResult400.swift b/pochak/pochak/Network/NetworkResult400.swift index fd13fb40..4de7ae0d 100644 --- a/pochak/pochak/Network/NetworkResult400.swift +++ b/pochak/pochak/Network/NetworkResult400.swift @@ -5,7 +5,6 @@ // Created by Seo Cindy on 7/6/24. // -enum NetworkResult400{ +enum NetworkResult400 { case success(T) // 서버 통신 성공 - case MEMBER4002 // 유효하지 않은 멤버의 handle인 경우 } diff --git a/pochak/pochak/UI/Login/SignUpViewController.swift b/pochak/pochak/UI/Login/SignUpViewController.swift index 5dd27a57..438f493b 100644 --- a/pochak/pochak/UI/Login/SignUpViewController.swift +++ b/pochak/pochak/UI/Login/SignUpViewController.swift @@ -79,7 +79,7 @@ final class SignUpViewController: UIViewController { present(self.imagePickerController, animated: true, completion: nil) } - @objc func backbuttonPressed(_ sender: Any) { + @objc private func backbuttonPressed(_ sender: Any) { backBtnPressed = true showAlert(alertType: .confirmAndCancel, titleText: "프로필 설정을 취소하고\n페이지를 나갈까요?", @@ -89,14 +89,14 @@ final class SignUpViewController: UIViewController { ) } - @objc func textFieldDidChange(_ sender: Any?) { + @objc private func textFieldDidChange(_ sender: Any?) { handleDuplicationChecked = false checkHandleDuplicationBtn.isEnabled = true handleTextField.textColor = .black checkHandleDuplicationBtn.setImage(UIImage(named: "checkHandle"), for: .normal) } - @objc func doneBtnTapped(_ sender: Any) { + @objc private func doneBtnTapped(_ sender: Any) { guard let name = nameTextField.text else { return } guard let handle = handleTextField.text else { return } guard let message = messageTextView.text else { return } diff --git a/pochak/pochak/UI/Profile/BlockList/BlockedUserViewController.swift b/pochak/pochak/UI/Profile/BlockList/BlockedUserViewController.swift index b282cf5d..2de0077a 100644 --- a/pochak/pochak/UI/Profile/BlockList/BlockedUserViewController.swift +++ b/pochak/pochak/UI/Profile/BlockList/BlockedUserViewController.swift @@ -15,6 +15,7 @@ protocol RemoveCellDelegate: AnyObject { final class BlockedUserViewController: UIViewController { // MARK: - Properties + private var cellIndexPath: IndexPath? private var cellHandle: String? private var blockedUserList: [BlockList] = [] @@ -23,13 +24,14 @@ final class BlockedUserViewController: UIViewController { private var currentFetchingPage: Int = 0 // MARK: - Views + @IBOutlet weak var tableView: UITableView! // MARK: - LifeCycle + override func viewDidLoad() { super.viewDidLoad() currentFetchingPage = 0 - setUpNavigationBar() setUpTableView() setUpRefreshControl() @@ -42,7 +44,7 @@ final class BlockedUserViewController: UIViewController { blockedUserList = [] currentFetchingPage = 0 setUpData() - DispatchQueue.main.asyncAfter(deadline: .now() + 0.7) { + DispatchQueue.main.async() { self.tableView.refreshControl?.endRefreshing() } } @@ -53,7 +55,7 @@ final class BlockedUserViewController: UIViewController { self.navigationController?.navigationBar.backgroundColor = UIColor.clear self.navigationController?.navigationBar.tintColor = .black self.navigationItem.title = "차단관리" - self.navigationController?.navigationBar.titleTextAttributes = [ NSAttributedString.Key.foregroundColor : UIColor.black, NSAttributedString.Key.font : UIFont(name: "Pretendard-Bold", size: 18) ?? UIFont.systemFont(ofSize: 18, weight: .bold)] + self.navigationController?.navigationBar.titleTextAttributes = [ NSAttributedString.Key.foregroundColor: UIColor.black, NSAttributedString.Key.font: UIFont(name: "Pretendard-Bold", size: 18) ?? UIFont.systemFont(ofSize: 18, weight: .bold)] } private func setUpTableView() { @@ -109,7 +111,7 @@ final class BlockedUserViewController: UIViewController { } } -// MARK: - Extension : UITableViewDelegate, UITableViewDataSource, RemoveCellDelegate, CustomAlertDelegate, UIScrollViewDelegate +// MARK: - Extension: UITableViewDelegate, UITableViewDataSource, RemoveCellDelegate, CustomAlertDelegate, UIScrollViewDelegate extension BlockedUserViewController: UITableViewDelegate{ @@ -142,8 +144,7 @@ extension BlockedUserViewController: RemoveCellDelegate { titleText: "유저 차단을 취소하겠습니까?", messageText: "유저 차단을 취소하면, 팔로워와 관련된 \n사진 및 소식을 다시 접할 수 있습니다.", cancelButtonText: "나가기", - confirmButtonText: "계속하기" - ) + confirmButtonText: "계속하기") } } @@ -153,7 +154,7 @@ extension BlockedUserViewController: CustomAlertDelegate { let userHandle = UserDefaultsManager.getData(type: String.self, forKey: .handle) ?? "" let request = UnblockRequest(blockedMemberHandle: cellHandle ?? "") UserService.unblockUser(handle: userHandle, request: request) { data, failed in - guard let data = data else { + guard data != nil else { switch failed { case .disconnected: self.present(UIAlertController.networkErrorAlert(title: failed!.localizedDescription), animated: true) @@ -179,7 +180,7 @@ extension BlockedUserViewController: CustomAlertDelegate { extension BlockedUserViewController: UIScrollViewDelegate { func scrollViewDidScroll(_ scrollView: UIScrollView) { - if (tableView.contentOffset.y > (tableView.contentSize.height - tableView.bounds.size.height)){ + if (tableView.contentOffset.y > (tableView.contentSize.height - tableView.bounds.size.height)) { if (!isLastPage && !isCurrentlyFetching) { print("스크롤에 의해 새 데이터 가져오는 중, page: \(currentFetchingPage)") isCurrentlyFetching = true diff --git a/pochak/pochak/UI/Profile/BlockList/cell/BlockedUserTableViewCell.swift b/pochak/pochak/UI/Profile/BlockList/cell/BlockedUserTableViewCell.swift index 4e7ca760..4f5fc221 100644 --- a/pochak/pochak/UI/Profile/BlockList/cell/BlockedUserTableViewCell.swift +++ b/pochak/pochak/UI/Profile/BlockList/cell/BlockedUserTableViewCell.swift @@ -41,17 +41,16 @@ final class BlockedUserTableViewCell: UITableViewCell { print("superview is not a UICollectionView - getIndexPath") return } - guard let indexPath = superView.indexPath(for: self) else {return} + guard let indexPath = superView.indexPath(for: self) else { return } delegate?.removeCell(at: indexPath, cellHandle ?? "") } // MARK: - Functions - func setUpCell() { + private func setUpCell() { profileImg.contentMode = .scaleAspectFill profileImg.clipsToBounds = true profileImg.layer.cornerRadius = 26 - unblockButton.setTitle("차단해제", for: .normal) unblockButton.backgroundColor = UIColor(named: "gray03") unblockButton.setTitleColor(UIColor.white, for: .normal) @@ -59,8 +58,7 @@ final class BlockedUserTableViewCell: UITableViewCell { unblockButton.layer.cornerRadius = 5 } - func setUpCellData(_ blockedUserList : BlockList) { - // load 프로필 이미지 + func setUpCellData(_ blockedUserList: BlockList) { var imageURL = blockedUserList.profileImage if let url = URL(string: (imageURL)) { profileImg.load(with: url) diff --git a/pochak/pochak/UI/Profile/FollowList/FollowListViewController.swift b/pochak/pochak/UI/Profile/FollowList/FollowListViewController.swift index 9354876f..35b5bb04 100644 --- a/pochak/pochak/UI/Profile/FollowList/FollowListViewController.swift +++ b/pochak/pochak/UI/Profile/FollowList/FollowListViewController.swift @@ -14,20 +14,19 @@ final class FollowListViewController: TabmanViewController { // MARK: - Properties var handle: String? - var viewControllers: [UIViewController] = [] var index: Int = 0 - + private var viewControllers: [UIViewController] = [] + // MARK: - LifeCycle - + override func viewDidLoad() { super.viewDidLoad() setUpTabman() setUpNavigationBar() } - + override func viewWillAppear(_ animated: Bool) { super.viewWillAppear(animated) - // View Controller 생길 때 네비게이션 바 숨김 self.navigationController?.isNavigationBarHidden = false self.navigationController?.navigationBar.backgroundColor = UIColor.clear } @@ -39,7 +38,7 @@ final class FollowListViewController: TabmanViewController { self.navigationController?.navigationBar.backgroundColor = UIColor.clear self.navigationItem.title = handle ?? "handle not found" } - + private func setUpTabman() { // Tabman 사용 /* 1. tab에 보여질 VC 추가 */ @@ -79,7 +78,7 @@ final class FollowListViewController: TabmanViewController { } } -// MARK: - Extension : PageboyViewControllerDataSource, TMBarDataSource +// MARK: - Extension: PageboyViewControllerDataSource, TMBarDataSource extension FollowListViewController: PageboyViewControllerDataSource, TMBarDataSource { @@ -93,11 +92,9 @@ extension FollowListViewController: PageboyViewControllerDataSource, TMBarDataSo } func defaultPage(for pageboyViewController: PageboyViewController) -> PageboyViewController.Page? { - // index를 통해 처음에 보이는 탭을 설정 - return .at(index: index) + return .at(index: index) // index를 통해 처음에 보이는 탭을 설정 } - // 팔로워 페이지 혹은 팔로잉 페이지인지에 따라 defualtPage 다르게 하기 func barItem(for bar: TMBar, at index: Int) -> TMBarItemable { switch index { case 0: diff --git a/pochak/pochak/UI/Profile/FollowList/FollowerListTabmanViewController.swift b/pochak/pochak/UI/Profile/FollowList/FollowerListTabmanViewController.swift index 6bed97c2..c2931ccf 100644 --- a/pochak/pochak/UI/Profile/FollowList/FollowerListTabmanViewController.swift +++ b/pochak/pochak/UI/Profile/FollowList/FollowerListTabmanViewController.swift @@ -20,10 +20,10 @@ final class FollowerListTabmanViewController: UIViewController { var receivedHandle: String? private var cellIndexPath: IndexPath? private var cellHandle: String? - private var loginUserHandle = UserDefaultsManager.getData(type: String.self, forKey: .handle) private var isLastPage: Bool = false private var isCurrentlyFetching: Bool = false private var currentFetchingPage: Int = 0 + private var loginUserHandle = UserDefaultsManager.getData(type: String.self, forKey: .handle) // MARK: - Views @@ -34,7 +34,6 @@ final class FollowerListTabmanViewController: UIViewController { override func viewDidLoad() { super.viewDidLoad() currentFetchingPage = 0 - setUpCollectionView() setUpRefreshControl() setUpData() @@ -43,12 +42,10 @@ final class FollowerListTabmanViewController: UIViewController { // MARK: - Actions @objc private func refreshData(_ sender: Any) { - // 데이터 새로고침 완료 후 UIRefreshControl을 종료 - print("refresh") imageArray = [] currentFetchingPage = 0 setUpData() - DispatchQueue.main.asyncAfter(deadline: .now() + 0.7) { + DispatchQueue.main.async() { self.followerCollectionView.refreshControl?.endRefreshing() } } @@ -89,22 +86,16 @@ final class FollowerListTabmanViewController: UIViewController { let newMembers = data.result.memberList let startIndex = data.result.memberList.count - print("startIndex : \(startIndex)") let endIndex = startIndex + newMembers.count - print("endIndex : \(endIndex)") let newIndexPaths = (startIndex..>>>>>> Follower is currently reloading!!!!!!!") + self?.followerCollectionView.reloadData() } else { self?.followerCollectionView.insertItems(at: newIndexPaths) - print(">>>>>>> Follower is currently fethcing!!!!!!!") } self?.isCurrentlyFetching = false self?.currentFetchingPage += 1; @@ -116,16 +107,15 @@ final class FollowerListTabmanViewController: UIViewController { } } -// MARK: - Extension : UICollectionViewDelegate, UICollectionViewDataSource +// MARK: - Extension: UICollectionViewDelegate, UICollectionViewDataSource -extension FollowerListTabmanViewController : UICollectionViewDelegate, UICollectionViewDataSource { +extension FollowerListTabmanViewController: UICollectionViewDelegate, UICollectionViewDataSource { func collectionView(_ collectionView: UICollectionView, numberOfItemsInSection section: Int) -> Int { return max(0,(imageArray.count)) } func collectionView(_ collectionView: UICollectionView, cellForItemAt indexPath: IndexPath) -> UICollectionViewCell { - guard let cell = collectionView.dequeueReusableCell( withReuseIdentifier: FollowerCollectionViewCell.identifier, for: indexPath) as? FollowerCollectionViewCell else { @@ -141,17 +131,18 @@ extension FollowerListTabmanViewController : UICollectionViewDelegate, UICollect // 유저 클릭 시 해당 프로필로 이동 func collectionView(_ collectionView: UICollectionView, didSelectItemAt indexPath: IndexPath) { - guard let otherUserProfileVC = self.storyboard?.instantiateViewController(withIdentifier: "OtherUserProfileVC") as? OtherUserProfileViewController else {return} + guard let otherUserProfileVC = self.storyboard?.instantiateViewController(withIdentifier: "OtherUserProfileVC") + as? OtherUserProfileViewController else { return } self.navigationController?.pushViewController(otherUserProfileVC, animated: true) - guard let cell: FollowerCollectionViewCell = self.followerCollectionView.cellForItem(at: indexPath) as? FollowerCollectionViewCell else {return} + guard let cell: FollowerCollectionViewCell = self.followerCollectionView.cellForItem(at: indexPath) + as? FollowerCollectionViewCell else { return } otherUserProfileVC.receivedHandle = cell.userId.text } - } -// MARK: - Extension : UICollectionViewDelegateFlowLayout +// MARK: - Extension: UICollectionViewDelegateFlowLayout -extension FollowerListTabmanViewController : UICollectionViewDelegateFlowLayout { +extension FollowerListTabmanViewController: UICollectionViewDelegateFlowLayout { func collectionView(_ collectionView: UICollectionView, layout collectionViewLayout: UICollectionViewLayout, sizeForItemAt indexPath: IndexPath) -> CGSize { return CGSize(width: followerCollectionView.bounds.width, @@ -163,7 +154,7 @@ extension FollowerListTabmanViewController : UICollectionViewDelegateFlowLayout } } -// MARK: - Extension : RemoveImageDelegate +// MARK: - Extension: RemoveImageDelegate extension FollowerListTabmanViewController: RemoveImageDelegate { @@ -174,14 +165,13 @@ extension FollowerListTabmanViewController: RemoveImageDelegate { titleText: "팔로워를 삭제하시겠습니까?", messageText: "팔로워를 삭제하면, 팔로워와 관련된 \n사진이 사라집니다.", cancelButtonText: "취소", - confirmButtonText: "삭제하기" - ) + confirmButtonText: "삭제하기") } } -// MARK: - Extension : CustomAlertDelegate +// MARK: - Extension: CustomAlertDelegate -extension FollowerListTabmanViewController : CustomAlertDelegate { +extension FollowerListTabmanViewController: CustomAlertDelegate { func confirmAction() { let request = DeleteFollowerRequest(followerHandle: cellHandle ?? "") @@ -200,8 +190,6 @@ extension FollowerListTabmanViewController : CustomAlertDelegate { } return } - - print(data.message) self.imageArray.remove(at: self.cellIndexPath!.row) self.followerCollectionView.reloadData() } @@ -215,7 +203,7 @@ extension FollowerListTabmanViewController : CustomAlertDelegate { } } -// MARK: - Extension : UIScrollViewDelegate +// MARK: - Extension: UIScrollViewDelegate extension FollowerListTabmanViewController: UIScrollViewDelegate { diff --git a/pochak/pochak/UI/Profile/FollowList/FollowingListTabmanViewController.swift b/pochak/pochak/UI/Profile/FollowList/FollowingListTabmanViewController.swift index e41855d0..87f757e4 100644 --- a/pochak/pochak/UI/Profile/FollowList/FollowingListTabmanViewController.swift +++ b/pochak/pochak/UI/Profile/FollowList/FollowingListTabmanViewController.swift @@ -26,7 +26,6 @@ final class FollowingListTabmanViewController: UIViewController { override func viewDidLoad() { super.viewDidLoad() currentFetchingPage = 0 - setUpCollectionView() setUpRefreshControl() setUpData() @@ -35,12 +34,10 @@ final class FollowingListTabmanViewController: UIViewController { // MARK: - Actions @objc private func refreshData(_ sender: Any) { - // 데이터 새로고침 완료 후 UIRefreshControl을 종료 - print("refresh") imageArray = [] currentFetchingPage = 0 setUpData() - DispatchQueue.main.asyncAfter(deadline: .now() + 0.7) { + DispatchQueue.main.async() { self.followingCollectionView.refreshControl?.endRefreshing() } } @@ -81,22 +78,16 @@ final class FollowingListTabmanViewController: UIViewController { let newMembers = data.result.memberList let startIndex = data.result.memberList.count - print("startIndex : \(startIndex)") let endIndex = startIndex + newMembers.count - print("endIndex : \(endIndex)") let newIndexPaths = (startIndex..>>>>>> Follower is currently reloading!!!!!!!") + self?.followingCollectionView.reloadData() } else { self?.followingCollectionView.insertItems(at: newIndexPaths) - print(">>>>>>> Follower is currently fethcing!!!!!!!") } self?.isCurrentlyFetching = false self?.currentFetchingPage += 1; @@ -108,7 +99,7 @@ final class FollowingListTabmanViewController: UIViewController { } } -// MARK: - Extension : UICollectionViewDelegate, UICollectionViewDataSource +// MARK: - Extension: UICollectionViewDelegate, UICollectionViewDataSource extension FollowingListTabmanViewController: UICollectionViewDelegate, UICollectionViewDataSource { @@ -130,14 +121,16 @@ extension FollowingListTabmanViewController: UICollectionViewDelegate, UICollect // 유저 클릭 시 해당 프로필로 이동 func collectionView(_ collectionView: UICollectionView, didSelectItemAt indexPath: IndexPath) { - guard let otherUserProfileVC = self.storyboard?.instantiateViewController(withIdentifier: "OtherUserProfileVC") as? OtherUserProfileViewController else {return} + guard let otherUserProfileVC = self.storyboard?.instantiateViewController(withIdentifier: "OtherUserProfileVC") + as? OtherUserProfileViewController else { return } self.navigationController?.pushViewController(otherUserProfileVC, animated: true) - guard let cell: FollowingCollectionViewCell = self.followingCollectionView.cellForItem(at: indexPath) as? FollowingCollectionViewCell else {return} + guard let cell: FollowingCollectionViewCell = self.followingCollectionView.cellForItem(at: indexPath) + as? FollowingCollectionViewCell else { return } otherUserProfileVC.receivedHandle = cell.userId.text } } -// MARK: - Extension : UICollectionViewDelegate, UICollectionViewDelegateFlowLayout +// MARK: - Extension: UICollectionViewDelegate, UICollectionViewDelegateFlowLayout extension FollowingListTabmanViewController: UICollectionViewDelegateFlowLayout { @@ -151,7 +144,7 @@ extension FollowingListTabmanViewController: UICollectionViewDelegateFlowLayout } } -// MARK: - Extension : UIScrollViewDelegate +// MARK: - Extension: UIScrollViewDelegate extension FollowingListTabmanViewController: UIScrollViewDelegate { diff --git a/pochak/pochak/UI/Profile/FollowList/cell/FollowerCollectionViewCell.swift b/pochak/pochak/UI/Profile/FollowList/cell/FollowerCollectionViewCell.swift index 02184ecf..0ea7c71d 100644 --- a/pochak/pochak/UI/Profile/FollowList/cell/FollowerCollectionViewCell.swift +++ b/pochak/pochak/UI/Profile/FollowList/cell/FollowerCollectionViewCell.swift @@ -11,7 +11,7 @@ final class FollowerCollectionViewCell: UICollectionViewCell { // MARK: - Properties - static let identifier = "FollowerCollectionViewCell" // Collection View가 생성할 cell임을 명시 + static let identifier = "FollowerCollectionViewCell" var cellHandle: String = "" // 현재 cell의 handle var searchedHandle: String = "" // 검색한 프로필의 handle @@ -38,24 +38,16 @@ final class FollowerCollectionViewCell: UICollectionViewCell { // MARK: - Actions - @objc func deleteFollowerBtn(_ sender: Any) { - guard let superView = self.superview as? UICollectionView else { - print("superview is not a UICollectionView - getIndexPath") - return - } + @objc private func deleteFollowerBtn(_ sender: Any) { + guard let superView = self.superview as? UICollectionView else { return } guard let indexPath = superView.indexPath(for: self) else { return } delegate?.removeFromCollectionView(at: indexPath, cellHandle) } - @objc func toggleFollowBtn(_ sender: UIButton) { + @objc private func toggleFollowBtn(_ sender: UIButton) { UserService.postFollowRequest(handle: cellHandle) { data, failed in - guard let data = data else { - print("error") - return - } - + guard let data = data else { return } var resultCode = data.code - print(data.message) if resultCode == "FOLLOW2002" { sender.setTitle("팔로우", for: .normal) sender.backgroundColor = UIColor(named: "yellow00") @@ -63,7 +55,6 @@ final class FollowerCollectionViewCell: UICollectionViewCell { sender.setTitle("팔로잉", for: .normal) sender.backgroundColor = UIColor(named: "gray03") } - } } @@ -73,71 +64,49 @@ final class FollowerCollectionViewCell: UICollectionViewCell { profileImageBtn.imageView?.contentMode = .scaleAspectFill profileImageBtn.clipsToBounds = true profileImageBtn.layer.cornerRadius = 26 - deleteBtn.isHidden = false followBtn.isHidden = false } - func setUpCellData(_ memberDataModel : MemberListData) { + func setUpCellData(_ memberDataModel: MemberListData) { let imageURL = memberDataModel.profileImage if let url = URL(string: imageURL) { - profileImageBtn.kf.setImage(with: url, for: .normal, completionHandler: { result in - switch result { - case .success(let value): - print("Image successfully loaded: \(value.image)") - case .failure(let error): - print("Image failed to load with error: \(error.localizedDescription)") - } - }) + profileImageBtn.kf.setImage(with: url, for: .normal) } userId.text = memberDataModel.handle userName.text = memberDataModel.name cellHandle = memberDataModel.handle // 버튼 설정 - /// 내 프로필 팔로워 리스트 조회한 경우 : 삭제 버튼 - if searchedHandle == loginUserHandle { - /// deleteBtn만 view에 나타나도록 설정 + if searchedHandle == loginUserHandle { // 1) 내 프로필 팔로워 리스트 조회한 경우 : 삭제 버튼 followBtn.isHidden = true deleteBtn.isHidden = false - - /// deleteBtn 레이아웃 설정 deleteBtn.setTitle("삭제", for: .normal) deleteBtn.backgroundColor = UIColor(named: "gray03") deleteBtn.setTitleColor(UIColor.white, for: .normal) deleteBtn.titleLabel?.font = UIFont(name: "Pretendard-Bold", size: 14) deleteBtn.layer.cornerRadius = 5 deleteBtn.addTarget(self, action: #selector(deleteFollowerBtn), for: .touchUpInside) - } - /// 남의 프로필 팔로워 리스트 조회한 경우 : 팔로우/팔로잉 버튼 - else { + } else { // 2) 남의 프로필 팔로워 리스트 조회한 경우 : 팔로우/팔로잉 버튼 if let isFollow = memberDataModel.isFollow { - /// followBtn만 view에 나타나도록 설정 deleteBtn.isHidden = true followBtn.isHidden = false - - /// followBtn 기본 레이아웃 설정 followBtn.setTitleColor(UIColor.white, for: .normal) followBtn.titleLabel?.font = UIFont(name: "Pretendard-Bold", size: 14) followBtn.layer.cornerRadius = 5 followBtn.addTarget(self, action: #selector(toggleFollowBtn), for: .touchUpInside) - /// 1. cell 유저를 팔로우 중인 경우 if isFollow { - /// 팔로잉 버튼 나타나도록 설정 + /// 1. cell 유저를 팔로우 중인 경우 팔로잉 버튼이 나타나도록 설정 followBtn.setTitle("팔로잉", for: .normal) followBtn.backgroundColor = UIColor(named: "gray03") - } - /// 2. cell 유저를 팔로우하고 있지 않은 경우 - else if !isFollow { - /// 팔로우 버튼 나타나도록 설정 + } else { + /// 2. cell 유저를 팔로우하고 있지 않은 경우 팔로우 버튼이 나타나도록 설정 followBtn.setTitle("팔로우", for: .normal) followBtn.backgroundColor = UIColor(named: "yellow00") } - } - /// 3. cell 유저가 자기 자신인 경우(isFollow == nil) - else { - /// 아무 버튼도 나타나지 않도록 설정 + } else { + /// 3. cell 유저가 자기 자신인 경우(isFollow == nil) 아무 버튼도 나타나지 않도록 설정 deleteBtn.isHidden = true followBtn.isHidden = true } diff --git a/pochak/pochak/UI/Profile/FollowList/cell/FollowingCollectionViewCell.swift b/pochak/pochak/UI/Profile/FollowList/cell/FollowingCollectionViewCell.swift index 928cdd12..2ad4ce4f 100644 --- a/pochak/pochak/UI/Profile/FollowList/cell/FollowingCollectionViewCell.swift +++ b/pochak/pochak/UI/Profile/FollowList/cell/FollowingCollectionViewCell.swift @@ -31,12 +31,9 @@ final class FollowingCollectionViewCell: UICollectionViewCell { // MARK: - Actions - @objc func toggleFollowBtn(_ sender: UIButton) { + @objc private func toggleFollowBtn(_ sender: UIButton) { UserService.postFollowRequest(handle: cellHandle) { data, failed in - guard let data = data else { - print("error") - return - } + guard let data = data else { return } if data.message == "성공적으로 팔로우를 취소하였습니다." { sender.setTitle("팔로우", for: .normal) sender.backgroundColor = UIColor(named: "yellow00") @@ -56,8 +53,8 @@ final class FollowingCollectionViewCell: UICollectionViewCell { followStateToggleBtn.isHidden = false } - func setUpCellData(_ memberDataModel : MemberListData) { - var imageURL = memberDataModel.profileImage + func setUpCellData(_ memberDataModel: MemberListData) { + let imageURL = memberDataModel.profileImage if let url = URL(string: imageURL) { profileImageBtn.kf.setImage(with: url, for: .normal) } @@ -67,31 +64,23 @@ final class FollowingCollectionViewCell: UICollectionViewCell { // 버튼 설정 if let isFollow = memberDataModel.isFollow { - /// followStateToggleBtn이 view에 나타나도록 설정 followStateToggleBtn.isHidden = false - - /// followStateToggleBtn 레이아웃 설정 followStateToggleBtn.setTitleColor(UIColor.white, for: .normal) followStateToggleBtn.titleLabel?.font = UIFont(name: "Pretendard-Bold", size: 14) // 폰트 설정 followStateToggleBtn.layer.cornerRadius = 5 followStateToggleBtn.addTarget(self, action: #selector(toggleFollowBtn), for: .touchUpInside) - /// 1. cell 유저를 팔로우 중인 경우 if isFollow { - /// 팔로잉 버튼 나타나도록 설정 + /// 1. cell 유저를 팔로우 중인 경우 팔로잉 버튼이 나타나도록 설정 followStateToggleBtn.setTitle("팔로잉", for: .normal) followStateToggleBtn.backgroundColor = UIColor(named: "gray03") - } - /// 2. cell 유저를 팔로우하고 있지 않은 경우 - else if !isFollow { - /// 팔로우 버튼 나타나도록 설정 + } else { + /// 2. cell 유저를 팔로우하고 있지 않은 경우 팔로우 버튼이 나타나도록 설정 followStateToggleBtn.setTitle("팔로우", for: .normal) followStateToggleBtn.backgroundColor = UIColor(named: "yellow00") } - } - /// 3. cell 유저가 자기 자신인 경우(isFollow == nil) - else { - /// 아무 버튼도 나타나지 않도록 설정 + } else { + /// 3. cell 유저가 자기 자신인 경우(isFollow == nil) 아무 버튼도 나타나지 않도록 설정 followStateToggleBtn.isHidden = true } } diff --git a/pochak/pochak/UI/Profile/MyProfileTabViewController.swift b/pochak/pochak/UI/Profile/MyProfileTabViewController.swift index dc2562d5..cbf90da0 100644 --- a/pochak/pochak/UI/Profile/MyProfileTabViewController.swift +++ b/pochak/pochak/UI/Profile/MyProfileTabViewController.swift @@ -57,7 +57,6 @@ final class MyProfileTabViewController: UIViewController { setUpViewController() setUpData() initializeSingleton() - NotificationCenter.default.addObserver(self, selector: #selector(totalHeightUpdated), name: .didUpdateTotalHeight, object: nil) } override func viewWillAppear(_ animated: Bool) { @@ -74,31 +73,32 @@ final class MyProfileTabViewController: UIViewController { // MARK: - Actions @IBAction func clickSettingBtn(_ sender: Any) { - guard let settingsVC = self.storyboard?.instantiateViewController(withIdentifier: "SettingsVC") as? SettingsViewController else {return} + guard let settingsVC = self.storyboard?.instantiateViewController(withIdentifier: "SettingsVC") as? SettingsViewController else { return } self.navigationController?.pushViewController(settingsVC, animated: true) } @IBAction func updateProfile(_ sender: Any) { - guard let updateProfileVC = self.storyboard?.instantiateViewController(withIdentifier: "UpdateProfileVC") as? UpdateProfileViewController else {return} + guard let updateProfileVC = self.storyboard?.instantiateViewController(withIdentifier: "UpdateProfileVC") as? UpdateProfileViewController else { return } self.navigationController?.pushViewController(updateProfileVC, animated: true) } @objc private func viewFollowerTapped() { - guard let followListVC = self.storyboard?.instantiateViewController(withIdentifier: "FollowListVC") as? FollowListViewController else {return} + guard let followListVC = self.storyboard?.instantiateViewController(withIdentifier: "FollowListVC") + as? FollowListViewController else { return } followListVC.index = 0 followListVC.handle = handle self.navigationController?.pushViewController(followListVC, animated: true) } @objc private func viewFollowingTapped() { - guard let followListVC = self.storyboard?.instantiateViewController(withIdentifier: "FollowListVC") as? FollowListViewController else {return} + guard let followListVC = self.storyboard?.instantiateViewController(withIdentifier: "FollowListVC") + as? FollowListViewController else { return } followListVC.index = 1 followListVC.handle = handle self.navigationController?.pushViewController(followListVC, animated: true) } @objc private func refreshData(_ sender: Any) { - print("refresh") setUpData() DispatchQueue.main.async() { self.contentScrollView.refreshControl?.endRefreshing() @@ -197,6 +197,7 @@ final class MyProfileTabViewController: UIViewController { let backBarButtonItem = UIBarButtonItem(title: nil, style: .plain, target: nil, action: nil) backBarButtonItem.tintColor = .black self.navigationItem.backBarButtonItem = backBarButtonItem + NotificationCenter.default.addObserver(self, selector: #selector(totalHeightUpdated), name: .didUpdateTotalHeight, object: nil) } private func setUpData() { @@ -218,7 +219,7 @@ final class MyProfileTabViewController: UIViewController { return } - // load 프로필 이미지 + // 프로필 이미지 로드 if let url = URL(string: data.result.profileImage ?? "") { self.profileImage.load(with: url) } @@ -295,11 +296,9 @@ final class MyProfileTabViewController: UIViewController { } } - -// MARK: - Extension : CustomAlertDelegate, SecondViewControllerDelegate +// MARK: - Extension: CustomAlertDelegate, SecondViewControllerDelegate extension MyProfileTabViewController: UIScrollViewDelegate { - func scrollViewDidScroll(_ scrollView: UIScrollView) { if (contentScrollView.contentOffset.y > (contentScrollView.contentSize.height - contentScrollView.frame.size.height)) { if (ProfileDataSingleton.shared.currentTabIndex == 0 && diff --git a/pochak/pochak/UI/Profile/OtherUserProfileViewController.swift b/pochak/pochak/UI/Profile/OtherUserProfileViewController.swift index 97fba943..51e7758e 100644 --- a/pochak/pochak/UI/Profile/OtherUserProfileViewController.swift +++ b/pochak/pochak/UI/Profile/OtherUserProfileViewController.swift @@ -73,7 +73,6 @@ final class OtherUserProfileViewController: UIViewController { setUpViewController() setUpData() initializeSingleton() - NotificationCenter.default.addObserver(self, selector: #selector(totalHeightUpdated), name: .didUpdateTotalHeight, object: nil) } override func viewWillAppear(_ animated: Bool) { @@ -92,13 +91,11 @@ final class OtherUserProfileViewController: UIViewController { titleText: "팔로우를 취소할까요?", messageText: "", cancelButtonText: "나가기", - confirmButtonText: "계속하기" - ) + confirmButtonText: "계속하기") } else { if let handle = receivedHandle { UserService.postFollowRequest(handle: handle) { [weak self] data, failed in guard let data = data else { - // 에러가 난 경우, alert 창 present switch failed { case .disconnected: self?.present(UIAlertController.networkErrorAlert(title: failed!.localizedDescription), animated: true) @@ -111,7 +108,6 @@ final class OtherUserProfileViewController: UIViewController { } return } - print(data.message) self?.receivedIsFollow = true sender.setTitle("팔로잉", for: .normal) sender.backgroundColor = UIColor(named: "gray03") @@ -124,26 +120,28 @@ final class OtherUserProfileViewController: UIViewController { } @IBAction func updateProfile(_ sender: Any) { - guard let updateProfileVC = self.storyboard?.instantiateViewController(withIdentifier: "UpdateProfileVC") as? UpdateProfileViewController else {return} + guard let updateProfileVC = self.storyboard?.instantiateViewController(withIdentifier: "UpdateProfileVC") as? UpdateProfileViewController else { return } self.navigationController?.pushViewController(updateProfileVC, animated: true) } @objc private func viewFollowerTapped() { - guard let followListVC = self.storyboard?.instantiateViewController(withIdentifier: "FollowListVC") as? FollowListViewController else {return} + guard let followListVC = self.storyboard?.instantiateViewController(withIdentifier: "FollowListVC") as? FollowListViewController else { return } followListVC.index = 0 followListVC.handle = receivedHandle ?? "" self.navigationController?.pushViewController(followListVC, animated: true) } @objc private func viewFollowingTapped() { - guard let followListVC = self.storyboard?.instantiateViewController(withIdentifier: "FollowListVC") as? FollowListViewController else {return} + guard let followListVC = self.storyboard?.instantiateViewController(withIdentifier: "FollowListVC") + as? FollowListViewController else { return } followListVC.index = 1 followListVC.handle = receivedHandle ?? "" self.navigationController?.pushViewController(followListVC, animated: true) } - @objc func moreButtonPressed() { - guard let profileMenuVC = self.storyboard?.instantiateViewController(withIdentifier: "profileMenuVC") as? ProfileMenuViewController else {return} + @objc private func moreButtonPressed() { + guard let profileMenuVC = self.storyboard?.instantiateViewController(withIdentifier: "profileMenuVC") + as? ProfileMenuViewController else { return } let sheet = profileMenuVC.sheetPresentationController profileMenuVC.receivedHandle = receivedHandle @@ -262,6 +260,7 @@ final class OtherUserProfileViewController: UIViewController { viewFollowingList() updateProfileBtn.layer.isHidden = true contentScrollView.delegate = self + NotificationCenter.default.addObserver(self, selector: #selector(totalHeightUpdated), name: .didUpdateTotalHeight, object: nil) } private func setUpData() { @@ -277,8 +276,7 @@ final class OtherUserProfileViewController: UIViewController { titleText: "차단한 유저의 프로필입니다.", messageText: "차단해제를 원하시면\n설정 탭의 차단관리 페이지를 확인해주세요.", cancelButtonText: "", - confirmButtonText: "확인" - ) + confirmButtonText: "확인") case .disconnected: self.present(UIAlertController.networkErrorAlert(title: failed!.localizedDescription), animated: true) case .serverError: @@ -291,7 +289,7 @@ final class OtherUserProfileViewController: UIViewController { return } - // load 프로필 이미지 + // 프로필 이미지 로드 if let url = URL(string: data.result.profileImage ?? "") { self.profileImage.load(with: url) } @@ -394,7 +392,7 @@ final class OtherUserProfileViewController: UIViewController { } } -// MARK: - Extension : CustomAlertDelegate, SecondViewControllerDelegate +// MARK: - Extension: CustomAlertDelegate, SecondViewControllerDelegate extension OtherUserProfileViewController: CustomAlertDelegate { @@ -435,7 +433,6 @@ extension OtherUserProfileViewController: CustomAlertDelegate { } extension OtherUserProfileViewController: SecondViewControllerDelegate { - // 차단한 유저의 프로필 조회 시 VC를 dismiss하여 전 화면으로 돌아감 func dismissSecondViewController() { self.navigationController?.popViewController(animated: true) @@ -443,7 +440,6 @@ extension OtherUserProfileViewController: SecondViewControllerDelegate { } extension OtherUserProfileViewController: UIScrollViewDelegate { - func scrollViewDidScroll(_ scrollView: UIScrollView) { if (contentScrollView.contentOffset.y > (contentScrollView.contentSize.height - contentScrollView.frame.size.height)) { if (ProfileDataSingleton.shared.currentTabIndex == 0 && diff --git a/pochak/pochak/UI/Profile/PostList/PochakPostTabmanViewController.swift b/pochak/pochak/UI/Profile/PostList/PochakPostTabmanViewController.swift index 690fd899..d94b4572 100644 --- a/pochak/pochak/UI/Profile/PostList/PochakPostTabmanViewController.swift +++ b/pochak/pochak/UI/Profile/PostList/PochakPostTabmanViewController.swift @@ -13,11 +13,11 @@ final class PochakPostTabmanViewController: UIViewController { var receivedHandle: String? var imageArray: [ProfilePostList]! = [] + private var isLastPage: Bool = false private var isCurrentlyFetching: Bool = false private var currentFetchingPage: Int = 0 private let minimumLineSpacing: CGFloat = 9 private let minimumInterItemSpacing: CGFloat = 8 - private var isLastPage: Bool = false // MARK: - Views @@ -27,12 +27,10 @@ final class PochakPostTabmanViewController: UIViewController { override func viewDidLoad() { super.viewDidLoad() - print("inside PochakPostTabmanViewController viewdidload!!") - - NotificationCenter.default.addObserver(self, selector: #selector(didReceiveRefreshRequest), name: .didHitBottom, object: nil) currentFetchingPage = 0 setUpData() setUpCollectionView() + NotificationCenter.default.addObserver(self, selector: #selector(didReceiveRefreshRequest), name: .didHitBottom, object: nil) } override func viewDidAppear(_ animated: Bool) { @@ -84,7 +82,7 @@ final class PochakPostTabmanViewController: UIViewController { DispatchQueue.main.async { if self?.currentFetchingPage == 0 { - self?.postCollectionView.reloadData() // collectionView를 새로고침하여 이미지 업데이트 + self?.postCollectionView.reloadData() } else { self?.postCollectionView.insertItems(at: newIndexPaths) } @@ -132,9 +130,9 @@ final class PochakPostTabmanViewController: UIViewController { } } -// MARK: - Extension : UICollectionViewDelegate, UICollectionViewDataSource, UICollectionViewDelegateFlowLayout, UIScrollViewDelegate +// MARK: - Extension: UICollectionViewDelegate, UICollectionViewDataSource, UICollectionViewDelegateFlowLayout, UIScrollViewDelegate -extension PochakPostTabmanViewController : UICollectionViewDelegate, UICollectionViewDataSource, UICollectionViewDelegateFlowLayout { +extension PochakPostTabmanViewController: UICollectionViewDelegate, UICollectionViewDataSource, UICollectionViewDelegateFlowLayout { func collectionView(_ collectionView: UICollectionView, numberOfItemsInSection section: Int) -> Int { return max(0,(imageArray.count)) diff --git a/pochak/pochak/UI/Profile/PostList/PochakedPostTabmanViewController.swift b/pochak/pochak/UI/Profile/PostList/PochakedPostTabmanViewController.swift index e1acc89e..b0534f84 100644 --- a/pochak/pochak/UI/Profile/PostList/PochakedPostTabmanViewController.swift +++ b/pochak/pochak/UI/Profile/PostList/PochakedPostTabmanViewController.swift @@ -8,16 +8,16 @@ import UIKit import Foundation -class PochakedPostTabmanViewController: UIViewController { +final class PochakedPostTabmanViewController: UIViewController { // MARK: - Properties var receivedHandle: String? var imageArray: [ProfilePostList]! = [] + private var isLastPage: Bool = false private var isCurrentlyFetching: Bool = false private var currentFetchingPage: Int = 0 private let minimumLineSpacing: CGFloat = 9 private let minimumInterItemSpacing: CGFloat = 8 - private var isLastPage: Bool = false // MARK: - Views @@ -83,7 +83,7 @@ class PochakedPostTabmanViewController: UIViewController { DispatchQueue.main.async { if self?.currentFetchingPage == 0 { - self?.postCollectionView.reloadData() // collectionView를 새로고침하여 이미지 업데이트 + self?.postCollectionView.reloadData() } else { self?.postCollectionView.insertItems(at: newIndexPaths) } @@ -131,9 +131,9 @@ class PochakedPostTabmanViewController: UIViewController { } } -// MARK: - Extension : UICollectionViewDelegate, UICollectionViewDataSource, UICollectionViewDelegateFlowLayout, UIScrollViewDelegate +// MARK: - Extension: UICollectionViewDelegate, UICollectionViewDataSource, UICollectionViewDelegateFlowLayout, UIScrollViewDelegate -extension PochakedPostTabmanViewController : UICollectionViewDelegate, UICollectionViewDataSource, UICollectionViewDelegateFlowLayout { +extension PochakedPostTabmanViewController: UICollectionViewDelegate, UICollectionViewDataSource, UICollectionViewDelegateFlowLayout { func collectionView(_ collectionView: UICollectionView, numberOfItemsInSection section: Int) -> Int { return max(0,(imageArray.count)) @@ -161,7 +161,6 @@ extension PochakedPostTabmanViewController : UICollectionViewDelegate, UICollect } func collectionView(_ collectionView: UICollectionView, layout collectionViewLayout: UICollectionViewLayout, insetForSectionAt section: Int) -> UIEdgeInsets { - print("Inset method called") return UIEdgeInsets(top: 20, left: 20, bottom: 20, right: 20) } diff --git a/pochak/pochak/UI/Profile/PostList/PostListViewController.swift b/pochak/pochak/UI/Profile/PostList/PostListViewController.swift index 414e2983..dc228b01 100644 --- a/pochak/pochak/UI/Profile/PostList/PostListViewController.swift +++ b/pochak/pochak/UI/Profile/PostList/PostListViewController.swift @@ -65,7 +65,7 @@ final class PostListViewController: TabmanViewController { } } -// MARK: - Extension : PageboyViewControllerDataSource, TMBarDataSource +// MARK: - Extension: PageboyViewControllerDataSource, TMBarDataSource extension PostListViewController: PageboyViewControllerDataSource, TMBarDataSource { diff --git a/pochak/pochak/UI/Profile/PostList/cell/ProfilePostCollectionViewCell.swift b/pochak/pochak/UI/Profile/PostList/cell/ProfilePostCollectionViewCell.swift index 2d5bf135..0b8609ec 100644 --- a/pochak/pochak/UI/Profile/PostList/cell/ProfilePostCollectionViewCell.swift +++ b/pochak/pochak/UI/Profile/PostList/cell/ProfilePostCollectionViewCell.swift @@ -26,7 +26,7 @@ final class ProfilePostCollectionViewCell: UICollectionViewCell { // MARK: - Functions - func setUpCellData(_ postDataModel : ProfilePostList) { + func setUpCellData(_ postDataModel: ProfilePostList) { var imageURL = postDataModel.postImage if let url = URL(string: (imageURL)) { profilePostImage.load(with: url) diff --git a/pochak/pochak/UI/Profile/ProfileDataSingleton.swift b/pochak/pochak/UI/Profile/ProfileDataSingleton.swift index ba08f64b..d2ac8e1d 100644 --- a/pochak/pochak/UI/Profile/ProfileDataSingleton.swift +++ b/pochak/pochak/UI/Profile/ProfileDataSingleton.swift @@ -22,7 +22,6 @@ class ProfileDataSingleton { private var _firstTabHeight: CGFloat = 0.0 private var _secondTabHeight: CGFloat = 0.0 - var firstTabHeight: CGFloat { get { return _firstTabHeight diff --git a/pochak/pochak/UI/Profile/ProfileMenuViewController.swift b/pochak/pochak/UI/Profile/ProfileMenuViewController.swift index ed15d31a..8f22031f 100644 --- a/pochak/pochak/UI/Profile/ProfileMenuViewController.swift +++ b/pochak/pochak/UI/Profile/ProfileMenuViewController.swift @@ -12,8 +12,8 @@ final class ProfileMenuViewController: UIViewController { // MARK: - Properties var receivedHandle: String? - private let userHandle = UserDefaultsManager.getData(type: String.self, forKey: .handle) weak var delegate: SecondViewControllerDelegate? + private let userHandle = UserDefaultsManager.getData(type: String.self, forKey: .handle) // MARK: - Views @@ -33,8 +33,7 @@ final class ProfileMenuViewController: UIViewController { titleText: "유저를 차단하시겠습니까?", messageText: "유저를 차단하면, 팔로워와 관련된 \n사진 및 소식을 접할 수 없습니다.", cancelButtonText: "취소", - confirmButtonText: "차단하기" - ) + confirmButtonText: "차단하기") } @IBAction func cancelBtnClicked(_ sender: Any) { @@ -42,7 +41,7 @@ final class ProfileMenuViewController: UIViewController { } } -// MARK: - Extension : CustomAlertDelegate +// MARK: - Extension: CustomAlertDelegate extension ProfileMenuViewController: CustomAlertDelegate { @@ -62,7 +61,6 @@ extension ProfileMenuViewController: CustomAlertDelegate { } return } - print(data.message) self?.userBlockBtn.setTitle("차단취소", for: .normal) self?.delegate?.dismissSecondViewController() self?.dismiss(animated: true, completion: nil) diff --git a/pochak/pochak/UI/Profile/SettingsViewController.swift b/pochak/pochak/UI/Profile/SettingsViewController.swift index d18f2d62..0b1387f5 100644 --- a/pochak/pochak/UI/Profile/SettingsViewController.swift +++ b/pochak/pochak/UI/Profile/SettingsViewController.swift @@ -11,6 +11,7 @@ import SafariServices final class SettingsViewController: UIViewController { // MARK: - Properties + var realmManager = RecentSearchRealmManager() private var selectedBtn: Int = 0 @@ -21,6 +22,7 @@ final class SettingsViewController: UIViewController { @IBOutlet weak var deleteAccountButton: UIButton! // MARK: - LifeCycle + override func viewDidLoad() { super.viewDidLoad() setUpNavigationBar() @@ -29,12 +31,11 @@ final class SettingsViewController: UIViewController { // MARK: - Actions @IBAction func openTermsOfUse(_ sender: Any) { - // 배포 시 삭제(로그 확인 용) + // !! 배포 시 삭제(로그 확인 용) !! printUserData() guard let url = URL(string: "https://pochak.notion.site/6520996186464c36a8b3a04bc17fa000?pvs=74") else { return } let safariVC = SFSafariViewController(url: url) - /// delegate 지정 및 presentation style 설정 safariVC.transitioningDelegate = self safariVC.modalPresentationStyle = .pageSheet present(safariVC, animated: true, completion: nil) @@ -44,14 +45,14 @@ final class SettingsViewController: UIViewController { @IBAction func openPrivacyPolicy(_ sender: Any) { guard let url = URL(string: "https://pochak.notion.site/e365e34f018949b88543adbe6b0b3746") else { return } let safariVC = SFSafariViewController(url: url) - /// delegate 지정 및 presentation style 설정 safariVC.transitioningDelegate = self safariVC.modalPresentationStyle = .pageSheet present(safariVC, animated: true, completion: nil) } @IBAction func viewBlockList(_ sender: Any) { - guard let blockedUserVC = self.storyboard?.instantiateViewController(withIdentifier: "BlockedUserVC") as? BlockedUserViewController else {return} + guard let blockedUserVC = self.storyboard?.instantiateViewController(withIdentifier: "BlockedUserVC") + as? BlockedUserViewController else { return } self.navigationController?.pushViewController(blockedUserVC, animated: true) } @@ -61,8 +62,7 @@ final class SettingsViewController: UIViewController { titleText: "로그아웃 하시겠습니까?", messageText: "", cancelButtonText: "취소", - confirmButtonText: "확인" - ) + confirmButtonText: "확인") } @IBAction func deleteAccount(_ sender: Any) { @@ -71,8 +71,7 @@ final class SettingsViewController: UIViewController { titleText: "회원탈퇴하시겠습니까?", messageText: "회원 탈퇴 시, 개인정보 및 기존에 업로드된 \n피드 정보가 모두 사라집니다.", cancelButtonText: "취소", - confirmButtonText: "탈퇴하기" - ) + confirmButtonText: "탈퇴하기") } // MARK: - Functions @@ -80,7 +79,7 @@ final class SettingsViewController: UIViewController { private func setUpNavigationBar() { self.navigationController?.navigationBar.tintColor = .black self.navigationItem.title = "설정" - self.navigationController?.navigationBar.titleTextAttributes = [ NSAttributedString.Key.foregroundColor : UIColor.black, NSAttributedString.Key.font : UIFont(name: "Pretendard-Bold", size: 18) ?? UIFont.systemFont(ofSize: 18, weight: .bold)] + self.navigationController?.navigationBar.titleTextAttributes = [ NSAttributedString.Key.foregroundColor: UIColor.black, NSAttributedString.Key.font: UIFont(name: "Pretendard-Bold", size: 18) ?? UIFont.systemFont(ofSize: 18, weight: .bold)] } private func moveToMainPage() { @@ -112,7 +111,7 @@ final class SettingsViewController: UIViewController { } private func printUserData() { - // 현재 저장된 모든 Keycahin : accessToken, refreshToken + // 현재 저장된 모든 Keycahin: accessToken, refreshToken let accessToken = GetToken.getAccessToken() let refreshToken = GetToken.getRefreshToken() @@ -141,31 +140,23 @@ final class SettingsViewController: UIViewController { } } -// MARK: - Extension : CustomAlertDelegate, UIViewControllerTransitioningDelegate +// MARK: - Extension: CustomAlertDelegate, UIViewControllerTransitioningDelegate extension SettingsViewController: CustomAlertDelegate { func confirmAction() { if selectedBtn == 0 { AuthenticationService.logOut { data, failed in - guard let data = data else { - print(failed) - return - } - let message = data.message - print(message) + guard let data = data else { return } + print(data.message) } deleteUserData() moveToMainPage() } else if selectedBtn == 1 { AuthenticationService.signOut { data, failed in - guard let data = data else { - print(failed) - return - } - let message = data.message - print(message) + guard let data = data else { return } + print(data.message) } deleteUserData() moveToMainPage() diff --git a/pochak/pochak/UI/Profile/UpdateProfileViewController.swift b/pochak/pochak/UI/Profile/UpdateProfileViewController.swift index 336173f2..be3993d7 100644 --- a/pochak/pochak/UI/Profile/UpdateProfileViewController.swift +++ b/pochak/pochak/UI/Profile/UpdateProfileViewController.swift @@ -36,10 +36,22 @@ final class UpdateProfileViewController: UIViewController { } // MARK: - Actions - + + /* < 앨범 사진 선택 > + 1. 권한 설정: Info.plist > Photo Library Usage 권한 추가 + 2. UIImagePickerController 선언 + 3. @IBAction 정의 + 4. 프로토콜 채택 + */ + @IBAction func profileBtnTapped(_ sender: Any) { + self.imagePickerController.delegate = self + self.imagePickerController.sourceType = .photoLibrary + present(self.imagePickerController, animated: true, completion: nil) + } + @objc private func doneBtnTapped(_ sender: Any) { - guard let name = nameTextField.text else {return} - guard let message = messageTextView.text else {return} + guard let name = nameTextField.text else { return } + guard let message = messageTextView.text else { return } let profileImage: Data? = profileImg.image?.jpegData(compressionQuality: 0.2) let request = ProfileUpdateRequest(name: name, message: message) @@ -75,18 +87,6 @@ final class UpdateProfileViewController: UIViewController { } } - /* < 앨범 사진 선택 > - 1. 권한 설정 : Info.plist > Photo Library Usage 권한 추가 - 2. UIImagePickerController 선언 - 3. @IBAction 정의 - 4. 프로토콜 채택 - */ - @IBAction func profileBtnTapped(_ sender: Any) { - self.imagePickerController.delegate = self - self.imagePickerController.sourceType = .photoLibrary - present(self.imagePickerController, animated: true, completion: nil) - } - // MARK: - Functions private func setUpNavigationBar() { @@ -102,7 +102,7 @@ final class UpdateProfileViewController: UIViewController { // 네비게이션바 title 커스텀 self.navigationController?.navigationBar.tintColor = .black self.navigationItem.title = "프로필 수정" - self.navigationController?.navigationBar.titleTextAttributes = [ NSAttributedString.Key.foregroundColor : UIColor.black, NSAttributedString.Key.font : UIFont(name: "Pretendard-Bold", size: 18) ?? UIFont.systemFont(ofSize: 18, weight: .bold)] + self.navigationController?.navigationBar.titleTextAttributes = [ NSAttributedString.Key.foregroundColor: UIColor.black, NSAttributedString.Key.font: UIFont(name: "Pretendard-Bold", size: 18) ?? UIFont.systemFont(ofSize: 18, weight: .bold)] } private func setUpViewController() { @@ -122,22 +122,21 @@ final class UpdateProfileViewController: UIViewController { self.profileImg.layer.cornerRadius = 58 messageTextView.delegate = self - /// textView 기본 마진 제거 - messageTextView.textContainer.lineFragmentPadding = 0 + messageTextView.textContainer.lineFragmentPadding = 0 // textView 기본 마진 제거 messageTextView.textContainerInset = .zero } } -// MARK: - Extension : UIImagePickerControllerDelegate, UINavigationControllerDelegate, UITextViewDelegate, CustomAlertDelegate +// MARK: - Extension: UIImagePickerControllerDelegate, UINavigationControllerDelegate, UITextViewDelegate, CustomAlertDelegate extension UpdateProfileViewController: UIImagePickerControllerDelegate, UINavigationControllerDelegate { // 선택한 사진 사용 - func imagePickerController(_ picker: UIImagePickerController, didFinishPickingMediaWithInfo info: [UIImagePickerController.InfoKey : Any]) { + func imagePickerController(_ picker: UIImagePickerController, didFinishPickingMediaWithInfo info: [UIImagePickerController.InfoKey: Any]) { if let image = info[UIImagePickerController.InfoKey.originalImage] as? UIImage { profileImg.image = image } - picker.dismiss(animated: true, completion: nil) // 주의점 : picker 숨기기 위한 dismiss를 직접 해야함 + picker.dismiss(animated: true, completion: nil) // 주의점: picker 숨기기 위한 dismiss를 직접 해야함 } // 취소 @@ -174,31 +173,28 @@ extension UpdateProfileViewController: UITextViewDelegate { func textViewDidChange(_ textView: UITextView) { guard let text = textView.text else { return } - // 줄바꿈(들여쓰기) 제한 let maxNumberOfLines = 3 let lineBreakCharacter = "\n" let lines = text.components(separatedBy: lineBreakCharacter) var consecutiveLineBreakCount = 0 // 연속된 줄 바꿈 횟수 - print("lines == \(lines)") - for line in lines { + for _ in lines { consecutiveLineBreakCount += 1 if consecutiveLineBreakCount > maxNumberOfLines { textView.text = String(text.dropLast()) // 마지막 입력 문자를 제거 - break } } } } -extension UpdateProfileViewController : CustomAlertDelegate { - - func cancel() { - print("canceled") - } +extension UpdateProfileViewController: CustomAlertDelegate { func confirmAction() { print("confirmed") } + + func cancel() { + print("canceled") + } } From 5461d1293e2de6e5c2997833a6a5aff36b585322 Mon Sep 17 00:00:00 2001 From: Jungyeon Seo Date: Mon, 9 Dec 2024 22:01:53 +0900 Subject: [PATCH 53/54] =?UTF-8?q?Refactor=20:=20=ED=94=84=EB=A1=9C?= =?UTF-8?q?=ED=95=84=20=ED=83=AD=20=EB=A6=AC=ED=8C=A9=ED=86=A0=EB=A7=81?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- pochak/pochak/UI/Profile/MyProfileTabViewController.swift | 1 + 1 file changed, 1 insertion(+) diff --git a/pochak/pochak/UI/Profile/MyProfileTabViewController.swift b/pochak/pochak/UI/Profile/MyProfileTabViewController.swift index cbf90da0..ff676fb9 100644 --- a/pochak/pochak/UI/Profile/MyProfileTabViewController.swift +++ b/pochak/pochak/UI/Profile/MyProfileTabViewController.swift @@ -299,6 +299,7 @@ final class MyProfileTabViewController: UIViewController { // MARK: - Extension: CustomAlertDelegate, SecondViewControllerDelegate extension MyProfileTabViewController: UIScrollViewDelegate { + func scrollViewDidScroll(_ scrollView: UIScrollView) { if (contentScrollView.contentOffset.y > (contentScrollView.contentSize.height - contentScrollView.frame.size.height)) { if (ProfileDataSingleton.shared.currentTabIndex == 0 && From 4dce758926cc63451eaf7f03e2f7afb447e04d24 Mon Sep 17 00:00:00 2001 From: Jungyeon Seo Date: Tue, 10 Dec 2024 13:20:42 +0900 Subject: [PATCH 54/54] =?UTF-8?q?Fix=20:=20=ED=94=84=EB=A1=9C=ED=95=84=20?= =?UTF-8?q?=ED=83=AD=20=EC=8A=A4=ED=81=AC=EB=A1=A4=20=EB=B7=B0=20=EB=86=92?= =?UTF-8?q?=EC=9D=B4=20=EC=88=98=EC=A0=95?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- pochak/pochak/UI/Profile/MyProfileTabViewController.swift | 4 ++-- pochak/pochak/UI/Profile/OtherUserProfileViewController.swift | 2 +- 2 files changed, 3 insertions(+), 3 deletions(-) diff --git a/pochak/pochak/UI/Profile/MyProfileTabViewController.swift b/pochak/pochak/UI/Profile/MyProfileTabViewController.swift index ff676fb9..3d52c44b 100644 --- a/pochak/pochak/UI/Profile/MyProfileTabViewController.swift +++ b/pochak/pochak/UI/Profile/MyProfileTabViewController.swift @@ -146,7 +146,7 @@ final class MyProfileTabViewController: UIViewController { topUIView.trailingAnchor.constraint(equalTo: view.trailingAnchor), topUIView.bottomAnchor.constraint(equalTo: postListTabmanView.bottomAnchor), // Dynamic height for topUIView - userHandle.topAnchor.constraint(equalTo: topUIView.topAnchor, constant: 20), + userHandle.topAnchor.constraint(equalTo: topUIView.topAnchor, constant: 13), userHandle.leadingAnchor.constraint(equalTo: view.leadingAnchor, constant: 20), settingBtn.trailingAnchor.constraint(equalTo: view.trailingAnchor), @@ -177,7 +177,7 @@ final class MyProfileTabViewController: UIViewController { postListTabmanView.topAnchor.constraint(equalTo: whiteBackground1.bottomAnchor, constant: 5), postListTabmanView.leadingAnchor.constraint(equalTo: topUIView.leadingAnchor), postListTabmanView.trailingAnchor.constraint(equalTo: topUIView.trailingAnchor), - postListTabmanView.heightAnchor.constraint(equalToConstant: view.frame.height), + postListTabmanView.heightAnchor.constraint(equalToConstant: view.frame.height - 270) ]) } diff --git a/pochak/pochak/UI/Profile/OtherUserProfileViewController.swift b/pochak/pochak/UI/Profile/OtherUserProfileViewController.swift index 51e7758e..49542c83 100644 --- a/pochak/pochak/UI/Profile/OtherUserProfileViewController.swift +++ b/pochak/pochak/UI/Profile/OtherUserProfileViewController.swift @@ -233,7 +233,7 @@ final class OtherUserProfileViewController: UIViewController { postListTabmanView.topAnchor.constraint(equalTo: followToggleBtn.bottomAnchor, constant: 5), postListTabmanView.leadingAnchor.constraint(equalTo: topUIView.leadingAnchor), postListTabmanView.trailingAnchor.constraint(equalTo: topUIView.trailingAnchor), - postListTabmanView.heightAnchor.constraint(equalToConstant: view.frame.height), + postListTabmanView.heightAnchor.constraint(equalToConstant: view.frame.height - 270) ]) }