Skip to content

Commit

Permalink
Merge branch 'devel' into messages
Browse files Browse the repository at this point in the history
  • Loading branch information
or-else committed Jun 7, 2019
2 parents f9fce2d + 3ac3f46 commit b4b33ef
Show file tree
Hide file tree
Showing 8 changed files with 175 additions and 30 deletions.
15 changes: 6 additions & 9 deletions TinodeSDK/Topic.swift
Original file line number Diff line number Diff line change
Expand Up @@ -342,6 +342,11 @@ open class Topic<DP: Codable, DR: Codable, SP: Codable, SR: Codable>: TopicProto
return description?.acs?.isMuted ?? false
}
}
public var isOwner: Bool {
get {
return description?.acs?.isOwner ?? false
}
}

// Storage is owned by Tinode.
weak public var store: Storage? = nil
Expand Down Expand Up @@ -1318,14 +1323,6 @@ public class ComTopic<DP: Codable>: Topic<DP, PrivateType, DP, PrivateType> {
}

public var comment: String? {
get {
guard let comment = priv?["comment"] else { return nil }
switch comment {
case .string(let x):
return x
default:
return nil
}
}
get { return priv?.comment }
}
}
11 changes: 8 additions & 3 deletions TinodeSDK/model/Acs.swift
Original file line number Diff line number Diff line change
Expand Up @@ -8,9 +8,9 @@
import Foundation

public class Acs: Codable, Equatable {
var given: AcsHelper?
var want: AcsHelper?
var mode: AcsHelper?
public var given: AcsHelper?
public var want: AcsHelper?
public var mode: AcsHelper?

var isModeDefined: Bool {
get {
Expand All @@ -23,6 +23,11 @@ public class Acs: Codable, Equatable {
return m.isAdmin || m.isOwner
}
}
var isOwner: Bool {
get {
return mode?.isOwner ?? false
}
}
var isMuted: Bool {
get {
return mode?.isMuted ?? false
Expand Down
2 changes: 1 addition & 1 deletion TinodeSDK/model/ServerMessages.swift
Original file line number Diff line number Diff line change
Expand Up @@ -99,7 +99,7 @@ public class DelValues: Decodable {
public typealias PrivateType = Dictionary<String, JSONValue>

extension PrivateType {
var comment: String? {
public var comment: String? {
get {
if case let .string(v)? = self["comment"] {
return v
Expand Down
26 changes: 14 additions & 12 deletions Tinodios/AccountSettingsViewController.swift
Original file line number Diff line number Diff line change
Expand Up @@ -29,21 +29,22 @@ class AccountSettingsViewController: UIViewController {
override func viewWillAppear(_ animated: Bool) {
reloadData()
}
private func setupTapRecognizer(forView view: UIView, action: Selector?) {
let tap = UITapGestureRecognizer(target: self, action: action)
view.isUserInteractionEnabled = true
view.addGestureRecognizer(tap)
}
private func setup() {
self.tinode = Cache.getTinode()
self.me = self.tinode.getMeTopic()!

setupTapRecognizer(forView: topicTitleTextView,
action: #selector(AccountSettingsViewController.topicTitleTapped))
setupTapRecognizer(forView: authUsersPermissionsLabel,
action: #selector(AccountSettingsViewController.permissionsTapped))
setupTapRecognizer(forView: anonUsersPermissionsLabel,
action: #selector(AccountSettingsViewController.permissionsTapped))
UiUtils.setupTapRecognizer(
forView: topicTitleTextView,
action: #selector(AccountSettingsViewController.topicTitleTapped),
actionTarget: self)
UiUtils.setupTapRecognizer(
forView: authUsersPermissionsLabel,
action: #selector(AccountSettingsViewController.permissionsTapped),
actionTarget: self)
UiUtils.setupTapRecognizer(
forView: anonUsersPermissionsLabel,
action: #selector(AccountSettingsViewController.permissionsTapped),
actionTarget: self)
self.imagePicker = ImagePicker(
presentationController: self, delegate: self)
}
Expand Down Expand Up @@ -111,6 +112,7 @@ class AccountSettingsViewController: UIViewController {
approveState: acsUnwrapped.hasPermissions(forMode: AcsHelper.kModeApprove),
inviteState: acsUnwrapped.hasPermissions(forMode: AcsHelper.kModeShare),
deleteState: acsUnwrapped.hasPermissions(forMode: AcsHelper.kModeDelete),
disabledPermissions: nil,
onChangeHandler: { [v]
joinState,
readState,
Expand Down Expand Up @@ -194,7 +196,7 @@ class AccountSettingsViewController: UIViewController {
if pub.fn != newTitle {
pub.fn = newTitle
}
UiUtils.setPublicData(forTopic: self.me, pub: pub)
UiUtils.setTopicData(forTopic: self.me, pub: pub, priv: nil)
}
private func logout() {
print("logging out")
Expand Down
117 changes: 117 additions & 0 deletions Tinodios/TopicInfoViewController.swift
Original file line number Diff line number Diff line change
Expand Up @@ -58,6 +58,24 @@ class TopicInfoViewController: UIViewController {
self.groupView.isHidden = true
self.defaultPermissionsView.isHidden = true
}
UiUtils.setupTapRecognizer(
forView: topicSubtitleTextView,
action: #selector(TopicInfoViewController.topicTitleTapped),
actionTarget: self)
if topic.isOwner {
UiUtils.setupTapRecognizer(
forView: topicTitleTextView,
action: #selector(TopicInfoViewController.topicTitleTapped),
actionTarget: self)
}
UiUtils.setupTapRecognizer(
forView: myPermissionsLabel,
action: #selector(TopicInfoViewController.permissionsTapped),
actionTarget: self)
UiUtils.setupTapRecognizer(
forView: peerPermissionsLabel,
action: #selector(TopicInfoViewController.permissionsTapped),
actionTarget: self)
self.imagePicker = ImagePicker(
presentationController: self, delegate: self)
}
Expand Down Expand Up @@ -88,6 +106,94 @@ class TopicInfoViewController: UIViewController {
@IBAction func loadAvatarClicked(_ sender: Any) {
imagePicker.present(from: self.view)
}
@objc
func topicTitleTapped(sender: UITapGestureRecognizer) {
let alert = UIAlertController(title: "Edit Topic", message: nil, preferredStyle: .alert)
alert.addAction(UIAlertAction(title: "Cancel", style: .cancel, handler: nil))
if topic.isOwner {
alert.addTextField(configurationHandler: { textField in
textField.placeholder = "Name of the group"
textField.text = self.topic?.pub?.fn ?? ""
})
}
alert.addTextField(configurationHandler: { textField in
textField.placeholder = "Additional info (private)"
textField.text = self.topic?.comment ?? ""
})
alert.addAction(UIAlertAction(
title: "OK", style: .default,
handler: { action in
let textFields = alert.textFields!
let newTitle = self.topic.isOwner ? textFields[0].text : nil
let newSubtitle = textFields[self.topic.isOwner ? 1 : 0].text
self.updateTitles(newTitle: newTitle, newSubtitle: newSubtitle)
}))
self.present(alert, animated: true)
}
private func updateTitles(newTitle: String?, newSubtitle: String?) {
var pub: VCard? = nil
if let nt = newTitle {
if let oldPub = topic.pub, oldPub.fn != nt {
pub = VCard(fn: nt, avatar: nil as Data?)
}
}
var priv: PrivateType? = nil
if let ns = newSubtitle {
if let oldComment = topic.comment, oldComment != ns {
priv = PrivateType()
priv!.comment = ns
}
}
if pub != nil || priv != nil {
UiUtils.setTopicData(forTopic: topic, pub: pub, priv: priv)
}
}
// TODO: Fold it down to UiUtils.
@objc
func permissionsTapped(sender: UITapGestureRecognizer) {
guard let v = sender.view else {
print("Tap from no sender view... quitting")
return
}
var acs: AcsHelper? = nil
if v === myPermissionsLabel {
acs = topic.accessMode?.want
} else if v == peerPermissionsLabel {
acs = topic.accessMode?.given
}
guard let acsUnwrapped = acs else {
print("could not get acs")
return
}
let alertVC = PermissionsEditViewController(
joinState: acsUnwrapped.hasPermissions(forMode: AcsHelper.kModeJoin),
readState: acsUnwrapped.hasPermissions(forMode: AcsHelper.kModeRead),
writeState: acsUnwrapped.hasPermissions(forMode: AcsHelper.kModeWrite),
notificationsState: acsUnwrapped.hasPermissions(forMode: AcsHelper.kModePres),
approveState: acsUnwrapped.hasPermissions(forMode: AcsHelper.kModeApprove),
inviteState: acsUnwrapped.hasPermissions(forMode: AcsHelper.kModeShare),
deleteState: acsUnwrapped.hasPermissions(forMode: AcsHelper.kModeDelete),
disabledPermissions: [.approve, .invite, .delete],
onChangeHandler: { [v]
joinState,
readState,
writeState,
notificationsState,
approveState,
inviteState,
deleteState in
self.didChangePermissions(
forLabel: v,
joinState: joinState,
readState: readState,
writeState: writeState,
notificationsState: notificationsState,
approveState: approveState,
inviteState: inviteState,
deleteState: deleteState)
})
alertVC.show(over: self)
}
}

extension TopicInfoViewController: UITableViewDataSource, UITableViewDelegate {
Expand Down Expand Up @@ -131,3 +237,14 @@ extension TopicInfoViewController: ImagePickerDelegate {
)
}
}
extension TopicInfoViewController {
func didChangePermissions(forLabel l: UIView,
joinState: Bool,
readState: Bool,
writeState: Bool,
notificationsState: Bool,
approveState: Bool,
inviteState: Bool,
deleteState: Bool) {
}
}
13 changes: 9 additions & 4 deletions Tinodios/UiUtils.swift
Original file line number Diff line number Diff line change
Expand Up @@ -156,6 +156,11 @@ class UiUtils {
})
})
}
public static func setupTapRecognizer(forView view: UIView, action: Selector?, actionTarget: UIViewController) {
let tap = UITapGestureRecognizer(target: actionTarget, action: action)
view.isUserInteractionEnabled = true
view.addGestureRecognizer(tap)
}
public static func ToastFailureHandler(err: Error) throws -> PromisedReply<ServerMessage>? {
DispatchQueue.main.async {
if let e = err as? TinodeError, case .notConnected = e {
Expand All @@ -179,13 +184,13 @@ class UiUtils {
forTopic topic: DefaultTopic, image: UIImage) -> PromisedReply<ServerMessage>? {
let pub = topic.pub == nil ? VCard(fn: nil, avatar: image) : topic.pub!.copy()
pub.photo = Photo(image: image)
return UiUtils.setPublicData(forTopic: topic, pub: pub)
return UiUtils.setTopicData(forTopic: topic, pub: pub, priv: nil)
}
@discardableResult
public static func setPublicData(
forTopic topic: DefaultTopic, pub: VCard) -> PromisedReply<ServerMessage>? {
public static func setTopicData(
forTopic topic: DefaultTopic, pub: VCard?, priv: PrivateType?) -> PromisedReply<ServerMessage>? {
do {
return try topic.setDescription(pub: pub, priv: nil)?.then(
return try topic.setDescription(pub: pub, priv: priv)?.then(
onSuccess: UiUtils.ToastSuccessHandler,
onFailure: UiUtils.ToastFailureHandler)
} catch {
Expand Down
2 changes: 1 addition & 1 deletion Tinodios/widgets/PermissionsEditView.xib
Original file line number Diff line number Diff line change
Expand Up @@ -117,6 +117,7 @@
</subviews>
<color key="backgroundColor" white="1" alpha="1" colorSpace="custom" customColorSpace="genericGamma22GrayColorSpace"/>
<constraints>
<constraint firstAttribute="width" constant="282" id="1sG-6A-Tcd"/>
<constraint firstItem="P0V-3H-Axo" firstAttribute="top" secondItem="yd6-73-Tb3" secondAttribute="bottom" constant="7" id="2Ib-Xt-B7e"/>
<constraint firstItem="snA-jI-Q4g" firstAttribute="top" secondItem="zog-3U-aso" secondAttribute="bottom" constant="3" id="2WS-qy-4ip"/>
<constraint firstItem="P0V-3H-Axo" firstAttribute="leading" secondItem="1BK-6h-zLk" secondAttribute="leading" id="3Ll-UE-xyA"/>
Expand Down Expand Up @@ -161,7 +162,6 @@
<constraints>
<constraint firstItem="CjA-KL-BBV" firstAttribute="centerY" secondItem="iN0-l3-epB" secondAttribute="centerY" id="U7M-zv-hHd"/>
<constraint firstItem="CjA-KL-BBV" firstAttribute="centerX" secondItem="iN0-l3-epB" secondAttribute="centerX" id="XU4-g5-2ei"/>
<constraint firstItem="CjA-KL-BBV" firstAttribute="leading" secondItem="vUN-kp-3ea" secondAttribute="leading" constant="66" id="dgI-ds-M7a"/>
</constraints>
<viewLayoutGuide key="safeArea" id="vUN-kp-3ea"/>
<point key="canvasLocation" x="92.753623188405811" y="31.473214285714285"/>
Expand Down
19 changes: 19 additions & 0 deletions Tinodios/widgets/PermissionsEditViewController.swift
Original file line number Diff line number Diff line change
Expand Up @@ -8,6 +8,9 @@
import UIKit

class PermissionsEditViewController: UIViewController {
public enum PermissionType {
case join, read, write, notifications, approve, invite, delete
}
public typealias OnChangeHandler = ((
_ joinState: Bool,
_ readState: Bool,
Expand All @@ -33,6 +36,7 @@ class PermissionsEditViewController: UIViewController {
private var approveState: Bool
private var inviteState: Bool
private var deleteState: Bool
private var disabledPermissions: [PermissionType]?

private var onChange: OnChangeHandler?

Expand All @@ -43,6 +47,7 @@ class PermissionsEditViewController: UIViewController {
approveState: Bool,
inviteState: Bool,
deleteState: Bool,
disabledPermissions: [PermissionType]?,
onChangeHandler: PermissionsEditViewController.OnChangeHandler?) {
self.joinState = joinState
self.readState = readState
Expand All @@ -55,6 +60,7 @@ class PermissionsEditViewController: UIViewController {
self.modalTransitionStyle = .crossDissolve
self.modalPresentationStyle = .overCurrentContext
self.onChange = onChangeHandler
self.disabledPermissions = disabledPermissions
}
required init?(coder aDecoder: NSCoder) {
fatalError("init(coder:) has not been implemented")
Expand All @@ -75,6 +81,19 @@ class PermissionsEditViewController: UIViewController {
self.approveSwitch.isOn = approveState
self.inviteSwitch.isOn = inviteState
self.deleteSwitch.isOn = deleteState
if let disablePermissions = self.disabledPermissions {
for p in disablePermissions {
switch p {
case .join: self.joinSwitch.isEnabled = false
case .read: self.readSwitch.isEnabled = false
case .write: self.writeSwitch.isEnabled = false
case .notifications: self.notificationsSwitch.isEnabled = false
case .approve: self.approveSwitch.isEnabled = false
case .invite: self.inviteSwitch.isEnabled = false
case .delete: self.deleteSwitch.isEnabled = false
}
}
}
}
func show(over viewController: UIViewController?) {
guard let viewController = viewController else { return }
Expand Down

0 comments on commit b4b33ef

Please sign in to comment.