// // StatusUploadViewController.swift // GMERemittance // // Created by Fm-user on 1/16/18. // Copyright © 2018 Gobal Money Express Co. Ltd. All rights reserved. // import UIKit import SDWebImage class StatusUploadViewController: UIViewController { @IBOutlet weak var labelUserNameInitial: UILabel! @IBOutlet weak var labelUserName: UILabel! @IBOutlet weak var dropDownView: UIPickerView! @IBOutlet weak var dropDownButton: UIButton! @IBOutlet weak var imageViewPost: FLAnimatedImageView! @IBOutlet weak var textViewPost: UITextView! @IBOutlet weak var textViewConstraint: NSLayoutConstraint! @IBOutlet weak var imageViewUserImage: UIImageView! @IBOutlet weak var postImageHeight: NSLayoutConstraint! @IBOutlet weak var buttonAddPhoto: UIButton! @IBOutlet weak var buttonSharePost: UIButton! @IBOutlet weak var viewShare: UIView! @IBOutlet weak var shareScrollView: UIScrollView! let imagePicker = UIImagePickerController() private let shareMode = ["Public ", "Private "] private var shareModeIndex: Int = 0 private var movement: CGFloat = 0.0 private var feedInputText: String! /*----statusUploadMode = 0 means user wants to upload text status, so image is optional ----statusUploadMode = 1 means user wants to upload image, so text is optional ----statusUploadMode = 2 means user wants to edit post, so either text or image is optional--*/ private var activityIndicator: UIActivityIndicatorView = UIActivityIndicatorView() var statusUploadMode: Int? var editablePostIndex: Int? var socialfeedviewmodel: SocialFeedViewModel? var showNotificationParameter: Bool? @IBAction func sharePost(_ sender: Any) { textViewPost.resignFirstResponder() disableUserInteractions() showActivityIndicator(activityIndicator: activityIndicator) socialfeedviewmodel?.socialFeedConnectionTimeOut.value = nil /** connection timeout */ socialfeedviewmodel?.socialFeedConnectionTimeOut.bind { [unowned self] in guard $0 != nil else { return } self.enableUserInteractions() self.dismissActivityIndicator(activityIndicator: self.activityIndicator) self.popUpMessage(value: 20) } switch statusUploadMode { case 0?, 1?: switch shareModeIndex { case 0: socialfeedviewmodel?.setAccessType(accessType: "public") case 1: socialfeedviewmodel?.setAccessType(accessType: "private") default: return } socialfeedviewmodel!.createSocialFeed() case 2?: let feedToEdit = socialfeedviewmodel?.getSocialFeedAt(index: editablePostIndex!) if feedToEdit?.accessType == "private" { if shareModeIndex == 1 { socialfeedviewmodel!.updateSocialFeed(feed: feedToEdit!, index: editablePostIndex!) } else { socialfeedviewmodel!.updateSocialFeed(feed: feedToEdit!, index: editablePostIndex!, toggle: true) } } else if feedToEdit?.accessType == "public" { if shareModeIndex == 1 { socialfeedviewmodel!.updateSocialFeed(feed: feedToEdit!, index: editablePostIndex!, toggle: true) } else { socialfeedviewmodel!.updateSocialFeed(feed: feedToEdit!, index: editablePostIndex!) } } default: enableUserInteractions() dismissActivityIndicator(activityIndicator: activityIndicator) return } } func setUpNetworkListener() { socialfeedviewmodel!.internetConnection.value = nil socialfeedviewmodel!.internetConnection.bind { [unowned self] in guard $0 != nil else { return } self.enableUserInteractions() self.dismissActivityIndicator(activityIndicator: self.activityIndicator) self.popUpMessage(value: 15) self.socialfeedviewmodel!.internetConnection.value = nil } } override func prepare(for segue: UIStoryboardSegue, sender: Any?) { if segue.identifier == "myStory" { let privateStoryViewController = segue.destination as! MyStoryViewController privateStoryViewController.socialfeedviewmodel = self.socialfeedviewmodel privateStoryViewController.showNotificationParameter = self.showNotificationParameter } } @objc func clearKeyboard() { textViewPost.resignFirstResponder() } override func viewDidLoad() { super.viewDidLoad() let tap: UITapGestureRecognizer = UITapGestureRecognizer(target: self, action: #selector(clearKeyboard)) view.addGestureRecognizer(tap) if let userName = UserDefaults.standard.object(forKey: "com.gmeremit.fullName") as? String { labelUserName.text = userName } labelUserNameInitial.isHidden = false labelUserNameInitial.backgroundColor = UIColor(hex: 0x2e3192) labelUserNameInitial.layer.cornerRadius = labelUserNameInitial.frame.height / 2 labelUserNameInitial.text = getFirstName().prefix(1).uppercased() let userDpString = UserDefaults.standard.object(forKey: "com.gmeremit.dpUrl") as? String if let userDpUrl = URL(string: userDpString!) { imageViewUserImage.isHidden = false imageViewUserImage.sd_setImage(with: userDpUrl, placeholderImage: nil, options: [.progressiveDownload,.scaleDownLargeImages], completed: nil) imageViewUserImage.layer.cornerRadius = imageViewUserImage.frame.height/2 labelUserNameInitial.isHidden = true } guard socialfeedviewmodel != nil, statusUploadMode != nil else { return } if statusUploadMode == 2 && editablePostIndex == nil { return } setUpNetworkListener() setUpNavBar(id: 5, title: "") setUpAnotherLoginListener(genericviewmodel: socialfeedviewmodel!) imagePicker.delegate = self textViewPost.delegate = self dropDownButton.layer.borderColor = UIColor(red:0.93, green:0.11, blue:0.14, alpha:1.0).cgColor dropDownButton.layer.borderWidth = 1.0 dropDownButton.layer.cornerRadius = 8 textViewPost.text = "Share your story " textViewPost.textColor = UIColor(red:0.78, green:0.78, blue:0.80, alpha:1.0) imageViewUserImage.layer.cornerRadius = imageViewUserImage.frame.height / 2 var frame = self.textViewPost.frame frame.size.height = self.textViewPost.contentSize.height self.textViewPost.frame = frame textViewPost.isScrollEnabled = true textViewPost.sizeToFit() NotificationCenter.default.addObserver(self, selector: #selector(keyboardWillShow), name: NSNotification.Name.UIKeyboardWillShow, object: nil) NotificationCenter.default.addObserver(self, selector: #selector(keyboardWillHide), name: NSNotification.Name.UIKeyboardWillHide, object: nil) buttonAddPhoto.setTitle(" Add Photo", for: UIControlState.normal) if statusUploadMode == 1 { selectImageToUpload() } else if statusUploadMode == 2 { if let postText = socialfeedviewmodel?.getSocialFeedAt(index: editablePostIndex!).feedText { socialfeedviewmodel?.updateFeedText(text: postText) textViewPost.text = postText } if let imageId = socialfeedviewmodel?.getSocialFeedAt(index: editablePostIndex!).feedImageId { buttonAddPhoto.setTitle(" Change Photo", for: UIControlState.normal) socialfeedviewmodel?.setFeedImageId(imageId: imageId) if let imageURL = socialfeedviewmodel?.getSocialFeedAt(index: editablePostIndex!).feedImage { imageViewPost.sd_setImage(with: URL(string: imageURL)!, placeholderImage: nil, options: [.progressiveDownload,.scaleDownLargeImages], completed: nil) postImageHeight.constant = view.frame.width } } } socialfeedviewmodel?.socialFeedsRxValue.bind { [weak self] in guard $0 != nil else { return } self?.enableUserInteractions() if self?.activityIndicator != nil { self?.dismissActivityIndicator(activityIndicator: (self?.activityIndicator)!) } guard $0 != 0 else { self?.textViewPost.resignFirstResponder() self?.popUpMessageError(value: 10, message: (self?.socialfeedviewmodel!.getErrorMessage())!) self?.socialfeedviewmodel!.socialFeedsRxValue.value = nil return } if $0 == socialWallCode.createUpdatePost.rawValue { if self?.shareModeIndex == 1 { self?.performSegue(withIdentifier: "myStory", sender: nil) } else { self?.navigationController?.popViewController(animated: true) } } self?.socialfeedviewmodel!.socialFeedsRxValue.value = nil } socialfeedviewmodel?.imageUploaded.bind { [weak self] in guard $0 != nil else { return } guard $0! else { self?.popUpMessageError(value: 10, message: (self?.socialfeedviewmodel!.getErrorMessage())!) return } self?.buttonSharePost.isEnabled = true self?.socialfeedviewmodel?.imageUploaded.value = nil } } @objc func keyboardWillShow(notification: NSNotification) { let userInfo = notification.userInfo var keyboardFrame:CGRect = (userInfo![UIKeyboardFrameEndUserInfoKey] as! NSValue).cgRectValue keyboardFrame = self.view.convert(keyboardFrame, from: nil) movement = (keyboardFrame.size.height) UIView.animate(withDuration: 0.3, animations: { self.viewShare.frame = self.viewShare.frame.offsetBy(dx: 0, dy: self.movement * -1.0) //dy is negative for upward movement }) } @objc func keyboardWillHide(notification: NSNotification){ UIView.animate(withDuration: 0.3, animations: { self.viewShare.frame = self.viewShare.frame.offsetBy(dx: 0, dy: self.movement) }) } @IBAction func pickerButtonTap(_ sender: Any) { if dropDownView.isHidden{ dropDownView.isHidden = false } textViewPost.resignFirstResponder() } override func viewDidAppear(_ animated: Bool) { shareScrollView.frame.size.width = self.view.frame.width } @IBAction func addPhotoButtonTap(_ sender: Any) { selectImageToUpload() } /** Display image selection option dialog for camera or Gallary */ func selectImageToUpload() { let alert = UIAlertController(title: "Choose Image", message: nil, preferredStyle: .actionSheet) alert.addAction(UIAlertAction(title: "Camera", style: .default, handler: { _ in self.openCamera() })) alert.addAction(UIAlertAction(title: "Gallery", style: .default, handler: { _ in self.openGallery() })) alert.addAction(UIAlertAction.init(title: "Cancel", style: .destructive, handler: nil)) self.present(alert, animated: true, completion: nil) } /** open camera */ func openCamera() { if(UIImagePickerController.isSourceTypeAvailable(UIImagePickerControllerSourceType.camera)) { imagePicker.sourceType = UIImagePickerControllerSourceType.camera imagePicker.allowsEditing = true present(imagePicker, animated: true, completion: nil) } else { let alert = UIAlertController(title: "Warning", message: "You don't have camera", preferredStyle: .alert) alert.addAction(UIAlertAction(title: "OK", style: .default, handler: nil)) self.present(alert, animated: true, completion: nil) } } /** Open gallery for image selection */ func openGallery() { imagePicker.sourceType = UIImagePickerControllerSourceType.photoLibrary imagePicker.allowsEditing = true present(imagePicker, animated: true, completion: nil) } override func didReceiveMemoryWarning() { super.didReceiveMemoryWarning() } } extension StatusUploadViewController: UIPickerViewDelegate, UIPickerViewDataSource { func numberOfComponents(in pickerView: UIPickerView) -> Int { return 1 } func pickerView(_ pickerView: UIPickerView, numberOfRowsInComponent component: Int) -> Int { return shareMode.count } func pickerView(_ pickerView: UIPickerView, titleForRow row: Int, forComponent component: Int) -> String? { return shareMode[row] } func pickerView(_ pickerView: UIPickerView, viewForRow row: Int, forComponent component: Int, reusing view: UIView?) -> UIView { let label = (view as? UILabel) ?? UILabel() label.textColor = UIColor(red:0.29, green:0.29, blue:0.29, alpha:1.0) label.textAlignment = .center label.font = UIFont.systemFont(ofSize: 14) /// where data is an Array of String label.text = shareMode[row] return label } func pickerView(_ pickerView: UIPickerView, didSelectRow row: Int, inComponent component: Int) { dropDownButton.setTitle(shareMode[row], for: UIControlState.normal) self.dropDownView.isHidden = true shareModeIndex = row textViewPost.resignFirstResponder() } } extension StatusUploadViewController: UITextViewDelegate { func textViewDidBeginEditing(_ textFieldPost: UITextView) { if textFieldPost.text.removeSpacesTrailingPreceding() == "Share your story" { textFieldPost.text = "" } if statusUploadMode == 2 { textFieldPost.textColor = UIColor(red:0.29, green:0.29, blue:0.29, alpha:1.0) } if textFieldPost.textColor == UIColor(red:0.78, green:0.78, blue:0.80, alpha:1.0) { textFieldPost.text = nil textFieldPost.textColor = UIColor(red:0.29, green:0.29, blue:0.29, alpha:1.0) } } func textViewDidEndEditing(_ textFieldPost: UITextView) { if textFieldPost.text.isEmpty { textFieldPost.text = "Share your story" textFieldPost.textColor = UIColor(red:0.78, green:0.78, blue:0.80, alpha:1.0) } } func textViewDidChange(_ textView: UITextView) { let size = textView.sizeThatFits(CGSize(width: textView.frame.size.width, height: CGFloat.greatestFiniteMagnitude)) if size.height != textViewConstraint.constant && size.height > textView.frame.size.height || size.height < textView.frame.size.height{ textViewConstraint.constant = size.height + 8 textView.setContentOffset(CGPoint.zero, animated: false) } } func textView(_ textView: UITextView, shouldChangeTextIn range: NSRange, replacementText text: String) -> Bool { feedInputText = (textView.text! as NSString).replacingCharacters(in: range, with: text) socialfeedviewmodel?.updateFeedText(text: feedInputText) return true } } extension StatusUploadViewController: UINavigationControllerDelegate, UIImagePickerControllerDelegate { func imagePickerController(_ picker: UIImagePickerController, didFinishPickingMediaWithInfo info: [String : Any]) { if let image = info[UIImagePickerControllerEditedImage] as? UIImage { self.buttonSharePost.isEnabled = false imageViewPost.image = image buttonAddPhoto.setTitle(" Change Photo", for: UIControlState.normal) if let imageURL = info["UIImagePickerControllerImageURL"] as? NSURL { //GALLERY SELECTION let imageExtension = imageURL.lastPathComponent?.suffix(3)// (imageURL as! String).suffix(3) if imageExtension!.lowercased() == "gif" { do { let gifData = try Data(contentsOf: imageURL as URL) socialfeedviewmodel?.uploadImage(image: gifData, isGif: true) } catch let e { print(e.localizedDescription) } } else { socialfeedviewmodel?.uploadImage(image: image, isGif: false) } } else { //CAMERA SELECTION socialfeedviewmodel?.uploadImage(image: image, isGif: false) } dismiss(animated: true, completion: nil) } else { } } func imagePickerControllerDidCancel(_ picker: UIImagePickerController) { dismiss(animated: true, completion: nil) } func didCropImage(_ croppedImage: UIImage, usingCropRect cropRect: CGRect){ }}