// // Copyright 2021 New Vector Ltd // // Licensed under the Apache License, Version 2.0 (the "License"); // you may not use this file except in compliance with the License. // You may obtain a copy of the License at // // http://www.apache.org/licenses/LICENSE-2.0 // // Unless required by applicable law or agreed to in writing, software // distributed under the License is distributed on an "AS IS" BASIS, // WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. // See the License for the specific language governing permissions and // limitations under the License. // import Foundation class SpaceMenuViewController: UIViewController { // MARK: - Constants private enum Constants { static let estimatedRowHeight: CGFloat = 64.0 } // MARK: Private private var theme: Theme! private var session: MXSession! private var spaceId: String! private var viewModel: SpaceMenuViewModelType! // MARK: Outlets @IBOutlet private weak var avatarView: SpaceAvatarView! @IBOutlet private weak var titleLabel: UILabel! @IBOutlet private weak var subtitleLabel: UILabel! @IBOutlet private weak var closeButton: UIButton! @IBOutlet private weak var tableView: UITableView! // MARK: - Setup class func instantiate(forSpaceWithId spaceId: String, matrixSession: MXSession, viewModel: SpaceMenuViewModelType!) -> SpaceMenuViewController { let viewController = StoryboardScene.SpaceMenuViewController.initialScene.instantiate() viewController.session = matrixSession viewController.spaceId = spaceId viewController.viewModel = viewModel viewController.theme = ThemeService.shared().theme return viewController } // MARK: - Life cycle override func viewDidLoad() { super.viewDidLoad() // Do any additional setup after loading the view. self.setupViews() self.registerThemeServiceDidChangeThemeNotification() self.update(theme: self.theme) } override var preferredStatusBarStyle: UIStatusBarStyle { return self.theme.statusBarStyle } override var preferredContentSize: CGSize { get { return CGSize(width: 300, height: 300) } set { super.preferredContentSize = newValue } } // MARK: - IBActions @IBAction private func closeAction(sender: UIButton) { self.viewModel.process(viewAction: .dismiss) } // MARK: - Private private func update(theme: Theme) { self.theme = theme self.view.backgroundColor = theme.colors.background self.titleLabel.textColor = theme.colors.primaryContent self.titleLabel.font = theme.fonts.title3SB self.subtitleLabel.textColor = theme.colors.secondaryContent self.subtitleLabel.font = theme.fonts.caption1 self.closeButton.backgroundColor = theme.roomInputTextBorder self.closeButton.tintColor = theme.noticeSecondaryColor } private func registerThemeServiceDidChangeThemeNotification() { NotificationCenter.default.addObserver(self, selector: #selector(themeDidChange), name: .themeServiceDidChangeTheme, object: nil) } @objc private func themeDidChange() { self.update(theme: ThemeService.shared().theme) } private func setupViews() { guard let space = self.session.spaceService.getSpace(withId: self.spaceId), let summary = space.summary else { MXLog.error("[SpaceMenuViewController] setupViews: no space found") return } let avatarViewData = AvatarViewData(avatarUrl: summary.avatar, mediaManager: self.session.mediaManager, fallbackImage: .matrixItem(summary.roomId, summary.displayname)) self.titleLabel.text = space.summary?.displayname // TODO: display members instead once done on android // self.subtitleLabel.text = space.membersId.count == 1 ? VectorL10n.roomTitleOneMember : // VectorL10n.roomTitleMembers("\(space.membersId.count)") self.subtitleLabel.text = summary.topic self.avatarView.fill(with: avatarViewData) self.closeButton.layer.masksToBounds = true self.closeButton.layer.cornerRadius = self.closeButton.bounds.height / 2 setupTableView() } private func setupTableView() { self.tableView.separatorStyle = .none self.tableView.rowHeight = UITableView.automaticDimension self.tableView.estimatedRowHeight = Constants.estimatedRowHeight self.tableView.allowsSelection = true self.tableView.register(cellType: SpaceMenuListViewCell.self) self.tableView.tableFooterView = UIView() } } // MARK: - SlidingModalPresentable extension SpaceMenuViewController: SlidingModalPresentable { func allowsDismissOnBackgroundTap() -> Bool { return true } func layoutHeightFittingWidth(_ width: CGFloat) -> CGFloat { return 300 } } // MARK: - UITableViewDataSource extension SpaceMenuViewController: UITableViewDataSource { func numberOfSections(in tableView: UITableView) -> Int { return 1 } func tableView(_ tableView: UITableView, numberOfRowsInSection section: Int) -> Int { return viewModel.menuItems.count } func tableView(_ tableView: UITableView, cellForRowAt indexPath: IndexPath) -> UITableViewCell { let cell = tableView.dequeueReusableCell(for: indexPath, cellType: SpaceMenuListViewCell.self) let viewData = viewModel.menuItems[indexPath.row] cell.update(theme: self.theme) cell.fill(with: viewData) return cell } } // MARK: - UITableViewDelegate extension SpaceMenuViewController: UITableViewDelegate { func tableView(_ tableView: UITableView, didSelectRowAt indexPath: IndexPath) { self.viewModel.process(viewAction: .selectRow(at: indexPath)) } }