diff --git a/Passepartout-iOS/Global/Donation.swift b/Passepartout-iOS/Global/Donation.swift
deleted file mode 100644
index 5eef090e..00000000
--- a/Passepartout-iOS/Global/Donation.swift
+++ /dev/null
@@ -1,49 +0,0 @@
-//
-// Donation.swift
-// Passepartout-iOS
-//
-// Created by Davide De Rosa on 10/11/19.
-// Copyright (c) 2019 Davide De Rosa. All rights reserved.
-//
-// https://github.com/passepartoutvpn
-//
-// This file is part of Passepartout.
-//
-// Passepartout is free software: you can redistribute it and/or modify
-// it under the terms of the GNU General Public License as published by
-// the Free Software Foundation, either version 3 of the License, or
-// (at your option) any later version.
-//
-// Passepartout is distributed in the hope that it will be useful,
-// but WITHOUT ANY WARRANTY; without even the implied warranty of
-// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
-// GNU General Public License for more details.
-//
-// You should have received a copy of the GNU General Public License
-// along with Passepartout. If not, see .
-//
-
-import Foundation
-
-enum Donation: String {
- case tiny = "com.algoritmico.ios.Passepartout.donations.Tiny"
-
- case small = "com.algoritmico.ios.Passepartout.donations.Small"
-
- case medium = "com.algoritmico.ios.Passepartout.donations.Medium"
-
- case big = "com.algoritmico.ios.Passepartout.donations.Big"
-
- case huge = "com.algoritmico.ios.Passepartout.donations.Huge"
-
- case maxi = "com.algoritmico.ios.Passepartout.donations.Maxi"
-
- static let all: [Donation] = [
- .tiny,
- .small,
- .medium,
- .big,
- .huge,
- .maxi
- ]
-}
diff --git a/Passepartout-iOS/Global/Product.swift b/Passepartout-iOS/Global/Product.swift
new file mode 100644
index 00000000..f3ff41cb
--- /dev/null
+++ b/Passepartout-iOS/Global/Product.swift
@@ -0,0 +1,109 @@
+//
+// Product.swift
+// Passepartout-iOS
+//
+// Created by Davide De Rosa on 10/11/19.
+// Copyright (c) 2019 Davide De Rosa. All rights reserved.
+//
+// https://github.com/passepartoutvpn
+//
+// This file is part of Passepartout.
+//
+// Passepartout is free software: you can redistribute it and/or modify
+// it under the terms of the GNU General Public License as published by
+// the Free Software Foundation, either version 3 of the License, or
+// (at your option) any later version.
+//
+// Passepartout is distributed in the hope that it will be useful,
+// but WITHOUT ANY WARRANTY; without even the implied warranty of
+// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+// GNU General Public License for more details.
+//
+// You should have received a copy of the GNU General Public License
+// along with Passepartout. If not, see .
+//
+
+import Foundation
+import PassepartoutCore
+
+enum Product: String {
+
+ // MARK: Donations
+
+ case tinyDonation = "com.algoritmico.ios.Passepartout.donations.Tiny"
+
+ case smallDonation = "com.algoritmico.ios.Passepartout.donations.Small"
+
+ case mediumDonation = "com.algoritmico.ios.Passepartout.donations.Medium"
+
+ case bigDonation = "com.algoritmico.ios.Passepartout.donations.Big"
+
+ case hugeDonation = "com.algoritmico.ios.Passepartout.donations.Huge"
+
+ case maxiDonation = "com.algoritmico.ios.Passepartout.donations.Maxi"
+
+ static let allDonations: [Product] = [
+ .tinyDonation,
+ .smallDonation,
+ .mediumDonation,
+ .bigDonation,
+ .hugeDonation,
+ .maxiDonation
+ ]
+
+ // MARK: Features
+
+ case unlimitedHosts = "com.algoritmico.ios.Passepartout.features.unlimited_hosts"
+
+ case trustedNetworks = "com.algoritmico.ios.Passepartout.features.trusted_networks"
+
+ case siriShortcuts = "com.algoritmico.ios.Passepartout.features.siri"
+
+ case fullVersion = "com.algoritmico.ios.Passepartout.features.full_version"
+
+ static let allFeatures: [Product] = [
+ .unlimitedHosts,
+ .trustedNetworks,
+ .siriShortcuts,
+ .fullVersion
+ ]
+
+ // MARK: Providers
+
+ case mullvad = "com.algoritmico.ios.Passepartout.providers.Mullvad"
+
+ case nordVPN = "com.algoritmico.ios.Passepartout.providers.NordVPN"
+
+ case pia = "com.algoritmico.ios.Passepartout.providers.PIA"
+
+ case protonVPN = "com.algoritmico.ios.Passepartout.providers.ProtonVPN"
+
+ case tunnelBear = "com.algoritmico.ios.Passepartout.providers.TunnelBear"
+
+ case vyprVPN = "com.algoritmico.ios.Passepartout.providers.VyprVPN"
+
+ case windscribe = "com.algoritmico.ios.Passepartout.providers.Windscribe"
+
+ static let allProviders: [Product] = [
+ .mullvad,
+ .nordVPN,
+ .pia,
+ .protonVPN,
+ .tunnelBear,
+ .vyprVPN,
+ .windscribe
+ ]
+
+ // MARK: All
+
+ static let all: [Product] = allDonations + allFeatures + allProviders
+}
+
+extension Infrastructure.Name {
+ var product: Product {
+ guard let product = Product(rawValue: "com.algoritmico.ios.Passepartout.providers.\(rawValue)") else {
+ fatalError("Product not found for provider \(rawValue)")
+ }
+ return product
+ }
+}
diff --git a/Passepartout-iOS/Global/ProductManager.swift b/Passepartout-iOS/Global/ProductManager.swift
index d836ef3a..b2a93a1b 100644
--- a/Passepartout-iOS/Global/ProductManager.swift
+++ b/Passepartout-iOS/Global/ProductManager.swift
@@ -30,7 +30,7 @@ import Convenience
struct ProductManager {
static let shared = ProductManager()
- private let inApp: InApp
+ private let inApp: InApp
private init() {
inApp = InApp()
@@ -41,7 +41,7 @@ struct ProductManager {
completionHandler?(inApp.products)
return
}
- inApp.requestProducts(withIdentifiers: Donation.all) { _ in
+ inApp.requestProducts(withIdentifiers: Product.all) { _ in
completionHandler?(self.inApp.products)
}
}
diff --git a/Passepartout-iOS/Scenes/Organizer/DonationViewController.swift b/Passepartout-iOS/Scenes/Organizer/DonationViewController.swift
index 015d3242..0cdb8359 100644
--- a/Passepartout-iOS/Scenes/Organizer/DonationViewController.swift
+++ b/Passepartout-iOS/Scenes/Organizer/DonationViewController.swift
@@ -29,7 +29,7 @@ import PassepartoutCore
import Convenience
class DonationViewController: UITableViewController, StrongTableHost {
- private var donationList: [Donation] = []
+ private var donationList: [Product] = []
private var productsByIdentifier: [String: SKProduct] = [:]
@@ -62,12 +62,7 @@ class DonationViewController: UITableViewController, StrongTableHost {
return
}
- for row in Donation.all {
- guard let _ = productsByIdentifier[row.rawValue] else {
- continue
- }
- donationList.append(row)
- }
+ donationList.append(contentsOf: Product.allDonations.filter { productsByIdentifier[$0.rawValue] != nil })
model.set(.donation, count: donationList.count, forSection: .oneTime)
if isPurchasing {
diff --git a/Passepartout.xcodeproj/project.pbxproj b/Passepartout.xcodeproj/project.pbxproj
index 39d6ab50..4a7d31b2 100644
--- a/Passepartout.xcodeproj/project.pbxproj
+++ b/Passepartout.xcodeproj/project.pbxproj
@@ -57,7 +57,7 @@
0E3152DB223FA05800F61841 /* ProfileKey.swift in Sources */ = {isa = PBXBuildFile; fileRef = 0E79D14021919F5600BB5FB2 /* ProfileKey.swift */; };
0E3152DC223FA05800F61841 /* ProviderConnectionProfile.swift in Sources */ = {isa = PBXBuildFile; fileRef = 0EBE3AA4213DC1B000BFA2F5 /* ProviderConnectionProfile.swift */; };
0E3262D9235EE8DA00B5E470 /* HostImporter.swift in Sources */ = {isa = PBXBuildFile; fileRef = 0E3262D8235EE8DA00B5E470 /* HostImporter.swift */; };
- 0E3419AD2350815E00419E18 /* Donation.swift in Sources */ = {isa = PBXBuildFile; fileRef = 0E3419AC2350815E00419E18 /* Donation.swift */; };
+ 0E3419AD2350815E00419E18 /* Product.swift in Sources */ = {isa = PBXBuildFile; fileRef = 0E3419AC2350815E00419E18 /* Product.swift */; };
0E3586FE225BD34800509A4D /* ActivityTableViewCell.swift in Sources */ = {isa = PBXBuildFile; fileRef = 0E3586FD225BD34800509A4D /* ActivityTableViewCell.swift */; };
0E36D24D2240234B006AF062 /* ShortcutsAddViewController.swift in Sources */ = {isa = PBXBuildFile; fileRef = 0E36D24C2240234B006AF062 /* ShortcutsAddViewController.swift */; };
0E36D25822403469006AF062 /* Shortcuts.storyboard in Resources */ = {isa = PBXBuildFile; fileRef = 0E36D25A22403469006AF062 /* Shortcuts.storyboard */; };
@@ -180,7 +180,7 @@
0E31529D223F9EF500F61841 /* PassepartoutCore.h */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; path = PassepartoutCore.h; sourceTree = ""; };
0E31529E223F9EF500F61841 /* Info.plist */ = {isa = PBXFileReference; lastKnownFileType = text.plist.xml; path = Info.plist; sourceTree = ""; };
0E3262D8235EE8DA00B5E470 /* HostImporter.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = HostImporter.swift; sourceTree = ""; };
- 0E3419AC2350815E00419E18 /* Donation.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = Donation.swift; sourceTree = ""; };
+ 0E3419AC2350815E00419E18 /* Product.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = Product.swift; sourceTree = ""; };
0E3586FD225BD34800509A4D /* ActivityTableViewCell.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = ActivityTableViewCell.swift; sourceTree = ""; };
0E36D24C2240234B006AF062 /* ShortcutsAddViewController.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = ShortcutsAddViewController.swift; sourceTree = ""; };
0E36D25B224034AD006AF062 /* ShortcutsConnectToViewController.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = ShortcutsConnectToViewController.swift; sourceTree = ""; };
@@ -533,10 +533,10 @@
isa = PBXGroup;
children = (
0E45E6E222BD793800F19312 /* App.strings */,
- 0E3419AC2350815E00419E18 /* Donation.swift */,
0E3262D8235EE8DA00B5E470 /* HostImporter.swift */,
0EFD943D215BE10800529B64 /* IssueReporter.swift */,
0E4FD7F020D58618002221FF /* Macros.swift */,
+ 0E3419AC2350815E00419E18 /* Product.swift */,
0E24273F225951B00064A1A3 /* ProductManager.swift */,
0ECC60DD2256B6890020BEAC /* SwiftGen+Assets.swift */,
0EDE8DE320C89028004C739C /* SwiftGen+Scenes.swift */,
@@ -984,7 +984,7 @@
0EF56BBB2185AC8500B0C8AB /* SwiftGen+Segues.swift in Sources */,
0E05C5D620D1645F006EE732 /* SwiftGen+Scenes.swift in Sources */,
0E773BF8224BF37600CDDC8E /* ShortcutsViewController.swift in Sources */,
- 0E3419AD2350815E00419E18 /* Donation.swift in Sources */,
+ 0E3419AD2350815E00419E18 /* Product.swift in Sources */,
0E9CDB6723604AD5006733B4 /* ServerNetworkViewController.swift in Sources */,
0E3262D9235EE8DA00B5E470 /* HostImporter.swift in Sources */,
0EFD9440215BED8E00529B64 /* LabelViewController.swift in Sources */,