Skip to content

Commit 5475799

Browse files
feat: Tip Jar (#444)
1 parent 4a947a4 commit 5475799

File tree

9 files changed

+763
-33
lines changed

9 files changed

+763
-33
lines changed

swift-paperless.xcodeproj/project.pbxproj

Lines changed: 10 additions & 19 deletions
Original file line numberDiff line numberDiff line change
@@ -18,14 +18,13 @@
1818
7A4D58892D13568900FCB1F1 /* DataModel in Frameworks */ = {isa = PBXBuildFile; productRef = 7A4D58882D13568900FCB1F1 /* DataModel */; };
1919
7A4D588B2D13569500FCB1F1 /* DataModel in Frameworks */ = {isa = PBXBuildFile; productRef = 7A4D588A2D13569500FCB1F1 /* DataModel */; };
2020
7A4D588D2D13569A00FCB1F1 /* DataModel in Frameworks */ = {isa = PBXBuildFile; productRef = 7A4D588C2D13569A00FCB1F1 /* DataModel */; };
21-
7A59C91B2F143239002EC151 /* Common in Frameworks */ = {isa = PBXBuildFile; productRef = 7A59C91A2F143239002EC151 /* Common */; };
22-
7A59C91D2F143239002EC151 /* Networking in Frameworks */ = {isa = PBXBuildFile; productRef = 7A59C91C2F143239002EC151 /* Networking */; };
2321
7A5C138A29AA7E2F00D71F51 /* Semaphore in Frameworks */ = {isa = PBXBuildFile; productRef = 7A5C138929AA7E2F00D71F51 /* Semaphore */; };
2422
7A64771C2BDD50D200217C18 /* libraries.md in Resources */ = {isa = PBXBuildFile; fileRef = 7A64771B2BDD50D200217C18 /* libraries.md */; };
2523
7A68F0B329B4B94B00878223 /* Flow in Frameworks */ = {isa = PBXBuildFile; productRef = 7A68F0B229B4B94B00878223 /* Flow */; };
2624
7A6AA3452C1EDEBE007A1866 /* MarkdownUI in Frameworks */ = {isa = PBXBuildFile; productRef = 7A6AA3442C1EDEBE007A1866 /* MarkdownUI */; };
2725
7A6DA7002D7DD3E900B3B185 /* Networking in Frameworks */ = {isa = PBXBuildFile; productRef = 7A6DA6FF2D7DD3E900B3B185 /* Networking */; };
2826
7A6DA7022D7DD3F000B3B185 /* Networking in Frameworks */ = {isa = PBXBuildFile; productRef = 7A6DA7012D7DD3F000B3B185 /* Networking */; };
27+
7A94EF072F1ECE05005DA431 /* Testing.storekit in Resources */ = {isa = PBXBuildFile; fileRef = 7A94EF062F1ECE05005DA431 /* Testing.storekit */; };
2928
7AAC43182CA06F8D003E6A3A /* AsyncAlgorithms in Frameworks */ = {isa = PBXBuildFile; productRef = 7AAC43172CA06F8D003E6A3A /* AsyncAlgorithms */; };
3029
7AAC44542CA0A37D003E6A3A /* Common in Frameworks */ = {isa = PBXBuildFile; productRef = 7AAC44532CA0A37D003E6A3A /* Common */; };
3130
7AAC44562CA0A38B003E6A3A /* Common in Frameworks */ = {isa = PBXBuildFile; productRef = 7AAC44552CA0A38B003E6A3A /* Common */; };
@@ -40,6 +39,8 @@
4039
7AC40D402D134ED1003F68B1 /* Assets.xcassets in Resources */ = {isa = PBXBuildFile; fileRef = 7AC40C9A2D134ED1003F68B1 /* Assets.xcassets */; };
4140
7AC40D422D134ED1003F68B1 /* PrivacyInfo.xcprivacy in Resources */ = {isa = PBXBuildFile; fileRef = 7AC40CA72D134ED1003F68B1 /* PrivacyInfo.xcprivacy */; };
4241
7AC40DBE2D134ED1003F68B1 /* swift_paperlessApp.swift in Sources */ = {isa = PBXBuildFile; fileRef = 7AC40CA92D134ED1003F68B1 /* swift_paperlessApp.swift */; };
42+
7AEAC2422F1FF4C2004B9D44 /* Swift Paperless.storekit in Resources */ = {isa = PBXBuildFile; fileRef = 7AEAC2412F1FF4C2004B9D44 /* Swift Paperless.storekit */; };
43+
7AEAC2432F1FF4C2004B9D44 /* Swift Paperless.storekit in Resources */ = {isa = PBXBuildFile; fileRef = 7AEAC2412F1FF4C2004B9D44 /* Swift Paperless.storekit */; };
4344
/* End PBXBuildFile section */
4445

4546
/* Begin PBXContainerItemProxy section */
@@ -81,13 +82,15 @@
8182
7A5482C6299AD56E00D5061E /* swift-paperlessUITests.xctest */ = {isa = PBXFileReference; explicitFileType = wrapper.cfbundle; includeInIndex = 0; path = "swift-paperlessUITests.xctest"; sourceTree = BUILT_PRODUCTS_DIR; };
8283
7A64771B2BDD50D200217C18 /* libraries.md */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = net.daringfireball.markdown; name = libraries.md; path = docs/libraries.md; sourceTree = "<group>"; };
8384
7A6DA7212D7DD42100B3B185 /* Networking */ = {isa = PBXFileReference; lastKnownFileType = wrapper; path = Networking; sourceTree = "<group>"; };
85+
7A94EF062F1ECE05005DA431 /* Testing.storekit */ = {isa = PBXFileReference; lastKnownFileType = text; path = Testing.storekit; sourceTree = "<group>"; };
8486
7AAC44512CA0A31E003E6A3A /* Common */ = {isa = PBXFileReference; lastKnownFileType = wrapper; path = Common; sourceTree = "<group>"; };
8587
7ABA3B872E6F3F53006BB39B /* AppIcon.icon */ = {isa = PBXFileReference; lastKnownFileType = folder.iconcomposer.icon; path = AppIcon.icon; sourceTree = "<group>"; };
8688
7AC40C9A2D134ED1003F68B1 /* Assets.xcassets */ = {isa = PBXFileReference; lastKnownFileType = folder.assetcatalog; path = Assets.xcassets; sourceTree = "<group>"; };
8789
7AC40CA42D134ED1003F68B1 /* Info.plist */ = {isa = PBXFileReference; lastKnownFileType = text.plist.xml; path = Info.plist; sourceTree = "<group>"; };
8890
7AC40CA72D134ED1003F68B1 /* PrivacyInfo.xcprivacy */ = {isa = PBXFileReference; lastKnownFileType = text.xml; path = PrivacyInfo.xcprivacy; sourceTree = "<group>"; };
8991
7AC40CA82D134ED1003F68B1 /* swift_paperless.entitlements */ = {isa = PBXFileReference; lastKnownFileType = text.plist.entitlements; path = swift_paperless.entitlements; sourceTree = "<group>"; };
9092
7AC40CA92D134ED1003F68B1 /* swift_paperlessApp.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = swift_paperlessApp.swift; sourceTree = "<group>"; };
93+
7AEAC2412F1FF4C2004B9D44 /* Swift Paperless.storekit */ = {isa = PBXFileReference; lastKnownFileType = text; path = "Swift Paperless.storekit"; sourceTree = "<group>"; };
9194
/* End PBXFileReference section */
9295

9396
/* Begin PBXFileSystemSynchronizedBuildFileExceptionSet section */
@@ -284,15 +287,6 @@
284287
);
285288
runOnlyForDeploymentPostprocessing = 0;
286289
};
287-
7A59BDFE2F129272002EC151 /* Frameworks */ = {
288-
isa = PBXFrameworksBuildPhase;
289-
buildActionMask = 2147483647;
290-
files = (
291-
7A59C91D2F143239002EC151 /* Networking in Frameworks */,
292-
7A59C91B2F143239002EC151 /* Common in Frameworks */,
293-
);
294-
runOnlyForDeploymentPostprocessing = 0;
295-
};
296290
/* End PBXFrameworksBuildPhase section */
297291

298292
/* Begin PBXGroup section */
@@ -347,6 +341,8 @@
347341
7AC40CA72D134ED1003F68B1 /* PrivacyInfo.xcprivacy */,
348342
7AC40CA82D134ED1003F68B1 /* swift_paperless.entitlements */,
349343
7AC40CA92D134ED1003F68B1 /* swift_paperlessApp.swift */,
344+
7A94EF062F1ECE05005DA431 /* Testing.storekit */,
345+
7AEAC2412F1FF4C2004B9D44 /* Swift Paperless.storekit */,
350346
);
351347
path = "swift-paperless";
352348
sourceTree = "<group>";
@@ -553,6 +549,7 @@
553549
7AC40CB62D134ED1003F68B1 /* Assets.xcassets in Resources */,
554550
7ABA3B892E6F3F53006BB39B /* AppIcon.icon in Resources */,
555551
7AC40CB82D134ED1003F68B1 /* PrivacyInfo.xcprivacy in Resources */,
552+
7AEAC2432F1FF4C2004B9D44 /* Swift Paperless.storekit in Resources */,
556553
);
557554
runOnlyForDeploymentPostprocessing = 0;
558555
};
@@ -561,6 +558,8 @@
561558
buildActionMask = 2147483647;
562559
files = (
563560
7AC40D402D134ED1003F68B1 /* Assets.xcassets in Resources */,
561+
7AEAC2422F1FF4C2004B9D44 /* Swift Paperless.storekit in Resources */,
562+
7A94EF072F1ECE05005DA431 /* Testing.storekit in Resources */,
564563
7AC40D422D134ED1003F68B1 /* PrivacyInfo.xcprivacy in Resources */,
565564
7A64771C2BDD50D200217C18 /* libraries.md in Resources */,
566565
7ABA3B882E6F3F53006BB39B /* AppIcon.icon in Resources */,
@@ -1251,14 +1250,6 @@
12511250
isa = XCSwiftPackageProductDependency;
12521251
productName = DataModel;
12531252
};
1254-
7A59C91A2F143239002EC151 /* Common */ = {
1255-
isa = XCSwiftPackageProductDependency;
1256-
productName = Common;
1257-
};
1258-
7A59C91C2F143239002EC151 /* Networking */ = {
1259-
isa = XCSwiftPackageProductDependency;
1260-
productName = Networking;
1261-
};
12621253
7A5C138929AA7E2F00D71F51 /* Semaphore */ = {
12631254
isa = XCSwiftPackageProductDependency;
12641255
package = 7A5C138829AA7E2F00D71F51 /* XCRemoteSwiftPackageReference "Semaphore" */;

swift-paperless.xcodeproj/xcshareddata/xcschemes/swift-paperless.xcscheme

Lines changed: 3 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -57,6 +57,9 @@
5757
isEnabled = "YES">
5858
</EnvironmentVariable>
5959
</EnvironmentVariables>
60+
<StoreKitConfigurationFileReference
61+
identifier = "../../swift-paperless/Testing.storekit">
62+
</StoreKitConfigurationFileReference>
6063
</LaunchAction>
6164
<ProfileAction
6265
buildConfiguration = "Release"

swift-paperless/Localization/Settings.xcstrings

Lines changed: 155 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -2603,6 +2603,161 @@
26032603
}
26042604
}
26052605
},
2606+
"tipJarDescription" : {
2607+
"comment" : "Tip jar description text",
2608+
"extractionState" : "manual",
2609+
"localizations" : {
2610+
"en" : {
2611+
"stringUnit" : {
2612+
"state" : "translated",
2613+
"value" : "Support development with a **one-time tip**! Tips are **optional** and don’t unlock extra features."
2614+
}
2615+
}
2616+
}
2617+
},
2618+
"tipJarLoadError" : {
2619+
"comment" : "Tip jar load error message",
2620+
"extractionState" : "manual",
2621+
"localizations" : {
2622+
"en" : {
2623+
"stringUnit" : {
2624+
"state" : "translated",
2625+
"value" : "Couldn’t load tips right now. Please try again later."
2626+
}
2627+
}
2628+
}
2629+
},
2630+
"tipJarLoading" : {
2631+
"comment" : "Tip jar loading state label",
2632+
"extractionState" : "manual",
2633+
"localizations" : {
2634+
"en" : {
2635+
"stringUnit" : {
2636+
"state" : "translated",
2637+
"value" : "Loading tip options…"
2638+
}
2639+
}
2640+
}
2641+
},
2642+
"tipJarNoProducts" : {
2643+
"comment" : "Tip jar no products label",
2644+
"extractionState" : "manual",
2645+
"localizations" : {
2646+
"en" : {
2647+
"stringUnit" : {
2648+
"state" : "translated",
2649+
"value" : "No tip options are available yet."
2650+
}
2651+
}
2652+
}
2653+
},
2654+
"tipJarOptionsTitle" : {
2655+
"comment" : "Tip jar section title",
2656+
"extractionState" : "manual",
2657+
"localizations" : {
2658+
"en" : {
2659+
"stringUnit" : {
2660+
"state" : "translated",
2661+
"value" : "Choose a tip"
2662+
}
2663+
}
2664+
}
2665+
},
2666+
"tipJarPendingMessage" : {
2667+
"comment" : "Tip jar pending purchase message",
2668+
"extractionState" : "manual",
2669+
"localizations" : {
2670+
"en" : {
2671+
"stringUnit" : {
2672+
"state" : "translated",
2673+
"value" : "Your tip is pending approval from the App Store."
2674+
}
2675+
}
2676+
}
2677+
},
2678+
"tipJarPendingTitle" : {
2679+
"comment" : "Tip jar pending purchase title",
2680+
"extractionState" : "manual",
2681+
"localizations" : {
2682+
"en" : {
2683+
"stringUnit" : {
2684+
"state" : "translated",
2685+
"value" : "Purchase Pending"
2686+
}
2687+
}
2688+
}
2689+
},
2690+
"tipJarPurchaseErrorMessage" : {
2691+
"comment" : "Tip jar purchase error message",
2692+
"extractionState" : "manual",
2693+
"localizations" : {
2694+
"en" : {
2695+
"stringUnit" : {
2696+
"state" : "translated",
2697+
"value" : "The purchase didn’t go through. Please try again later."
2698+
}
2699+
}
2700+
}
2701+
},
2702+
"tipJarPurchaseErrorTitle" : {
2703+
"comment" : "Tip jar purchase error title",
2704+
"extractionState" : "manual",
2705+
"localizations" : {
2706+
"en" : {
2707+
"stringUnit" : {
2708+
"state" : "translated",
2709+
"value" : "Purchase Failed"
2710+
}
2711+
}
2712+
}
2713+
},
2714+
"tipJarThanksMessage" : {
2715+
"comment" : "Tip jar thank you message",
2716+
"extractionState" : "manual",
2717+
"localizations" : {
2718+
"en" : {
2719+
"stringUnit" : {
2720+
"state" : "translated",
2721+
"value" : "Thanks for supporting Swift Paperless!"
2722+
}
2723+
}
2724+
}
2725+
},
2726+
"tipJarThanksTitle" : {
2727+
"comment" : "Tip jar thank you title",
2728+
"extractionState" : "manual",
2729+
"localizations" : {
2730+
"en" : {
2731+
"stringUnit" : {
2732+
"state" : "translated",
2733+
"value" : "Thank You! ❤️"
2734+
}
2735+
}
2736+
}
2737+
},
2738+
"tipJarTipsLabel" : {
2739+
"extractionState" : "manual",
2740+
"localizations" : {
2741+
"en" : {
2742+
"stringUnit" : {
2743+
"state" : "translated",
2744+
"value" : "Tips!"
2745+
}
2746+
}
2747+
}
2748+
},
2749+
"tipJarTitle" : {
2750+
"comment" : "Tip jar navigation title",
2751+
"extractionState" : "manual",
2752+
"localizations" : {
2753+
"en" : {
2754+
"stringUnit" : {
2755+
"state" : "translated",
2756+
"value" : "Tip Jar"
2757+
}
2758+
}
2759+
}
2760+
},
26062761
"title" : {
26072762
"comment" : "Details menu",
26082763
"extractionState" : "manual",
Lines changed: 102 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,102 @@
1+
{
2+
"appPolicies" : {
3+
"eula" : "",
4+
"policies" : [
5+
{
6+
"locale" : "en_US",
7+
"policyText" : "",
8+
"policyURL" : ""
9+
}
10+
]
11+
},
12+
"identifier" : "FEE3F56F",
13+
"nonRenewingSubscriptions" : [
14+
15+
],
16+
"products" : [
17+
{
18+
"displayPrice" : "44.99",
19+
"familyShareable" : false,
20+
"internalID" : "6758055909",
21+
"localizations" : [
22+
{
23+
"description" : "I may tell stories about you",
24+
"displayName" : "Legendary generosity",
25+
"locale" : "en_US"
26+
}
27+
],
28+
"productID" : "tip_xlarge",
29+
"referenceName" : "Extra Large Tip",
30+
"type" : "Consumable"
31+
},
32+
{
33+
"displayPrice" : "17.99",
34+
"familyShareable" : false,
35+
"internalID" : "6758055862",
36+
"localizations" : [
37+
{
38+
"description" : "You’re officially making my day",
39+
"displayName" : "Above and beyond",
40+
"locale" : "en_US"
41+
}
42+
],
43+
"productID" : "tip_large",
44+
"referenceName" : "Large Tip",
45+
"type" : "Consumable"
46+
},
47+
{
48+
"displayPrice" : "8.99",
49+
"familyShareable" : false,
50+
"internalID" : "6758055854",
51+
"localizations" : [
52+
{
53+
"description" : "This genuinely means a lot",
54+
"displayName" : "Proper thank-you",
55+
"locale" : "en_US"
56+
}
57+
],
58+
"productID" : "tip_medium",
59+
"referenceName" : "Medium Tip",
60+
"type" : "Consumable"
61+
},
62+
{
63+
"displayPrice" : "3.99",
64+
"familyShareable" : false,
65+
"internalID" : "6758055849",
66+
"localizations" : [
67+
{
68+
"description" : "Keeps me pleasantly caffeinated",
69+
"displayName" : "Coffee money",
70+
"locale" : "en_US"
71+
}
72+
],
73+
"productID" : "tip_small",
74+
"referenceName" : "Small Tip",
75+
"type" : "Consumable"
76+
}
77+
],
78+
"settings" : {
79+
"_applicationInternalID" : "6448698521",
80+
"_askToBuyEnabled" : false,
81+
"_billingGracePeriodEnabled" : false,
82+
"_billingIssuesEnabled" : false,
83+
"_developerTeamID" : "ZHKJ4NHK6F",
84+
"_disableDialogs" : false,
85+
"_failTransactionsEnabled" : false,
86+
"_lastSynchronizedDate" : 790623950.95388198,
87+
"_locale" : "en_US",
88+
"_renewalBillingIssuesEnabled" : false,
89+
"_storefront" : "USA",
90+
"_storeKitErrors" : [
91+
92+
],
93+
"_timeRate" : 0
94+
},
95+
"subscriptionGroups" : [
96+
97+
],
98+
"version" : {
99+
"major" : 4,
100+
"minor" : 0
101+
}
102+
}

0 commit comments

Comments
 (0)