Files
mattermost-mobile/ios/MattermostShare/ShareViewController.swift
Elias Nahum 3a3123674a [Gekidou] iOS Share extension (#6432)
* iOS Share extension

* Add Fastlane steps for iOS Share Extension

* new multi file layout

* Add recent label

* Refactor code & identation

* ux feedback

* downsample images

* remove options horizontal padding
2022-07-27 10:31:45 -04:00

154 lines
4.9 KiB
Swift

//
// ShareViewController.swift
// MattermostShare
//
// Copyright (c) 2015-present Mattermost, Inc. All Rights Reserved.
// See LICENSE.txt for license information.
//
import Gekidou
import SwiftUI
import UIKit
import os.log
class ShareViewController: UIViewController {
private var fileManager: LocalFileManager?
private var dismissKeyboardObserver: NSObjectProtocol?
private var closeExtensionObserver: NSObjectProtocol?
private var doPostObserver: NSObjectProtocol?
override func viewDidLoad() {
super.viewDidLoad()
self.isModalInPresentation = true
self.addObservers()
fileManager = LocalFileManager()
if let inputItems = extensionContext?.inputItems {
fileManager!.extractDataFromContext(
inputItems,
completionHander: {[weak self] attachments, linkPreviewUrl, message in
self?.showUIView(
attachments: attachments,
linkPreviewUrl: linkPreviewUrl,
message: message
)
})
}
}
override func viewDidAppear(_ animated: Bool) {
super.viewDidAppear(animated)
}
private func addObservers() {
self.dismissKeyboardObserver = NotificationCenter.default.addObserver(
forName: NSNotification.Name("dismissKeyboard"),
object: nil,
queue: nil) { _ in
self.dismissKeyboard()
}
self.closeExtensionObserver = NotificationCenter.default.addObserver(
forName: NSNotification.Name("close"),
object: nil,
queue: nil,
using: close
)
self.doPostObserver = NotificationCenter.default.addObserver(
forName: NSNotification.Name("doPost"),
object: nil,
queue: nil, using: doPost
)
}
private func removeObservers() {
fileManager = nil
NotificationCenter.default.removeObserver(dismissKeyboardObserver as Any)
NotificationCenter.default.removeObserver(closeExtensionObserver as Any)
NotificationCenter.default.removeObserver(doPostObserver as Any)
}
private func close(_ notification: Notification) {
self.removeObservers()
if let userInfo = notification.userInfo,
let attachments = userInfo["attachments"] as? [AttachmentModel] {
fileManager?.clearTempDirectory(attachments.map{ $0.fileUrl.path})
}
extensionContext?.completeRequest(returningItems: [])
}
private func dismissKeyboard() {
self.view.endEditing(false)
}
private func doPost(_ notification: Notification) {
removeObservers()
if let userInfo = notification.userInfo {
let serverUrl = userInfo["serverUrl"] as? String
let channelId = userInfo["channelId"] as? String
let text = userInfo["message"] as? String ?? ""
let attachments = userInfo["attachments"] as? [AttachmentModel] ?? []
let linkPreviewUrl = userInfo["linkPreviewUrl"] as? String
let fileCount = attachments.count
let files: [String] = attachments.map{ $0.fileUrl.absoluteString }
var message = text
if linkPreviewUrl != nil && !linkPreviewUrl!.isEmpty {
if text.isEmpty {
message = linkPreviewUrl!
} else {
message = "\(text)\n\n\(linkPreviewUrl!)"
}
}
print("Do post to \(serverUrl ?? "") in channel \(channelId ?? "") the message \(message) with preview \(linkPreviewUrl ?? "") and attaching \(fileCount) files")
if let url = serverUrl,
let channel = channelId {
os_log(
OSLogType.default,
"Mattermost BackgroundSession: Sharing content to serverUrl=%{public}@ in channelId=%{public}@ with message=%{public}@ and attaching %{public}@ files",
url,
channel,
message,
"\(fileCount)"
)
let shareExtension = Gekidou.ShareExtension()
shareExtension.uploadFiles(
serverUrl: url,
channelId: channel,
message: message,
files: files,
completionHandler: { [weak self] in
self?.extensionContext!.completeRequest(returningItems: [])
})
} else {
extensionContext!.completeRequest(returningItems: [])
}
}
}
func showUIView(attachments: [AttachmentModel], linkPreviewUrl: String?, message: String?) {
let childView = UIHostingController(
rootView: ShareUIView(
attachments: attachments,
linkPreviewUrl: linkPreviewUrl ?? "",
message: message ?? ""
)
)
addChild(childView)
childView.view.translatesAutoresizingMaskIntoConstraints = false
view.addSubview(childView.view)
childView.didMove(toParent: self)
NSLayoutConstraint.activate([
childView.view.widthAnchor.constraint(equalTo: view.widthAnchor),
childView.view.heightAnchor.constraint(equalTo: view.heightAnchor),
childView.view.centerXAnchor.constraint(equalTo: view.centerXAnchor),
childView.view.centerYAnchor.constraint(equalTo: view.centerYAnchor)
])
}
}