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

import SignalServiceKit
import SignalUI

class PaymentsHistoryViewController: OWSTableViewController2 {

    private let modeControl = UISegmentedControl()

    var recordType: PaymentsHistoryDataSource.RecordType = .all {
        didSet {
            dataSource.updateContent()
        }
    }

    private let dataSource = PaymentsHistoryDataSource()

    override init() {
        super.init()

        topHeader = OWSTableViewController2.buildTopHeader(
            forView: modeControl,
            vMargin: 10,
        )
    }

    override func viewDidLoad() {
        super.viewDidLoad()

        title = OWSLocalizedString(
            "SETTINGS_PAYMENTS_ALL_RECORDS",
            comment: "Label for the 'all payment records' section of the app settings.",
        )

        createSubviews()

        dataSource.delegate = self

        updateTableContents()

        NotificationCenter.default.addObserver(
            self,
            selector: #selector(updateTableContents),
            name: PaymentsCurrenciesImpl.paymentConversionRatesDidChange,
            object: nil,
        )
    }

    override func themeDidChange() {
        super.themeDidChange()

        updateTableContents()
    }

    private func createSubviews() {
        assert(PaymentsHistoryDataSource.RecordType.all.rawValue == 0)
        modeControl.insertSegment(
            withTitle: OWSLocalizedString(
                "SETTINGS_PAYMENTS_PAYMENTS_TYPE_ALL",
                comment: "Label for the 'all payments' mode of the 'all payment records' section of the app settings.",
            ),
            at: PaymentsHistoryDataSource.RecordType.all.rawValue,
            animated: false,
        )
        assert(PaymentsHistoryDataSource.RecordType.incoming.rawValue == 1)
        modeControl.insertSegment(
            withTitle: OWSLocalizedString(
                "SETTINGS_PAYMENTS_PAYMENTS_TYPE_INCOMING",
                comment: "Label for the 'incoming payments' mode of the 'all payment records' section of the app settings.",
            ),
            at: PaymentsHistoryDataSource.RecordType.incoming.rawValue,
            animated: false,
        )
        assert(PaymentsHistoryDataSource.RecordType.outgoing.rawValue == 2)
        modeControl.insertSegment(
            withTitle: OWSLocalizedString(
                "SETTINGS_PAYMENTS_PAYMENTS_TYPE_OUTGOING",
                comment: "Label for the 'outgoing payments' mode of the 'all payment records' section of the app settings.",
            ),
            at: PaymentsHistoryDataSource.RecordType.outgoing.rawValue,
            animated: false,
        )
        modeControl.selectedSegmentIndex = recordType.rawValue
        modeControl.addTarget(
            self,
            action: #selector(modeControlDidChange),
            for: .valueChanged,
        )
    }

    @objc
    private func updateTableContents() {
        let contents = OWSTableContents()

        let section = OWSTableSection()
        section.customHeaderHeight = 16
        section.separatorInsetLeading = Self.cellHInnerMargin + PaymentModelCell.separatorInsetLeading
        for paymentItem in dataSource.items {
            section.add(OWSTableItem(
                customCellBlock: {
                    let cell = PaymentModelCell()
                    cell.configure(paymentItem: paymentItem)
                    return cell
                },
                actionBlock: { [weak self] in
                    self?.didTapPaymentItem(paymentItem: paymentItem)
                },
            ))
        }
        contents.add(section)

        self.contents = contents
    }

    // MARK: -

    private func didTapPaymentItem(paymentItem: PaymentsHistoryItem) {
        let view = PaymentsDetailViewController(paymentItem: paymentItem)
        navigationController?.pushViewController(view, animated: true)
    }

    @objc
    private func modeControlDidChange(_ sender: UISegmentedControl) {

        guard let recordType = PaymentsHistoryDataSource.RecordType(rawValue: sender.selectedSegmentIndex) else {
            owsFailDebug("Couldn't update recordType.")
            return
        }
        self.recordType = recordType
    }
}

// MARK: -

extension PaymentsHistoryViewController: PaymentsHistoryDataSourceDelegate {
    var maxRecordCount: Int? {
        nil
    }

    func didUpdateContent() {
        AssertIsOnMainThread()

        updateTableContents()
    }
}