diff --git a/chat-iOS/Views/EditProfile/EditProfileBuilder.swift b/chat-iOS/Views/EditProfile/EditProfileBuilder.swift index 2dd8264..ffa502f 100644 --- a/chat-iOS/Views/EditProfile/EditProfileBuilder.swift +++ b/chat-iOS/Views/EditProfile/EditProfileBuilder.swift @@ -9,12 +9,12 @@ import UIKit struct EditProfileViewBuilder { static func create() -> UIViewController { - guard let EditProfileViewController = EditProfileViewController.loadFromStoryboard() as? EditProfileViewController else { + guard let editProfileViewController = EditProfileViewController.loadFromStoryboard() as? EditProfileViewController else { fatalError("fatal: Failed to initialize the EditProfileViewController") } let model = EditProfileModel() let presenter = EditProfileViewPresenter(model: model) - EditProfileViewController.inject(with: presenter) - return EditProfileViewController + editProfileViewController.inject(with: presenter) + return editProfileViewController } } diff --git a/chat-iOS/Views/EditProfile/EditProfileModel.swift b/chat-iOS/Views/EditProfile/EditProfileModel.swift index bde0ae2..d058862 100644 --- a/chat-iOS/Views/EditProfile/EditProfileModel.swift +++ b/chat-iOS/Views/EditProfile/EditProfileModel.swift @@ -4,6 +4,7 @@ // // Created by 倉谷 明希 on 2020/07/03. // +import Firebase protocol EditProfileModelProtocol { var presenter: EditProfileModelOutput! { get set } @@ -17,8 +18,27 @@ protocol EditProfileModelOutput { final class EditProfileModel: EditProfileModelProtocol { var presenter: EditProfileModelOutput! + //TODO:- セーブする処理を書くこと + //MARK:- ここでセーブする処理を書く func saveProfile() { - +// let storage = Storage.storage().reference(forURL: "gs://mapapp6-bf5a1.appspot.com") +// let imageRef = storage.child("profileImage").child("\(user.uid).jpeg") +// var ProfileImageData: Data = Data() +// if imageView.image != nil { +// +// //画像を圧縮 +// ProfileImageData = (imageView.image?.jpegData(compressionQuality: 0.01))! +// +// } +// imageRef.putData(ProfileImageData, metadata: nil) { (metaData, error) in +// +// //エラーであれば +// if error != nil { +// +// print(error.debugDescription) +// return //これより下にはいかないreturn +// } +// } } } diff --git a/chat-iOS/Views/EditProfile/EditProfilePresenter.swift b/chat-iOS/Views/EditProfile/EditProfilePresenter.swift index b4651d9..6269fd0 100644 --- a/chat-iOS/Views/EditProfile/EditProfilePresenter.swift +++ b/chat-iOS/Views/EditProfile/EditProfilePresenter.swift @@ -30,7 +30,7 @@ final class EditProfileViewPresenter: EditProfileViewPresenterProtocol, EditProf self.model = model } - func didTapStopEditProfileButton(){ + func didTapStopEditProfileButton() { view.dismissEditProfileViewController() } @@ -38,11 +38,11 @@ final class EditProfileViewPresenter: EditProfileViewPresenterProtocol, EditProf self.model.saveProfile() } - func didTapChangePhotoButton(){ + func didTapChangePhotoButton() { view.showActionSheet() } - func didTapPickupPhotoAction(){ + func didTapPickupPhotoAction() { view.showImagePickerControllerAsPhotoLibrary() } diff --git a/chat-iOS/Views/EditProfile/EditProfileViewController.swift b/chat-iOS/Views/EditProfile/EditProfileViewController.swift index da1be61..4f71575 100644 --- a/chat-iOS/Views/EditProfile/EditProfileViewController.swift +++ b/chat-iOS/Views/EditProfile/EditProfileViewController.swift @@ -6,6 +6,7 @@ // import UIKit +import Firebase final class EditProfileViewController: UIViewController { private var presenter: EditProfileViewPresenterProtocol! @@ -14,6 +15,8 @@ final class EditProfileViewController: UIViewController { @IBOutlet weak var changePhotoButton: UIButton! @IBOutlet weak var nameTextField: UITextField! + var userName = "" + var profileImage = UIImage() override func viewDidLoad() { super.viewDidLoad() @@ -24,11 +27,9 @@ final class EditProfileViewController: UIViewController { } - func inject(with presenter: EditProfileViewPresenterProtocol) { self.presenter = presenter self.presenter.view = self - } func setupNavigationItem() { @@ -42,10 +43,12 @@ final class EditProfileViewController: UIViewController { } func setupNameTextField() { + self.nameTextField.text = self.userName self.nameTextField.addBorderBottom(borderWidth: 1.0, color: .gray) } func setupImageView() { + self.imageView.image = self.profileImage self.imageView.layer.cornerRadius = self.imageView.frame.width / 2 } @@ -54,28 +57,23 @@ final class EditProfileViewController: UIViewController { print("キャンセルボタンタップされた") self.presenter.didTapStopEditProfileButton() - } + //TODO: ここでデータをセーブする処理を行う @objc func tapSaveEditProfileButton() { print("セーブボタンタップされた") - + self.presenter.didTapSaveEditProfileButton() - } @IBAction func tapChangePhotoButton(_ sender: Any) { - self.presenter.didTapChangePhotoButton() } - - } extension EditProfileViewController: EditProfileViewPresenterOutput { func dismissEditProfileViewController() { self.dismiss(animated: true, completion: nil) - } func showActionSheet() { @@ -129,7 +127,6 @@ extension EditProfileViewController: EditProfileViewPresenterOutput { self.present(photoPickerVC, animated: true, completion: nil) } } - } extension EditProfileViewController: UIImagePickerControllerDelegate, UINavigationControllerDelegate { @@ -145,6 +142,7 @@ extension EditProfileViewController: UIImagePickerControllerDelegate, UINavigati self.imageView.image = pickerImage picker.dismiss(animated: true) } - } + + diff --git a/chat-iOS/Views/Profile/UserProfileViewController.swift b/chat-iOS/Views/Profile/UserProfileViewController.swift index e97bdf5..54abb5d 100644 --- a/chat-iOS/Views/Profile/UserProfileViewController.swift +++ b/chat-iOS/Views/Profile/UserProfileViewController.swift @@ -6,6 +6,7 @@ // import UIKit +import Nuke final class UserProfileViewController: UIViewController { private var presenter: UserProfileViewPresenterProtocol! @@ -16,10 +17,21 @@ final class UserProfileViewController: UIViewController { override func viewDidLoad() { super.viewDidLoad() - editProfileButton.layer.cornerRadius = 10.0 + + self.setupEditProfileButton() + self.setupProfileImageView() self.presenter.didLoadViewController() } + func setupEditProfileButton() { + editProfileButton.isEnabled = false + editProfileButton.layer.cornerRadius = 10.0 + } + + func setupProfileImageView() { + profileImageView.layer.cornerRadius = profileImageView.frame.height / 2 + } + @IBAction func tapEditProfileButton(_ sender: Any) { self.presenter.didTapEditProfileButton() } @@ -32,12 +44,32 @@ final class UserProfileViewController: UIViewController { extension UserProfileViewController: UserProfileViewPresenterOutput { func presentEditProfileViewController() { - let editProfileVC = EditProfileViewBuilder.create() + let editProfileVC = EditProfileViewBuilder.create() as! EditProfileViewController + editProfileVC.userName = self.profileNameLabel.text ?? "" + editProfileVC.profileImage = self.profileImageView.image! + let navigationController = UINavigationController(rootViewController: editProfileVC) navigationController.modalPresentationStyle = .fullScreen self.present(navigationController, animated: true, completion: nil) } - func setUser() { + func setUserName(userName: String) { + DispatchQueue.main.async { + self.profileNameLabel.text = userName + self.navigationItem.title = userName + } + } + func setUserProfileImage(imageURL: URL) { + //TODO:- URLの確認とか画像の用意とかすること + var defaultImage = UIImage() + if #available(iOS 13.0, *) { + defaultImage = UIImage(systemName: "person.circle.fill") ?? UIImage() + } else { + // Fallback on earlier versions + } + DispatchQueue.main.async { + self.editProfileButton.isEnabled = true + let options = ImageLoadingOptions(placeholder: defaultImage, failureImage: defaultImage) + loadImage(with: imageURL, options: options, into: self.profileImageView, progress: nil, completion: nil) + } } - } diff --git a/chat-iOS/Views/Profile/UserProfileViewModel.swift b/chat-iOS/Views/Profile/UserProfileViewModel.swift index 9f9f2d3..08ac305 100644 --- a/chat-iOS/Views/Profile/UserProfileViewModel.swift +++ b/chat-iOS/Views/Profile/UserProfileViewModel.swift @@ -4,6 +4,7 @@ // // Created by 倉谷 明希 on 2020/06/22. // +import Firebase protocol UserProfileViewModelProtocol { var presenter: UserProfileViewModelOutput! { get set } @@ -11,13 +12,45 @@ protocol UserProfileViewModelProtocol { } protocol UserProfileViewModelOutput { - func successFetchUser() + func successFetchUser(user: User) } final class UserProfileViewModel: UserProfileViewModelProtocol { var presenter: UserProfileViewModelOutput! + var firestore: Firestore! + private var listner: ListenerRegistration? + + init() { + self.firestore = Firestore.firestore() + let setting = FirestoreSettings() + self.firestore.settings = setting + } + + deinit { + self.listner?.remove() + } func fetchUser() { - self.presenter.successFetchUser() + //TODO:- 認証が終わったらuidを後で変更すること + //guard let uid = Auth.auth().currentUser?.uid else { return } + let userReference = self.firestore.collection("message/v1/users").document("y783WJnXJqDfDED0nBvK") + self.listner = userReference.addSnapshotListener { (document, error) in + if let error = error { + print("Error: \(error.localizedDescription)") + return + } + + guard let document = document, document.exists else { + print("The document doesn't exist.") + return + } + + do { + let user = try Firestore.Decoder().decode(User.self, from: document.data()!) + self.presenter.successFetchUser(user: user) + } catch { + fatalError() + } + } } } diff --git a/chat-iOS/Views/Profile/UserProfileViewPresenter.swift b/chat-iOS/Views/Profile/UserProfileViewPresenter.swift index b6d4dd1..2265441 100644 --- a/chat-iOS/Views/Profile/UserProfileViewPresenter.swift +++ b/chat-iOS/Views/Profile/UserProfileViewPresenter.swift @@ -4,6 +4,7 @@ // // Created by 倉谷 明希 on 2020/06/22. // +import Foundation protocol UserProfileViewPresenterProtocol { var view: UserProfileViewPresenterOutput! { get set } @@ -12,7 +13,8 @@ protocol UserProfileViewPresenterProtocol { } protocol UserProfileViewPresenterOutput { - func setUser() + func setUserName(userName: String) + func setUserProfileImage(imageURL: URL) func presentEditProfileViewController() } @@ -29,8 +31,12 @@ final class UserProfileViewPresenter: UserProfileViewPresenterProtocol, UserProf func didLoadViewController() { self.model.fetchUser() } - func successFetchUser() { - self.view.setUser() + func successFetchUser(user: User) { + self.view.setUserName(userName: user.displayName) + guard let URLStr = user.profileImageURL else { return } + guard let encodeURLStr = URLStr.addingPercentEncoding(withAllowedCharacters: .urlQueryAllowed) else { return } + guard let url = URL(string: encodeURLStr) else { return } + self.view.setUserProfileImage(imageURL: url) } func didTapEditProfileButton() { self.view.presentEditProfileViewController() diff --git a/chat-iOS/Views/Storyboards/UserProfile.storyboard b/chat-iOS/Views/Storyboards/UserProfile.storyboard index 23db718..9bf8d3e 100644 --- a/chat-iOS/Views/Storyboards/UserProfile.storyboard +++ b/chat-iOS/Views/Storyboards/UserProfile.storyboard @@ -36,13 +36,13 @@ -