Book a Demo!
CoCalc Logo Icon
StoreFeaturesDocsShareSupportNewsAboutPoliciesSign UpSign In
signalapp
GitHub Repository: signalapp/Signal-iOS
Path: blob/main/Signal/src/ViewControllers/ProxyLinkSheetViewController.swift
1 views
//
// Copyright 2022 Signal Messenger, LLC
// SPDX-License-Identifier: AGPL-3.0-only
//

import SignalServiceKit
import SignalUI

class ProxyLinkSheetViewController: OWSTableSheetViewController {
    let url: URL

    init?(url: URL) {
        guard SignalProxy.isValidProxyLink(url) else { return nil }
        self.url = url
        super.init()
    }

    override func tableContents() -> OWSTableContents {
        let contents = OWSTableContents()

        let proxyHost = url.fragment!

        let avatarSection = OWSTableSection()
        avatarSection.hasBackground = false
        contents.add(avatarSection)
        avatarSection.add(.init(customCellBlock: {
            let cell = OWSTableItem.newCell()
            cell.selectionStyle = .none

            let imageView = UIImageView()
            imageView.contentMode = .scaleAspectFit
            imageView.image = UIImage(named: "proxy_avatar")
            imageView.autoSetDimension(.height, toSize: 96)

            let titleLabel = UILabel()
            titleLabel.font = .dynamicTypeHeadline
            titleLabel.text = "Proxy Server"
            titleLabel.textColor = Theme.primaryTextColor
            titleLabel.textAlignment = .center

            let stackView = UIStackView(arrangedSubviews: [imageView, titleLabel])
            stackView.axis = .vertical
            stackView.spacing = 12
            stackView.alignment = .center

            cell.contentView.addSubview(stackView)
            stackView.autoPinEdgesToSuperviewMargins()

            return cell
        }))

        let addressSection = OWSTableSection()
        addressSection.hasBackground = false
        addressSection.headerTitle = OWSLocalizedString("PROXY_ADDRESS", comment: "The title for the address of the signal proxy")
        contents.add(addressSection)
        addressSection.add(.label(withText: proxyHost))

        let actionsSection = OWSTableSection()
        actionsSection.hasBackground = false
        actionsSection.headerTitle = OWSLocalizedString("DO_YOU_WANT_TO_USE_PROXY", comment: "Title for the proxy confirmation")
        contents.add(actionsSection)
        actionsSection.add(.init(customCellBlock: { [weak self] in
            let cell = OWSTableItem.newCell()
            cell.selectionStyle = .none

            guard let self else { return cell }

            let stackView = UIStackView(arrangedSubviews: [
                self.button(
                    title: CommonStrings.cancelButton,
                    titleColor: Theme.primaryTextColor,
                    touchHandler: { [weak self] in
                        self?.dismiss(animated: true)
                    },
                ),
                self.button(
                    title: OWSLocalizedString("USE_PROXY_BUTTON", comment: "Button to activate the signal proxy"),
                    titleColor: .ows_accentBlue,
                    touchHandler: { [weak self] in
                        SSKEnvironment.shared.databaseStorageRef.write {
                            SignalProxy.setProxyHost(host: proxyHost, useProxy: true, transaction: $0)
                        }

                        let presentingVC = self?.presentingViewController
                        _ = Task(priority: .userInitiated) {
                            if await ProxyConnectionChecker(chatConnectionManager: DependenciesBridge.shared.chatConnectionManager).checkConnection() {
                                presentingVC?.presentToast(text: OWSLocalizedString("PROXY_CONNECTED_SUCCESSFULLY", comment: "The provided proxy connected successfully"))
                            } else {
                                presentingVC?.presentToast(text: OWSLocalizedString("PROXY_FAILED_TO_CONNECT", comment: "The provided proxy couldn't connect"))
                                SSKEnvironment.shared.databaseStorageRef.write { transaction in
                                    SignalProxy.setProxyHost(host: proxyHost, useProxy: false, transaction: transaction)
                                }
                            }
                        }

                        self?.dismiss(animated: true)
                    },
                ),
            ])
            stackView.axis = .horizontal
            stackView.spacing = 12
            stackView.distribution = .fillEqually
            cell.contentView.addSubview(stackView)
            stackView.autoPinEdgesToSuperviewMargins()

            return cell
        }))

        return contents
    }

    private func button(title: String, titleColor: UIColor, touchHandler: @escaping () -> Void) -> OWSFlatButton {
        let flatButton = OWSFlatButton()
        flatButton.setTitle(title: title, font: UIFont.dynamicTypeHeadlineClamped, titleColor: titleColor)
        flatButton.setBackgroundColors(upColor: tableViewController.cellBackgroundColor)
        flatButton.setPressedBlock(touchHandler)
        flatButton.useDefaultCornerRadius()
        flatButton.autoSetDimension(.height, toSize: 48)
        return flatButton
    }
}