Skip to content

Commit

Permalink
Add memoing of previously dismissed and contributed donation campaigns.
Browse files Browse the repository at this point in the history
  • Loading branch information
whattherestimefor committed Nov 6, 2024
1 parent 2edf0ec commit ad8561c
Show file tree
Hide file tree
Showing 8 changed files with 42 additions and 6 deletions.
6 changes: 3 additions & 3 deletions Mastodon/Scene/Donation/DonationBanner.swift
Original file line number Diff line number Diff line change
Expand Up @@ -10,7 +10,7 @@ class DonationBanner: UIView {
static let textToButtonPadding: CGFloat = 48
}

private var campaign: Mastodon.Entity.DonationCampaign?
public private(set) var campaign: Mastodon.Entity.DonationCampaign?
private lazy var backgroundImageView = UIImageView(
image: Asset.Asset.scribble.image)
private let messageLabel = UILabel()
Expand All @@ -32,7 +32,7 @@ class DonationBanner: UIView {
setupViews()
}

var onClose: (() -> Void)?
var onClose: ((String?) -> Void)?
var onShowDonationDialog: ((Mastodon.Entity.DonationCampaign) -> Void)?

required init?(coder: NSCoder) {
Expand Down Expand Up @@ -114,7 +114,7 @@ class DonationBanner: UIView {

@objc
private func closeButtonPressed(_ sender: Any?) {
onClose?()
onClose?(campaign?.id)
}

@objc
Expand Down
1 change: 1 addition & 0 deletions Mastodon/Scene/Donation/DonationCampaignViewModel.swift
Original file line number Diff line number Diff line change
Expand Up @@ -20,6 +20,7 @@ typealias DonationFrequency = Mastodon.Entity.DonationCampaign.DonationFrequency
typealias DonationSource = Mastodon.Entity.DonationCampaign.DonationSource

protocol DonationCampaignViewModel {
var id: String { get }
func paymentURL(
currency: String, source: DonationSource,
frequency: Mastodon.Entity.DonationCampaign.DonationFrequency,
Expand Down
2 changes: 1 addition & 1 deletion Mastodon/Scene/Donation/DonationViewController.swift
Original file line number Diff line number Diff line change
Expand Up @@ -224,7 +224,7 @@ struct DonationButtonStyle: ButtonStyle {
}

struct DefaultDonationViewModel: DonationCampaignViewModel {

var id: String = "default"
var paymentBaseURL: URL? {
if Mastodon.API.isTestingDonations {
URL(string: "https://sponsor.staging.joinmastodon.org/donation/new")
Expand Down
1 change: 1 addition & 0 deletions Mastodon/Scene/Donation/NewDonationNavigationFlow.swift
Original file line number Diff line number Diff line change
Expand Up @@ -74,6 +74,7 @@ class NewDonationNavigationFlow: NavigationFlow {
case "success":
result = .successful(suggestedPost: campaign.donationSuccessPost)
showDonationCompletionMessage(result)
Mastodon.Entity.DonationCampaign.didContribute(campaign.id)
case "failure":
let alert = UIAlertController(
title: L10n.Scene.Donation.Success.serverErrorTitle,
Expand Down
5 changes: 4 additions & 1 deletion Mastodon/Scene/HomeTimeline/HomeTimelineViewController.swift
Original file line number Diff line number Diff line change
Expand Up @@ -451,8 +451,11 @@ extension HomeTimelineViewController {
view.addSubview(donationBanner)
donationBanner.alpha = 0
donationBanner.translatesAutoresizingMaskIntoConstraints = false
donationBanner.onClose = { [weak self] in
donationBanner.onClose = { [weak self] campaignID in
self?.hideDonationCampaignBanner()
if let campaignID {
Mastodon.Entity.DonationCampaign.didDismiss(campaignID)
}
}
donationBanner.onShowDonationDialog = { [weak self] campaign in
self?.showDonationCampaign(campaign)
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -25,6 +25,7 @@ extension HomeTimelineViewModel {
do {
let campaign = try await self.context.apiService
.getDonationCampaign(seed: seed, source: nil).value
guard !Mastodon.Entity.DonationCampaign.hasPreviouslyDismissed(campaign.id) && !Mastodon.Entity.DonationCampaign.hasPreviouslyContributed(campaign.id) else { return }
onPresentDonationCampaign.send(campaign)
} catch {
// no-op
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -12,6 +12,7 @@ protocol SettingsViewControllerDelegate: AnyObject {
class SettingsViewController: UIViewController {

let sections: [SettingsSection]
var donationCampaign: Mastodon.Entity.DonationCampaign?

weak var delegate: SettingsViewControllerDelegate?
var tableViewDataSource: UITableViewDiffableDataSource<SettingsSection, SettingsEntry>?
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -2,14 +2,18 @@

import Foundation

private let maxCampaignsToRemember = 25
private let dismissedCampaignsKey = "dismissed_donation_campaigns"
private let contributedCampaignsKey = "contributed_donation_campaigns"

extension Mastodon.Entity {

public enum DonationError: Swift.Error {
case campaignInvalid
}

public struct DonationCampaign: Codable {

public enum DonationSource {
case campaign(id: String)
case menu
Expand Down Expand Up @@ -113,5 +117,30 @@ extension Mastodon.Entity {
case donationSuccessPost = "donation_success_post"
case amounts
}

static public func hasPreviouslyDismissed(_ campaign: String) -> Bool {
let ids = UserDefaults.standard.array(forKey: dismissedCampaignsKey) as? [String]
return ids?.contains(campaign) ?? false
}
static public func hasPreviouslyContributed(_ campaign: String) -> Bool {
let ids = UserDefaults.standard.array(forKey: contributedCampaignsKey) as? [String]
return ids?.contains(campaign) ?? false
}
static public func didDismiss(_ campaign: String) {
var ids = UserDefaults.standard.array(forKey: dismissedCampaignsKey) as? [String] ?? []
if ids.count == maxCampaignsToRemember {
ids.removeFirst()
}
ids.append(campaign)
UserDefaults.standard.setValue(ids, forKey: dismissedCampaignsKey)
}
static public func didContribute(_ campaign: String) {
var ids = UserDefaults.standard.array(forKey: contributedCampaignsKey) as? [String] ?? []
if ids.count == maxCampaignsToRemember {
ids.removeFirst()
}
ids.append(campaign)
UserDefaults.standard.setValue(ids, forKey: contributedCampaignsKey)
}
}
}

0 comments on commit ad8561c

Please sign in to comment.