[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index]
[taler-taler-ios] 65/69: Restrictions
From: |
gnunet |
Subject: |
[taler-taler-ios] 65/69: Restrictions |
Date: |
Fri, 19 Jan 2024 09:02:38 +0100 |
This is an automated email from the git hooks/post-receive script.
marc-stibane pushed a commit to branch master
in repository taler-ios.
commit 90c1ac10f9b7236cd98150879def6b00b3064f3c
Author: Marc Stibane <marc@taler.net>
AuthorDate: Fri Jan 19 08:40:51 2024 +0100
Restrictions
---
TalerWallet.xcodeproj/project.pbxproj | 33 ++++++
.../Views/Transactions/ManualDetailsV.swift | 130 ++++++++++++++-------
2 files changed, 121 insertions(+), 42 deletions(-)
diff --git a/TalerWallet.xcodeproj/project.pbxproj
b/TalerWallet.xcodeproj/project.pbxproj
index ce4c031..05619ea 100644
--- a/TalerWallet.xcodeproj/project.pbxproj
+++ b/TalerWallet.xcodeproj/project.pbxproj
@@ -234,6 +234,9 @@
4ED2F94B2A278F5100453B40 /* ThreeAmountsV.swift in Sources */ =
{isa = PBXBuildFile; fileRef = 4ED2F94A2A278F5100453B40 /* ThreeAmountsV.swift
*/; };
4EDBDCD92AB787CB00925C02 /* CallStack.swift in Sources */ =
{isa = PBXBuildFile; fileRef = 4EDBDCD82AB787CB00925C02 /* CallStack.swift */;
};
4EDBDCDA2AB787CB00925C02 /* CallStack.swift in Sources */ =
{isa = PBXBuildFile; fileRef = 4EDBDCD82AB787CB00925C02 /* CallStack.swift */;
};
+ 4EE171882B49635800BF9FF5 /* MarkdownUI in Frameworks */ = {isa
= PBXBuildFile; productRef = 4EE171872B49635800BF9FF5 /* MarkdownUI */; };
+ 4EE171902B49FE2B00BF9FF5 /* OrderedCollections in Frameworks */
= {isa = PBXBuildFile; productRef = 4EE1718F2B49FE2B00BF9FF5 /*
OrderedCollections */; };
+ 4EE171922B49FE4E00BF9FF5 /* OrderedCollections in Frameworks */
= {isa = PBXBuildFile; productRef = 4EE171912B49FE4E00BF9FF5 /*
OrderedCollections */; };
4EEC157329F8242800D46A03 /* QRGeneratorView.swift in Sources */
= {isa = PBXBuildFile; fileRef = 4EEC157229F8242800D46A03 /*
QRGeneratorView.swift */; };
4EEC157629F8ECBF00D46A03 /* CodeScanner in Frameworks */ = {isa
= PBXBuildFile; productRef = 4EEC157529F8ECBF00D46A03 /* CodeScanner */; };
4EEC157829F9032900D46A03 /* Sheet.swift in Sources */ = {isa =
PBXBuildFile; fileRef = 4EEC157729F9032900D46A03 /* Sheet.swift */; };
@@ -427,7 +430,9 @@
4E3EAE772A990778009F1BE8 /* AnyCodable in
Frameworks */,
4E3EAE782A990778009F1BE8 /* SymLog in
Frameworks */,
4E3EAE792A990778009F1BE8 /*
FTalerWalletcore.framework in Frameworks */,
+ 4EE171882B49635800BF9FF5 /* MarkdownUI in
Frameworks */,
4E3EAE7A2A990778009F1BE8 /* taler-swift in
Frameworks */,
+ 4EE171922B49FE4E00BF9FF5 /* OrderedCollections
in Frameworks */,
4E3EAE7B2A990778009F1BE8 /* CodeScanner in
Frameworks */,
);
runOnlyForDeploymentPostprocessing = 0;
@@ -441,6 +446,7 @@
4EB094F829897CA20043A8A1 /*
FTalerWalletcore.framework in Frameworks */,
4E2D8DD32B3F513800234039 /* MarkdownUI in
Frameworks */,
ABC13AA32859962800D23185 /* taler-swift in
Frameworks */,
+ 4EE171902B49FE2B00BF9FF5 /* OrderedCollections
in Frameworks */,
4EEC157629F8ECBF00D46A03 /* CodeScanner in
Frameworks */,
);
runOnlyForDeploymentPostprocessing = 0;
@@ -849,6 +855,8 @@
4E3EAE162A990778009F1BE8 /* AnyCodable */,
4E3EAE182A990778009F1BE8 /* SymLog */,
4E3EAE1A2A990778009F1BE8 /* CodeScanner */,
+ 4EE171872B49635800BF9FF5 /* MarkdownUI */,
+ 4EE171912B49FE4E00BF9FF5 /* OrderedCollections
*/,
);
productName = Taler;
productReference = 4E3EAE892A990778009F1BE8 /*
GNU_Taler.app */;
@@ -874,6 +882,7 @@
4EB094FC29897D280043A8A1 /* SymLog */,
4EEC157529F8ECBF00D46A03 /* CodeScanner */,
4E2D8DD22B3F513800234039 /* MarkdownUI */,
+ 4EE1718F2B49FE2B00BF9FF5 /* OrderedCollections
*/,
);
productName = Taler;
productReference = D14AFD1D24D232B300C51073 /*
Taler_Wallet.app */;
@@ -955,6 +964,7 @@
4EB094FB29897D280043A8A1 /*
XCRemoteSwiftPackageReference "SymLog" */,
4EEC157429F8ECBF00D46A03 /*
XCRemoteSwiftPackageReference "CodeScanner" */,
4E2D8DD12B3F513800234039 /*
XCRemoteSwiftPackageReference "swift-markdown-ui-standalone" */,
+ 4EE1718C2B49EB7200BF9FF5 /*
XCRemoteSwiftPackageReference "swift-collections" */,
);
productRefGroup = D14AFD1E24D232B300C51073 /* Products
*/;
projectDirPath = "";
@@ -1741,6 +1751,14 @@
minimumVersion = 0.1.0;
};
};
+ 4EE1718C2B49EB7200BF9FF5 /* XCRemoteSwiftPackageReference
"swift-collections" */ = {
+ isa = XCRemoteSwiftPackageReference;
+ repositoryURL =
"https://github.com/Fesh-com/swift-collections";
+ requirement = {
+ branch = main;
+ kind = branch;
+ };
+ };
4EEC157429F8ECBF00D46A03 /* XCRemoteSwiftPackageReference
"CodeScanner" */ = {
isa = XCRemoteSwiftPackageReference;
repositoryURL =
"https://github.com/twostraws/CodeScanner";
@@ -1789,6 +1807,21 @@
package = 4EB094FB29897D280043A8A1 /*
XCRemoteSwiftPackageReference "SymLog" */;
productName = SymLog;
};
+ 4EE171872B49635800BF9FF5 /* MarkdownUI */ = {
+ isa = XCSwiftPackageProductDependency;
+ package = 4E2D8DD12B3F513800234039 /*
XCRemoteSwiftPackageReference "swift-markdown-ui-standalone" */;
+ productName = MarkdownUI;
+ };
+ 4EE1718F2B49FE2B00BF9FF5 /* OrderedCollections */ = {
+ isa = XCSwiftPackageProductDependency;
+ package = 4EE1718C2B49EB7200BF9FF5 /*
XCRemoteSwiftPackageReference "swift-collections" */;
+ productName = OrderedCollections;
+ };
+ 4EE171912B49FE4E00BF9FF5 /* OrderedCollections */ = {
+ isa = XCSwiftPackageProductDependency;
+ package = 4EE1718C2B49EB7200BF9FF5 /*
XCRemoteSwiftPackageReference "swift-collections" */;
+ productName = OrderedCollections;
+ };
4EEC157529F8ECBF00D46A03 /* CodeScanner */ = {
isa = XCSwiftPackageProductDependency;
package = 4EEC157429F8ECBF00D46A03 /*
XCRemoteSwiftPackageReference "CodeScanner" */;
diff --git a/TalerWallet1/Views/Transactions/ManualDetailsV.swift
b/TalerWallet1/Views/Transactions/ManualDetailsV.swift
index 97c8575..9099f45 100644
--- a/TalerWallet1/Views/Transactions/ManualDetailsV.swift
+++ b/TalerWallet1/Views/Transactions/ManualDetailsV.swift
@@ -3,6 +3,7 @@
* See LICENSE.md
*/
import SwiftUI
+import OrderedCollections
import taler_swift
struct AccountPicker: View {
@@ -34,6 +35,39 @@ struct AccountPicker: View {
}
}
+struct TransferRestrictionsV: View {
+ let amountStr: String
+ let obtainStr: String
+ let restrictions: [AccountRestriction]?
+
+ @AppStorage("iconOnly") var iconOnly: Bool = false
+
+ @State private var selectedLanguage = Locale.preferredLanguageCode
+
+ var body: some View {
+ VStack(alignment: .leading) {
+ Text(iconOnly ? "Transfer \(amountStr) to the Exchange."
+ : "You need to transfer \(amountStr) from your
regular bank account to the Exchange to receive \(obtainStr) as electronic cash
in this wallet.")
+ .multilineTextAlignment(.leading)
+ if let restrictions {
+ ForEach(restrictions) { restriction in
+ if let hintsI18 = restriction.human_hint_i18n {
+// let sortedDict = OrderedDictionary(uniqueKeys:
hintsI18.keys, values: hintsI18.values)
+// var sorted: OrderedDictionary<String:String>
+ let sortedDict =
OrderedDictionary(uncheckedUniqueKeysWithValues: hintsI18.sorted { $0.key <
$1.key })
+ Picker("Restriction:", selection: $selectedLanguage) {
+ ForEach(sortedDict.keys, id: \.self) {
+ Text(sortedDict[$0] ?? "missing hint")
+ }
+ }
+ } else if let hint = restriction.human_hint {
+ Text(hint)
+ }
+ }
+ }
+ }
+ }
+}
struct ManualDetailsV: View {
var common : TransactionCommon
@@ -52,58 +86,68 @@ struct ManualDetailsV: View {
var body: some View {
if let accountDetails = details.exchangeCreditAccountDetails {
+ if !iconOnly {
+ Text("The Exchange is waiting for your wire-transfer.")
+ .multilineTextAlignment(.leading)
+ .listRowSeparator(.hidden)
+ }
AccountPicker(title: String(localized: "Bank"), value: accountID,
accountDetails: accountDetails, action: redraw)
let account = accountDetails[accountID]
let payto = account.paytoUri
let payURL = URL(string: payto)
let iban = payURL?.iban ?? "unknown IBAN"
- let amountStr = account.transferAmount.readableDescription
// TODO: formatter
+ let amountStr = account.transferAmount.readableDescription
// TODO: formatter?
let obtainStr = common.amountRaw.readableDescription
+
+ let cryptocode = HStack {
+ Text(details.reservePub)
+ .monospacedDigit()
+ .accessibilityLabel("Cryptocode")
+ Spacer()
+ CopyButton(textToCopy: details.reservePub, vertical: true)
+ .accessibilityLabel("Copy the cryptocode")
+ .disabled(false)
+ } .padding(.leading)
+ let ibanCode = HStack {
+ Text(iban)
+ .monospacedDigit()
+ .accessibilityLabel("IBAN of the exchange")
+ Spacer()
+ CopyButton(textToCopy: iban, vertical: true)
+ .accessibilityLabel("Copy the IBAN")
+ .disabled(false)
+ } .padding(.leading)
+ .padding(.top, -8)
+
+ let step1 = Text(iconOnly ? "**Step 1:** Copy+Paste this subject:"
+ : "**Step 1:** Copy this code and paste
it into the subject/purpose field in your banking app or bank website:")
+ .multilineTextAlignment(.leading)
+ let mandatory = Text("This is mandatory, otherwise your money will
not arrive in this wallet.")
+ .bold()
+ .multilineTextAlignment(.leading)
+ .listRowSeparator(.hidden)
+ let step2 = Text(iconOnly ? "**Step 2:** Copy+Paste this IBAN:"
+ : "**Step 2:** If you don't already have
it in your banking favourites list, then copy and paste this IBAN into the
receiver IBAN field in your banking app or website (and save it as favourite
for the next time):")
+ .multilineTextAlignment(.leading)
+ .padding(.top)
+ let step3 = Text(iconOnly ? "**Step 3:** Transfer \(amountStr)."
+ : "**Step 3:** Finish the wire transfer
of \(amountStr) in your banking app or website, then this withdrawal will
proceed automatically.")
+ .multilineTextAlignment(.leading)
+ .padding(.top)
Group {
- Text(iconOnly ? "Transfer \(amountStr) to the Exchange."
- : "You need to transfer \(amountStr) from your
regular bank account to the Exchange to receive \(obtainStr) as electronic cash
in this wallet.")
- Text(iconOnly ? "**Step 1:** Copy+Paste this subject:"
- : "**Step 1:** Copy this code and paste it into
the subject/purpose field in your banking app or bank website:")
- .multilineTextAlignment(.leading)
- .listRowSeparator(.hidden)
+ TransferRestrictionsV(amountStr: amountStr,
+ obtainStr: obtainStr,
+ restrictions: account.creditRestrictions)
+ .listRowSeparator(.visible)
+ step1.listRowSeparator(.hidden)
if !iconOnly {
- Text("This is mandatory, otherwise your money will not
arrive in this wallet.")
- .bold()
- .multilineTextAlignment(.leading)
- .listRowSeparator(.hidden)
+ mandatory
}
- HStack {
- Text(details.reservePub)
- .monospacedDigit()
- .accessibilityLabel("Cryptocode")
- Spacer()
- CopyButton(textToCopy: details.reservePub, vertical: true)
- .accessibilityLabel("Copy the cryptocode")
- .disabled(false)
- } .padding(.leading)
- .listRowSeparator(.hidden)
- Text(iconOnly ? "**Step 2:** Copy+Paste this IBAN:"
- : "**Step 2:** If you don't already have it in
your banking favourites list, then copy and paste this IBAN into the receiver
IBAN field in your banking app or website (and save it as favourite for the
next time):")
- .multilineTextAlignment(.leading)
- .padding(.top)
- .listRowSeparator(.hidden)
- HStack {
- Text(iban)
- .monospacedDigit()
- .accessibilityLabel("IBAN of the exchange")
- Spacer()
- CopyButton(textToCopy: iban, vertical: true)
- .accessibilityLabel("Copy the IBAN")
- .disabled(false)
- } .padding(.leading)
- .padding(.top, -8)
- .listRowSeparator(.hidden)
- Text(iconOnly ? "**Step 3:** Transfer \(amountStr)."
- : "**Step 3:** Finish the wire transfer of
\(amountStr) in your banking app or website, then this withdrawal will proceed
automatically.")
- .multilineTextAlignment(.leading)
- .padding(.top)
- .listRowSeparator(.visible)
+ cryptocode.listRowSeparator(.hidden)
+ step2.listRowSeparator(.hidden)
+ ibanCode.listRowSeparator(.hidden)
+ step3.listRowSeparator(.visible)
Text(iconOnly ? "**Alternative:** Use this PayTo-Link:"
: "**Alternative:** If your bank already
supports PayTo, you can use this PayTo-Link instead:")
.multilineTextAlignment(.leading)
@@ -121,6 +165,8 @@ struct ManualDetailsV: View {
} .listRowSeparator(.automatic)
}.id(listID)
.accessibilityFont(.body)
+ } else {
+ // YIKES No exchangeCreditAccountDetails
}
}
}
--
To stop receiving notification emails like this one, please contact
gnunet@gnunet.org.
- [taler-taler-ios] 49/69: accessibilityDate, (continued)
- [taler-taler-ios] 49/69: accessibilityDate, gnunet, 2024/01/19
- [taler-taler-ios] 46/69: AccountRestriction, gnunet, 2024/01/19
- [taler-taler-ios] 59/69: bugfix, gnunet, 2024/01/19
- [taler-taler-ios] 43/69: currency == ISO 4217, gnunet, 2024/01/19
- [taler-taler-ios] 56/69: remove "code", since "currency" IS ISO-4217 already for global, gnunet, 2024/01/19
- [taler-taler-ios] 58/69: use scopeInfo, gnunet, 2024/01/19
- [taler-taler-ios] 52/69: return to Balances after tx, gnunet, 2024/01/19
- [taler-taler-ios] 33/69: bars relative to fontSize, gnunet, 2024/01/19
- [taler-taler-ios] 63/69: Locale.preferredLanguageCode, gnunet, 2024/01/19
- [taler-taler-ios] 40/69: Exchange -> Banking, gnunet, 2024/01/19
- [taler-taler-ios] 65/69: Restrictions,
gnunet <=
- [taler-taler-ios] 62/69: cleanup, preview, gnunet, 2024/01/19
- [taler-taler-ios] 36/69: b-i-withdrawal hint, gnunet, 2024/01/19
- [taler-taler-ios] 45/69: remove SideBarView, gnunet, 2024/01/19
- [taler-taler-ios] 69/69: Bump version to 0.9.4 (1), gnunet, 2024/01/19
- [taler-taler-ios] 61/69: InfiniteTransactionLoop, gnunet, 2024/01/19
- [taler-taler-ios] 55/69: logging, gnunet, 2024/01/19
- [taler-taler-ios] 42/69: remove payto scheme, gnunet, 2024/01/19
- [taler-taler-ios] 48/69: fix fractions, gnunet, 2024/01/19
- [taler-taler-ios] 66/69: InterfaceOrientation, gnunet, 2024/01/19
- [taler-taler-ios] 41/69: AppIcon blue, gnunet, 2024/01/19