You can not select more than 25 topics Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
 
 
 
 

488 lines
18 KiB

//
// 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 {
}
} 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){
}}