mirror of
https://github.com/oxen-io/session-ios.git
synced 2023-12-13 21:30:14 +01:00
Fixed an issue where if you left a closed group on one device you wouldn't leave it on another Renamed a few types to clean up the namespacing and code jumping Fixed a stack overflow issue which could occur in the JobRunner Fixed an issue where the DeletedMessageView could randomly have the wrong height Fixed an issue where you could interact with the hidden reply button on a cell Fixed an issue where tapping anywhere horizontally would trigger the cell tap (need to tap within the bubble) Disabled the ability to select text in messages (only works sometimes and is buggy)
104 lines
4.6 KiB
Swift
104 lines
4.6 KiB
Swift
// Copyright © 2022 Rangeproof Pty Ltd. All rights reserved.
|
|
|
|
import UIKit
|
|
import GRDB
|
|
import SessionMessagingKit
|
|
import SessionUtilitiesKit
|
|
|
|
final class JoinOpenGroupModal: Modal {
|
|
private let name: String
|
|
private let url: String
|
|
|
|
// MARK: - Lifecycle
|
|
|
|
init(name: String?, url: String) {
|
|
self.name = (name ?? "Open Group")
|
|
self.url = url
|
|
|
|
super.init(nibName: nil, bundle: nil)
|
|
}
|
|
|
|
override init(nibName: String?, bundle: Bundle?) {
|
|
preconditionFailure("Use init(name:url:) instead.")
|
|
}
|
|
|
|
required init?(coder: NSCoder) {
|
|
preconditionFailure("Use init(name:url:) instead.")
|
|
}
|
|
|
|
override func populateContentView() {
|
|
// Title
|
|
let titleLabel = UILabel()
|
|
titleLabel.textColor = Colors.text
|
|
titleLabel.font = .boldSystemFont(ofSize: Values.largeFontSize)
|
|
titleLabel.text = "Join \(name)?"
|
|
titleLabel.textAlignment = .center
|
|
|
|
// Message
|
|
let messageLabel = UILabel()
|
|
messageLabel.textColor = Colors.text
|
|
messageLabel.font = .systemFont(ofSize: Values.smallFontSize)
|
|
let message = "Are you sure you want to join the \(name) open group?";
|
|
let attributedMessage = NSMutableAttributedString(string: message)
|
|
attributedMessage.addAttributes([ .font : UIFont.boldSystemFont(ofSize: Values.smallFontSize) ], range: (message as NSString).range(of: name))
|
|
messageLabel.attributedText = attributedMessage
|
|
messageLabel.numberOfLines = 0
|
|
messageLabel.lineBreakMode = .byWordWrapping
|
|
messageLabel.textAlignment = .center
|
|
|
|
// Join button
|
|
let joinButton = UIButton()
|
|
joinButton.set(.height, to: Values.mediumButtonHeight)
|
|
joinButton.layer.cornerRadius = Modal.buttonCornerRadius
|
|
joinButton.backgroundColor = Colors.buttonBackground
|
|
joinButton.titleLabel!.font = .systemFont(ofSize: Values.smallFontSize)
|
|
joinButton.setTitleColor(Colors.text, for: UIControl.State.normal)
|
|
joinButton.setTitle("Join", for: UIControl.State.normal)
|
|
joinButton.addTarget(self, action: #selector(joinOpenGroup), for: UIControl.Event.touchUpInside)
|
|
|
|
// Button stack view
|
|
let buttonStackView = UIStackView(arrangedSubviews: [ cancelButton, joinButton ])
|
|
buttonStackView.axis = .horizontal
|
|
buttonStackView.spacing = Values.mediumSpacing
|
|
buttonStackView.distribution = .fillEqually
|
|
|
|
// Main stack view
|
|
let mainStackView = UIStackView(arrangedSubviews: [ titleLabel, messageLabel, buttonStackView ])
|
|
mainStackView.axis = .vertical
|
|
mainStackView.spacing = Values.largeSpacing
|
|
contentView.addSubview(mainStackView)
|
|
mainStackView.pin(.leading, to: .leading, of: contentView, withInset: Values.largeSpacing)
|
|
mainStackView.pin(.top, to: .top, of: contentView, withInset: Values.largeSpacing)
|
|
contentView.pin(.trailing, to: .trailing, of: mainStackView, withInset: Values.largeSpacing)
|
|
contentView.pin(.bottom, to: .bottom, of: mainStackView, withInset: Values.largeSpacing)
|
|
}
|
|
|
|
// MARK: - Interaction
|
|
|
|
@objc private func joinOpenGroup() {
|
|
guard let presentingViewController: UIViewController = self.presentingViewController else { return }
|
|
guard let (room, server, publicKey) = OpenGroupManagerV2.parseV2OpenGroup(from: url) else {
|
|
let alert = UIAlertController(title: "Couldn't Join", message: nil, preferredStyle: .alert)
|
|
alert.addAction(UIAlertAction(title: NSLocalizedString("BUTTON_OK", comment: ""), style: .default, handler: nil))
|
|
return presentingViewController.present(alert, animated: true, completion: nil)
|
|
}
|
|
|
|
presentingViewController.dismiss(animated: true, completion: nil)
|
|
|
|
GRDBStorage.shared.write { db in
|
|
OpenGroupManagerV2.shared
|
|
.add(db, room: room, server: server, publicKey: publicKey)
|
|
}
|
|
.done(on: DispatchQueue.main) { _ in
|
|
GRDBStorage.shared.write { db in
|
|
try MessageSender.syncConfiguration(db, forceSyncNow: true).retainUntilComplete() // FIXME: It's probably cleaner to do this inside addOpenGroup(...)
|
|
}
|
|
}
|
|
.catch(on: DispatchQueue.main) { error in
|
|
let alert = UIAlertController(title: "Couldn't Join", message: error.localizedDescription, preferredStyle: .alert)
|
|
alert.addAction(UIAlertAction(title: NSLocalizedString("BUTTON_OK", comment: ""), style: .default, handler: nil))
|
|
presentingViewController.present(alert, animated: true, completion: nil)
|
|
}
|
|
}
|
|
}
|