taler-ios

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

commit d30fe6eae6bd19ffbe710c5f676fb76dcc1c71ff
parent 2fbfa381a92830d15b953ab87da5391981b82005
Author: Marc Stibane <marc@taler.net>
Date:   Sat, 17 Jun 2023 14:54:36 +0200

Preparations for localization + accessability

Diffstat:
MTalerWallet1/Views/Main/MainView.swift | 36++++++++++++++++++++++--------------
MTalerWallet1/Views/Main/SideBarView.swift | 31++++++++-----------------------
2 files changed, 30 insertions(+), 37 deletions(-)

diff --git a/TalerWallet1/Views/Main/MainView.swift b/TalerWallet1/Views/Main/MainView.swift @@ -20,7 +20,7 @@ struct MainView: View { @State private var sheetPresented = false @State private var urlToOpen: URL? = nil - func sheetDismiss() -> Void { + func sheetDismissed() -> Void { symLog.log("sheet dismiss") } var body: some View { @@ -51,7 +51,7 @@ struct MainView: View { DebugViewV() .id("ViewID") } - .sheet(item: $urlToOpen, onDismiss: sheetDismiss) { url in + .sheet(item: $urlToOpen, onDismiss: sheetDismissed) { url in let sheet = AnyView(URLSheet(urlToOpen: url)) Sheet(sheetView: sheet) } @@ -63,25 +63,34 @@ extension MainView { let symLog: SymLogV? @State var sidebarVisible: Bool = false - @State var currentView: Int = 0 + func hamburgerAction() { + sidebarVisible = !sidebarVisible + } + let balances = String(localized: "Balances") + let exchanges = String(localized: "Exchanges") + let settings = String(localized: "Settings") var views: [SidebarItem] {[ - SidebarItem(name: String(localized: "Balances"), + SidebarItem(name: balances, sysImage: "creditcard.fill", // TODO: Wallet Icon - view: AnyView(BalancesListView(model: BalancesModel.model(currency: "*")) - { sidebarVisible = !sidebarVisible } // hamburgerAction + view: AnyView(BalancesListView(navTitle: balances, + model: BalancesModel.model(currency: "*"), + hamburgerAction: hamburgerAction) )), - SidebarItem(name: String(localized: "Exchanges"), + SidebarItem(name: exchanges, sysImage: "building.columns", - view: AnyView(ExchangeListView(model: ExchangeModel.model()) - { sidebarVisible = !sidebarVisible } // hamburgerAction + view: AnyView(ExchangeListView(navTitle: exchanges, + model: ExchangeModel.model(), + hamburgerAction: hamburgerAction) )), - SidebarItem(name: String(localized: "Settings"), // TODO: "About"? + SidebarItem(name: settings, // TODO: "About"? sysImage: "gearshape.fill", - view: AnyView(SettingsView() - { sidebarVisible = !sidebarVisible } // hamburgerAction + view: AnyView(SettingsView(navTitle: settings, + hamburgerAction: hamburgerAction) )) ]} + @State var currentView: Int = 0 + var body: some View { #if DEBUG let _ = Self._printChanges() @@ -89,12 +98,11 @@ extension MainView { #endif ZStack(alignment: .leading) { views[currentView].view - .frame(maxWidth: .infinity, maxHeight: .infinity, alignment: .center) .id(views[currentView].name) + .frame(maxWidth: .infinity, maxHeight: .infinity, alignment: .center) .transition(.backslide) SideBarView(views: views, currentView: $currentView, sidebarVisible: $sidebarVisible) } - .background(WalletColors().backgroundColor) } } } diff --git a/TalerWallet1/Views/Main/SideBarView.swift b/TalerWallet1/Views/Main/SideBarView.swift @@ -22,19 +22,19 @@ struct SideBarView: View { var body: some View { HStack { // sideView left, clear dismiss target right EqualIconWidthDomain { - VStack { - Spacer() + VStack(spacing: 10) { + Text("GNU Taler") + .font(.largeTitle).bold() Image("taler-logo-2023-red") .resizable() .scaledToFit() .frame(width: 100, height: 100) - .padding(.top, 30) + .accessibilityHidden(true) // decorative logo ForEach(0..<views.count, id: \.self) { i in Button { symLog.log("sidebar item \"\(views[i].name)\" selected") sidebarVisible = false // slide sidebar to the left withAnimation(.easeInOut) {currentView = i} // switch to the view the user selected -// withAnimation(.easeInOut(duration: 0.5)) {currentView = i} // switch to the view the user selected } label: { if let sysImage = views[i].sysImage { Label(views[i].name, systemImage: sysImage) @@ -46,35 +46,19 @@ struct SideBarView: View { } .buttonStyle(.bordered) .font(.title) - // .padding(.vertical) + .disabled(i == currentView) + .accessibilityHidden(i == currentView) // don't suggest the current item } Spacer() - Spacer() - Spacer() -// Button { -// symLog.log("Scan QR selected") -// sidebarVisible = false // slide sidebar to the left - // TODO: show scan sheet -// } label: { -// Label("Scan QR", systemImage: "qrcode.viewfinder") -// .frame(maxWidth: sidebarWidth, alignment: .leading) -// } -// .buttonStyle(.bordered) -// .font(.title) -// .padding(.bottom, 26.0) } .background(WalletColors().sideBackground) .frame(width: sidebarWidth, alignment: .center) // TODO: use leading instead of sidebarWidth for right-to-left .offset(x: sidebarVisible ? 0 : -sidebarWidth) - .animation(.easeInOut, value: sidebarVisible) - .ignoresSafeArea() // .onAppear can NOT be used here, because we don't show or dismiss this view, // but only slide it left or right - so it is always there. - // .onAppear {} would be called once even before LaunchScreen is dismissed and then never again - - // this is just a target for a tap gesture outside the sidebar to dismiss it } + // this is just a target for a tap gesture outside the sidebar to dismiss it Color.clear .frame(maxWidth: sidebarVisible ? .infinity : 0, maxHeight: .infinity, alignment: .leading) // TODO: right-to-left ? @@ -84,6 +68,7 @@ struct SideBarView: View { sidebarVisible = false } } + .animation(sidebarVisible ? .easeOut : .easeIn, value: sidebarVisible) } } // MARK: -