taler-ios

iOS apps for GNU Taler (wallet)
Log | Files | Refs | README | LICENSE

commit fda3ca13a0d0320914629761edb230c0407c45bc
parent 0f3a9235c6a31c6814846bba2642d29226f2feae
Author: Marc Stibane <marc@taler.net>
Date:   Sun,  1 Mar 2026 22:12:22 +0100

Accept button in ToS far down in scrollView

Diffstat:
MTalerWallet1/Views/Sheets/WithdrawBankIntegrated/WithdrawTOSView.swift | 76++++++++++++++++++++++++++++++++++++++++++++++++----------------------------
1 file changed, 48 insertions(+), 28 deletions(-)

diff --git a/TalerWallet1/Views/Sheets/WithdrawBankIntegrated/WithdrawTOSView.swift b/TalerWallet1/Views/Sheets/WithdrawBankIntegrated/WithdrawTOSView.swift @@ -1,5 +1,5 @@ /* - * This file is part of GNU Taler, ©2022-25 Taler Systems S.A. + * This file is part of GNU Taler, ©2022-26 Taler Systems S.A. * See LICENSE.md */ /** @@ -56,8 +56,11 @@ struct WithdrawTOSView: View { let languageCode = Locale.preferredLanguageCode // let languageName = Locale.current.localizedString(forLanguageCode: languageCode) if let exchangeTOS, let exchangeBaseUrl { - Content(symLog: symLog, tos: exchangeTOS, myListStyle: $myListStyle, - language: languageCode, languageAction: loadToS) { + Content(symLog: symLog, + tos: exchangeTOS, + myListStyle: $myListStyle, + language: languageCode, + languageAction: loadToS) { Task { await viewDidLoad() } } .navigationTitle(navTitle) @@ -121,29 +124,49 @@ extension WithdrawTOSView { var languageAction: (String) async -> () var acceptAction: () -> () + @Environment(\.colorScheme) private var colorScheme + @Environment(\.colorSchemeContrast) private var colorSchemeContrast +#if DEBUG + @AppStorage("developerMode") var developerMode: Bool = true +#else + @AppStorage("developerMode") var developerMode: Bool = false +#endif @State private var selectedLanguage = Locale.preferredLanguageCode + var showButton: Bool { + if tos.tosStatus == .missingTos { + // TODO: wallet-core should accept receiving money when there are no ToS + return developerMode // no devMode ==> false (don't show button) + } + if let acceptedEtag = tos.acceptedEtag { + if acceptedEtag == tos.currentEtag { + return false // user already accepted current ToS + } + } + return true + } + var body: some View { let title = String(localized: "Language:", comment: "title of ToS language selection") - let list = List { - if tos.tosAvailableLanguages.count > 1 { - Picker(title, selection: $selectedLanguage) { + List { + if tos.tosAvailableLanguages.count > 1 { + Picker(title, selection: $selectedLanguage) { ForEach(tos.tosAvailableLanguages, id: \.self) { code in let languageName = Locale.current.localizedString(forLanguageCode: code) Text(languageName ?? code) + } } - } - .talerFont(.title3) - .pickerStyle(.menu) - .onAppear() { - withAnimation { selectedLanguage = language } - } - .onChange(of: selectedLanguage) { selected in - Task { - await languageAction(selected) + .talerFont(.title3) + .pickerStyle(.menu) + .onAppear() { + withAnimation { selectedLanguage = language } + } + .onChange(of: selectedLanguage) { selected in + Task { + await languageAction(selected) + } } } - } if tos.contentType == MARKDOWN { Section { let content = MarkdownContent(tos.content) @@ -159,21 +182,18 @@ extension WithdrawTOSView { } } // for } // plain text - }.listStyle(myListStyle.style).anyView - - let currentEtag = tos.currentEtag - let showButton = tos.acceptedEtag == nil ? true - : tos.acceptedEtag! == tos.currentEtag ? false - : true - let button = Button(String(localized: "Accept Terms of Service", comment: "Button"), action: acceptAction) + if showButton { + Section { + Button(String(localized: "Accept Terms of Service", comment: "Button"), action: acceptAction) .buttonStyle(TalerButtonStyle(type: .prominent)) .padding(.horizontal) - list.safeAreaInset(edge: .bottom) { - if showButton { - button -// .padding(.bottom, 40) + } header: { + Text("Accept", comment: "Heading for Accept ToS button") + .talerFont(.title3) + .foregroundColor(WalletColors().secondary(colorScheme, colorSchemeContrast)) + } } - } + }.listStyle(myListStyle.style).anyView } } }