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

import SignalServiceKit
import SignalUI

class DonationReceiptsViewController: OWSTableViewController2 {

    private var donationReceipts = [DonationReceipt]()
    private let profileBadgeLookup: ProfileBadgeLookup

    private lazy var dateFormatter: DateFormatter = {
        let formatter = DateFormatter()
        formatter.dateStyle = .medium
        formatter.timeStyle = .none
        return formatter
    }()

    init(profileBadgeLookup: ProfileBadgeLookup) {
        self.profileBadgeLookup = profileBadgeLookup
        super.init()
    }

    override func viewDidLoad() {
        super.viewDidLoad()

        title = OWSLocalizedString("DONATION_RECEIPTS", comment: "Title of view where you can see all of your donation receipts, or button to take you there")
        defaultSeparatorInsetLeading = Self.cellHInnerMargin + 24 + OWSTableItem.iconSpacing

        donationReceipts = SSKEnvironment.shared.databaseStorageRef.read { DonationReceiptFinder.fetchAllInReverseDateOrder(transaction: $0) }

        updateTableContents()
    }

    private func updateTableContents() {
        let contents = OWSTableContents()
        defer { self.contents = contents }

        var sections = [OWSTableSection]()

        for donationReceipt in donationReceipts {
            let year = Calendar.current.component(.year, from: donationReceipt.timestamp)
            let yearString = String(year)

            let sectionForThisYear: OWSTableSection
            if let lastSection = sections.last, lastSection.headerTitle == yearString {
                sectionForThisYear = lastSection
            } else {
                let newSection = OWSTableSection()
                newSection.headerTitle = yearString
                sections.append(newSection)
                sectionForThisYear = newSection
            }

            let profileBadgeImage = profileBadgeLookup.getImage(donationReceipt: donationReceipt, preferDarkTheme: Theme.isDarkThemeEnabled)
            let formattedDate = dateFormatter.string(from: donationReceipt.timestamp)
            let formattedAmount = CurrencyFormatter.format(money: donationReceipt.amount)

            let tableItem = OWSTableItem(
                customCellBlock: { [weak self] in
                    guard let self else {
                        owsFailDebug("Missing self")
                        return OWSTableItem.newCell()
                    }

                    let accessibilityIdentifier = UIView.accessibilityIdentifier(in: self, name: "donation_receipt.\(donationReceipt.uniqueId)")

                    return OWSTableItem.buildImageCell(
                        image: profileBadgeImage,
                        itemName: formattedDate,
                        subtitle: donationReceipt.localizedName,
                        accessoryText: formattedAmount,
                        accessoryTextColor: .Signal.label,
                        accessoryType: .disclosureIndicator,
                        accessibilityIdentifier: accessibilityIdentifier,
                    )
                },
                actionBlock: { [weak self] in
                    let vc = DonationReceiptViewController(model: donationReceipt)
                    self?.navigationController?.pushViewController(vc, animated: true)
                },
            )

            sectionForThisYear.add(tableItem)
        }

        let footerSection = OWSTableSection()
        footerSection.footerTitle = OWSLocalizedString(
            "DONATION_RECEIPTS_MIGHT_BE_MISSING_IF_YOU_REINSTALLED",
            comment: "Text at the bottom of the donation receipts list, telling users that receipts might not be available",
        )
        sections.append(footerSection)

        contents.add(sections: sections)
    }
}