[#764] Modularize batch of leaf features Vol II (#765)

Following features have been modularized:
- BalanceBreakdown
- WalletEventsFlow
- Scan
- ExportLogs
- Settings
- AlertState generic type cleanup
- crashReported TODO added
This commit is contained in:
Lukas Korba 2023-06-08 09:37:05 +02:00 committed by GitHub
parent e3a312ee1a
commit 0d5904e30c
No known key found for this signature in database
GPG Key ID: 4AEE18F83AFDEB23
37 changed files with 539 additions and 406 deletions

View File

@ -12,12 +12,14 @@ let package = Package(
.library(name: "AddressDetails", targets: ["AddressDetails"]),
.library(name: "AppVersion", targets: ["AppVersion"]),
.library(name: "AudioServices", targets: ["AudioServices"]),
.library(name: "BalanceBreakdown", targets: ["BalanceBreakdown"]),
.library(name: "CaptureDevice", targets: ["CaptureDevice"]),
.library(name: "DatabaseFiles", targets: ["DatabaseFiles"]),
.library(name: "Date", targets: ["Date"]),
.library(name: "Deeplink", targets: ["Deeplink"]),
.library(name: "DerivationTool", targets: ["DerivationTool"]),
.library(name: "DiskSpaceChecker", targets: ["DiskSpaceChecker"]),
.library(name: "ExportLogs", targets: ["ExportLogs"]),
.library(name: "FeedbackGenerator", targets: ["FeedbackGenerator"]),
.library(name: "FileManager", targets: ["FileManager"]),
.library(name: "Generated", targets: ["Generated"]),
@ -31,8 +33,10 @@ let package = Package(
.library(name: "RecoveryPhraseDisplay", targets: ["RecoveryPhraseDisplay"]),
.library(name: "RecoveryPhraseValidationFlow", targets: ["RecoveryPhraseValidationFlow"]),
.library(name: "ReviewRequest", targets: ["ReviewRequest"]),
.library(name: "Scan", targets: ["Scan"]),
.library(name: "SDKSynchronizer", targets: ["SDKSynchronizer"]),
.library(name: "SecItem", targets: ["SecItem"]),
.library(name: "Settings", targets: ["Settings"]),
.library(name: "SupportDataGenerator", targets: ["SupportDataGenerator"]),
.library(name: "UIComponents", targets: ["UIComponents"]),
.library(name: "URIParser", targets: ["URIParser"]),
@ -40,6 +44,7 @@ let package = Package(
.library(name: "UserPreferencesStorage", targets: ["UserPreferencesStorage"]),
.library(name: "Utils", targets: ["Utils"]),
.library(name: "WalletConfigProvider", targets: ["WalletConfigProvider"]),
.library(name: "WalletEventsFlow", targets: ["WalletEventsFlow"]),
.library(name: "WalletStorage", targets: ["WalletStorage"]),
.library(name: "Welcome", targets: ["Welcome"]),
.library(name: "ZcashSDKEnvironment", targets: ["ZcashSDKEnvironment"])
@ -78,6 +83,22 @@ let package = Package(
],
path: "Sources/Dependencies/AudioServices"
),
.target(
name: "BalanceBreakdown",
dependencies: [
"Generated",
"DerivationTool",
"MnemonicClient",
"NumberFormatter",
"SDKSynchronizer",
"UIComponents",
"Utils",
"WalletStorage",
.product(name: "ComposableArchitecture", package: "swift-composable-architecture"),
.product(name: "ZcashLightClientKit", package: "ZcashLightClientKit")
],
path: "Sources/Features/BalanceBreakdown"
),
.target(
name: "CaptureDevice",
dependencies: [
@ -128,6 +149,17 @@ let package = Package(
],
path: "Sources/Dependencies/DiskSpaceChecker"
),
.target(
name: "ExportLogs",
dependencies: [
"Generated",
"LogsHandler",
"Utils",
.product(name: "ComposableArchitecture", package: "swift-composable-architecture"),
.product(name: "ZcashLightClientKit", package: "ZcashLightClientKit")
],
path: "Sources/Features/ExportLogs"
),
.target(
name: "FeedbackGenerator",
dependencies: [
@ -244,6 +276,19 @@ let package = Package(
],
path: "Sources/Dependencies/ReviewRequest"
),
.target(
name: "Scan",
dependencies: [
"CaptureDevice",
"Generated",
"URIParser",
"UIComponents",
"Utils",
.product(name: "ComposableArchitecture", package: "swift-composable-architecture"),
.product(name: "ZcashLightClientKit", package: "ZcashLightClientKit")
],
path: "Sources/Features/Scan"
),
.target(
name: "SDKSynchronizer",
dependencies: [
@ -262,6 +307,27 @@ let package = Package(
],
path: "Sources/Dependencies/SecItem"
),
.target(
name: "Settings",
dependencies: [
"AppVersion",
"ExportLogs",
"Generated",
"LocalAuthenticationHandler",
"LogsHandler",
"MnemonicClient",
"Models",
"RecoveryPhraseDisplay",
"SDKSynchronizer",
"SupportDataGenerator",
"UIComponents",
"UserPreferencesStorage",
"WalletStorage",
.product(name: "ComposableArchitecture", package: "swift-composable-architecture"),
.product(name: "ZcashLightClientKit", package: "ZcashLightClientKit")
],
path: "Sources/Features/Settings"
),
.target(
name: "SupportDataGenerator",
dependencies: [
@ -320,6 +386,20 @@ let package = Package(
],
path: "Sources/Dependencies/WalletConfigProvider"
),
.target(
name: "WalletEventsFlow",
dependencies: [
"Generated",
"Models",
"Pasteboard",
"SDKSynchronizer",
"Utils",
"ZcashSDKEnvironment",
.product(name: "ComposableArchitecture", package: "swift-composable-architecture"),
.product(name: "ZcashLightClientKit", package: "ZcashLightClientKit")
],
path: "Sources/Features/WalletEventsFlow"
),
.target(
name: "WalletStorage",
dependencies: [

View File

@ -16,34 +16,49 @@ import Generated
import WalletStorage
import SDKSynchronizer
typealias BalanceBreakdownStore = Store<BalanceBreakdownReducer.State, BalanceBreakdownReducer.Action>
typealias BalanceBreakdownViewStore = ViewStore<BalanceBreakdownReducer.State, BalanceBreakdownReducer.Action>
public typealias BalanceBreakdownStore = Store<BalanceBreakdownReducer.State, BalanceBreakdownReducer.Action>
public typealias BalanceBreakdownViewStore = ViewStore<BalanceBreakdownReducer.State, BalanceBreakdownReducer.Action>
struct BalanceBreakdownReducer: ReducerProtocol {
public struct BalanceBreakdownReducer: ReducerProtocol {
private enum CancelId { case timer }
let networkType: NetworkType
struct State: Equatable {
@PresentationState var alert: AlertState<Action>?
var autoShieldingThreshold: Zatoshi
var latestBlock: String
var shieldedBalance: Balance
var shieldingFunds: Bool
var transparentBalance: Balance
public struct State: Equatable {
@PresentationState public var alert: AlertState<Action>?
public var autoShieldingThreshold: Zatoshi
public var latestBlock: String
public var shieldedBalance: Balance
public var shieldingFunds: Bool
public var transparentBalance: Balance
var totalSpendableBalance: Zatoshi {
public var totalSpendableBalance: Zatoshi {
shieldedBalance.data.verified + transparentBalance.data.verified
}
var isShieldableBalanceAvailable: Bool {
public var isShieldableBalanceAvailable: Bool {
transparentBalance.data.verified.amount >= autoShieldingThreshold.amount
}
var isShieldingButtonDisabled: Bool {
public var isShieldingButtonDisabled: Bool {
shieldingFunds || !isShieldableBalanceAvailable
}
public init(
autoShieldingThreshold: Zatoshi,
latestBlock: String,
shieldedBalance: Balance,
shieldingFunds: Bool,
transparentBalance: Balance
) {
self.autoShieldingThreshold = autoShieldingThreshold
self.latestBlock = latestBlock
self.shieldedBalance = shieldedBalance
self.shieldingFunds = shieldingFunds
self.transparentBalance = transparentBalance
}
}
enum Action: Equatable {
public enum Action: Equatable {
case alert(PresentationAction<Action>)
case onAppear
case onDisappear
@ -61,7 +76,11 @@ struct BalanceBreakdownReducer: ReducerProtocol {
@Dependency(\.sdkSynchronizer) var sdkSynchronizer
@Dependency(\.walletStorage) var walletStorage
var body: some ReducerProtocol<State, Action> {
public init(networkType: NetworkType) {
self.networkType = networkType
}
public var body: some ReducerProtocol<State, Action> {
Reduce { state, action in
switch action {
case .alert:
@ -83,7 +102,7 @@ struct BalanceBreakdownReducer: ReducerProtocol {
do {
let storedWallet = try walletStorage.exportWallet()
let seedBytes = try mnemonic.toSeed(storedWallet.seedPhrase.value())
let spendingKey = try derivationTool.deriveSpendingKey(seedBytes, 0, TargetConstants.zcashNetwork.networkType)
let spendingKey = try derivationTool.deriveSpendingKey(seedBytes, 0, networkType)
_ = try await sdkSynchronizer.shieldFunds(spendingKey, Memo(string: ""), state.autoShieldingThreshold)
@ -121,16 +140,16 @@ struct BalanceBreakdownReducer: ReducerProtocol {
// MARK: Alerts
extension AlertState where Action == BalanceBreakdownReducer.Action {
static func shieldFundsFailure(_ error: ZcashError) -> AlertState<BalanceBreakdownReducer.Action> {
AlertState<BalanceBreakdownReducer.Action> {
public static func shieldFundsFailure(_ error: ZcashError) -> AlertState {
AlertState {
TextState(L10n.BalanceBreakdown.Alert.ShieldFunds.Failure.title)
} message: {
TextState(L10n.BalanceBreakdown.Alert.ShieldFunds.Failure.message(error.message, error.code.rawValue))
}
}
static func shieldFundsSuccess() -> AlertState<BalanceBreakdownReducer.Action> {
AlertState<BalanceBreakdownReducer.Action> {
public static func shieldFundsSuccess() -> AlertState {
AlertState {
TextState(L10n.BalanceBreakdown.Alert.ShieldFunds.Success.title)
} message: {
TextState(L10n.BalanceBreakdown.Alert.ShieldFunds.Success.message)
@ -141,7 +160,7 @@ extension AlertState where Action == BalanceBreakdownReducer.Action {
// MARK: - Placeholders
extension BalanceBreakdownReducer.State {
static let placeholder = BalanceBreakdownReducer.State(
public static let placeholder = BalanceBreakdownReducer.State(
autoShieldingThreshold: Zatoshi(1_000_000),
latestBlock: L10n.General.unknown,
shieldedBalance: Balance.zero,
@ -151,8 +170,8 @@ extension BalanceBreakdownReducer.State {
}
extension BalanceBreakdownStore {
static let placeholder = BalanceBreakdownStore(
public static let placeholder = BalanceBreakdownStore(
initialState: .placeholder,
reducer: BalanceBreakdownReducer()
reducer: BalanceBreakdownReducer(networkType: .testnet)
)
}

View File

@ -9,11 +9,18 @@ import SwiftUI
import ComposableArchitecture
import ZcashLightClientKit
import Generated
import UIComponents
struct BalanceBreakdownView: View {
public struct BalanceBreakdownView: View {
let store: BalanceBreakdownStore
let tokenName: String
var body: some View {
public init(store: BalanceBreakdownStore, tokenName: String) {
self.store = store
self.tokenName = tokenName
}
public var body: some View {
WithViewStore(store) { viewStore in
VStack(alignment: .leading) {
HStack {
@ -25,7 +32,7 @@ struct BalanceBreakdownView: View {
.padding(.vertical, 20)
balanceView(
title: L10n.BalanceBreakdown.shieldedZec(TargetConstants.tokenName),
title: L10n.BalanceBreakdown.shieldedZec(tokenName),
viewStore.shieldedBalance.data.verified,
titleColor: Asset.Colors.Mfp.fontDark.color
)
@ -39,7 +46,7 @@ struct BalanceBreakdownView: View {
Text(
L10n.BalanceBreakdown.autoShieldingThreshold(
viewStore.autoShieldingThreshold.decimalString(),
TargetConstants.tokenName
tokenName
)
)
.foregroundColor(Asset.Colors.Mfp.fontDark.color)
@ -67,7 +74,7 @@ extension BalanceBreakdownView {
Text(
L10n.balance(
balance.decimalString(formatter: NumberFormatter.zcashNumberFormatter8FractionDigits),
TargetConstants.tokenName
tokenName
)
)
.font(.system(size: 32))
@ -101,7 +108,7 @@ extension BalanceBreakdownView {
struct BalanceBreakdown_Previews: PreviewProvider {
static var previews: some View {
BalanceBreakdownView(store: .placeholder)
BalanceBreakdownView(store: .placeholder, tokenName: "ZEC")
.preferredColorScheme(.light)
}
}

View File

@ -13,18 +13,24 @@ import LogsHandler
import Utils
import Generated
typealias ExportLogsStore = Store<ExportLogsReducer.State, ExportLogsReducer.Action>
typealias ExportLogsViewStore = ViewStore<ExportLogsReducer.State, ExportLogsReducer.Action>
public typealias ExportLogsStore = Store<ExportLogsReducer.State, ExportLogsReducer.Action>
public typealias ExportLogsViewStore = ViewStore<ExportLogsReducer.State, ExportLogsReducer.Action>
struct ExportLogsReducer: ReducerProtocol {
struct State: Equatable {
@PresentationState var alert: AlertState<Action>?
var exportLogsDisabled = false
var isSharingLogs = false
var zippedLogsURLs: [URL] = []
public struct ExportLogsReducer: ReducerProtocol {
public struct State: Equatable {
@PresentationState public var alert: AlertState<Action>?
public var exportLogsDisabled = false
public var isSharingLogs = false
public var zippedLogsURLs: [URL] = []
public init(exportLogsDisabled: Bool = false, isSharingLogs: Bool = false, zippedLogsURLs: [URL] = []) {
self.exportLogsDisabled = exportLogsDisabled
self.isSharingLogs = isSharingLogs
self.zippedLogsURLs = zippedLogsURLs
}
}
indirect enum Action: Equatable {
public enum Action: Equatable {
case alert(PresentationAction<Action>)
case start
case finished(URL?)
@ -34,7 +40,9 @@ struct ExportLogsReducer: ReducerProtocol {
@Dependency(\.logsHandler) var logsHandler
var body: some ReducerProtocol<State, Action> {
public init() {}
public var body: some ReducerProtocol<State, Action> {
Reduce { state, action in
switch action {
case .alert:
@ -80,8 +88,8 @@ struct ExportLogsReducer: ReducerProtocol {
// MARK: Alerts
extension AlertState where Action == ExportLogsReducer.Action {
static func failed(_ error: ZcashError) -> AlertState<ExportLogsReducer.Action> {
AlertState<ExportLogsReducer.Action> {
public static func failed(_ error: ZcashError) -> AlertState {
AlertState {
TextState(L10n.ExportLogs.Alert.Failed.title)
} message: {
TextState(L10n.ExportLogs.Alert.Failed.message(error.message, error.code.rawValue))
@ -92,7 +100,7 @@ extension AlertState where Action == ExportLogsReducer.Action {
// MARK: Placeholders
extension ExportLogsReducer.State {
static var placeholder: Self {
public static var placeholder: Self {
.init()
}
}

View File

@ -35,10 +35,15 @@ extension UIShareDialog {
}
}
struct UIShareDialogView: UIViewRepresentable {
let activityItems: [Any]
let completion: () -> Void
public struct UIShareDialogView: UIViewRepresentable {
public let activityItems: [Any]
public let completion: () -> Void
public init(activityItems: [Any], completion: @escaping () -> Void) {
self.activityItems = activityItems
self.completion = completion
}
public func makeUIView(context: UIViewRepresentableContext<UIShareDialogView>) -> UIShareDialog {
let view = UIShareDialog()
view.doInitialSetup(activityItems: activityItems, completion: completion)

View File

@ -13,25 +13,26 @@ import URIParser
import ZcashLightClientKit
import Generated
typealias ScanStore = Store<ScanReducer.State, ScanReducer.Action>
typealias ScanViewStore = ViewStore<ScanReducer.State, ScanReducer.Action>
public typealias ScanStore = Store<ScanReducer.State, ScanReducer.Action>
public typealias ScanViewStore = ViewStore<ScanReducer.State, ScanReducer.Action>
struct ScanReducer: ReducerProtocol {
public struct ScanReducer: ReducerProtocol {
private enum CancelId { case timer }
let networkType: NetworkType
struct State: Equatable {
enum ScanStatus: Equatable {
public struct State: Equatable {
public enum ScanStatus: Equatable {
case failed
case value(RedactableString)
case unknown
}
@PresentationState var alert: AlertState<Action>?
var isTorchAvailable = false
var isTorchOn = false
var scanStatus: ScanStatus = .unknown
@PresentationState public var alert: AlertState<Action>?
public var isTorchAvailable = false
public var isTorchOn = false
public var scanStatus: ScanStatus = .unknown
var scannedValue: String? {
public var scannedValue: String? {
guard case let .value(scannedValue) = scanStatus else {
return nil
}
@ -39,19 +40,29 @@ struct ScanReducer: ReducerProtocol {
return scannedValue.data
}
var isValidValue: Bool {
public var isValidValue: Bool {
if case .value = scanStatus {
return true
}
return false
}
public init(
isTorchAvailable: Bool = false,
isTorchOn: Bool = false,
scanStatus: ScanStatus = .unknown
) {
self.isTorchAvailable = isTorchAvailable
self.isTorchOn = isTorchOn
self.scanStatus = scanStatus
}
}
@Dependency(\.captureDevice) var captureDevice
@Dependency(\.mainQueue) var mainQueue
@Dependency(\.uriParser) var uriParser
enum Action: Equatable {
public enum Action: Equatable {
case alert(PresentationAction<Action>)
case onAppear
case onDisappear
@ -61,8 +72,12 @@ struct ScanReducer: ReducerProtocol {
case torchPressed
}
public init(networkType: NetworkType) {
self.networkType = networkType
}
// swiftlint:disable:next cyclomatic_complexity
var body: some ReducerProtocolOf<Self> {
public var body: some ReducerProtocolOf<Self> {
Reduce { state, action in
switch action {
case .alert:
@ -95,7 +110,7 @@ struct ScanReducer: ReducerProtocol {
if let prevCode = state.scannedValue, prevCode == code.data {
return .none
}
if uriParser.isValidURI(code.data, TargetConstants.zcashNetwork.networkType) {
if uriParser.isValidURI(code.data, networkType) {
state.scanStatus = .value(code)
// once valid URI is scanned we want to start the timer to deliver the code
// any new code cancels the schedule and fires new one
@ -128,8 +143,8 @@ struct ScanReducer: ReducerProtocol {
// MARK: Alerts
extension AlertState where Action == ScanReducer.Action {
static func cantInitializeCamera(_ error: ZcashError) -> AlertState<ScanReducer.Action> {
AlertState<ScanReducer.Action> {
public static func cantInitializeCamera(_ error: ZcashError) -> AlertState {
AlertState {
TextState(L10n.Scan.Alert.CantInitializeCamera.title)
} message: {
TextState(L10n.Scan.Alert.CantInitializeCamera.message(error.message, error.code.rawValue))
@ -140,14 +155,14 @@ extension AlertState where Action == ScanReducer.Action {
// MARK: Placeholders
extension ScanReducer.State {
static var placeholder: Self {
public static var placeholder: Self {
.init()
}
}
extension ScanStore {
static let placeholder = ScanStore(
public static let placeholder = ScanStore(
initialState: .placeholder,
reducer: ScanReducer()
reducer: ScanReducer(networkType: .testnet)
)
}

View File

@ -8,13 +8,18 @@
import SwiftUI
import ComposableArchitecture
import Generated
import UIComponents
struct ScanView: View {
public struct ScanView: View {
@Environment(\.presentationMode) var presentationMode
let store: ScanStore
var body: some View {
public init(store: ScanStore) {
self.store = store
}
public var body: some View {
WithViewStore(store) { viewStore in
GeometryReader { proxy in
ZStack {

View File

@ -10,28 +10,50 @@ import Models
import RecoveryPhraseDisplay
import ZcashLightClientKit
import Generated
import WalletStorage
import SDKSynchronizer
import UserPreferencesStorage
import ExportLogs
typealias SettingsStore = Store<SettingsReducer.State, SettingsReducer.Action>
typealias SettingsViewStore = ViewStore<SettingsReducer.State, SettingsReducer.Action>
public typealias SettingsStore = Store<SettingsReducer.State, SettingsReducer.Action>
public typealias SettingsViewStore = ViewStore<SettingsReducer.State, SettingsReducer.Action>
struct SettingsReducer: ReducerProtocol {
struct State: Equatable {
enum Destination {
public struct SettingsReducer: ReducerProtocol {
public struct State: Equatable {
public enum Destination {
case about
case backupPhrase
}
@PresentationState var alert: AlertState<Action>?
var appVersion = ""
var appBuild = ""
var destination: Destination?
var exportLogsState: ExportLogsReducer.State
@BindingState var isCrashReportingOn: Bool
var phraseDisplayState: RecoveryPhraseDisplayReducer.State
var supportData: SupportData?
@PresentationState public var alert: AlertState<Action>?
public var appVersion = ""
public var appBuild = ""
public var destination: Destination?
public var exportLogsState: ExportLogsReducer.State
@BindingState public var isCrashReportingOn: Bool
public var phraseDisplayState: RecoveryPhraseDisplayReducer.State
public var supportData: SupportData?
public init(
appVersion: String = "",
appBuild: String = "",
destination: Destination? = nil,
exportLogsState: ExportLogsReducer.State,
isCrashReportingOn: Bool,
phraseDisplayState: RecoveryPhraseDisplayReducer.State,
supportData: SupportData? = nil
) {
self.appVersion = appVersion
self.appBuild = appBuild
self.destination = destination
self.exportLogsState = exportLogsState
self.isCrashReportingOn = isCrashReportingOn
self.phraseDisplayState = phraseDisplayState
self.supportData = supportData
}
}
enum Action: BindableAction, Equatable {
public enum Action: BindableAction, Equatable {
case alert(PresentationAction<Action>)
case backupWallet
case backupWalletAccessRequest
@ -51,9 +73,12 @@ struct SettingsReducer: ReducerProtocol {
@Dependency(\.logsHandler) var logsHandler
@Dependency(\.walletStorage) var walletStorage
@Dependency(\.userStoredPreferences) var userStoredPreferences
@Dependency(\.crashReporter) var crashReporter
// TODO: [#747] crashReporter needs a bit of extra work, see https://github.com/zcash/secant-ios-wallet/issues/747
//@Dependency(\.crashReporter) var crashReporter
var body: some ReducerProtocol<State, Action> {
public init() {}
public var body: some ReducerProtocol<State, Action> {
Reduce { state, action in
switch action {
case .onAppear:
@ -81,11 +106,12 @@ struct SettingsReducer: ReducerProtocol {
return .none
case .binding(\.$isCrashReportingOn):
if state.isCrashReportingOn {
crashReporter.optOut()
} else {
crashReporter.optIn()
}
// TODO: [#747] crashReporter needs a bit of extra work, see https://github.com/zcash/secant-ios-wallet/issues/747
// if state.isCrashReportingOn {
// crashReporter.optOut()
// } else {
// crashReporter.optIn()
// }
return .run { [state] _ in
await userStoredPreferences.setIsUserOptedOutOfCrashReporting(state.isCrashReportingOn)
@ -172,16 +198,16 @@ extension SettingsStore {
// MARK: Alerts
extension AlertState where Action == SettingsReducer.Action {
static func cantBackupWallet(_ error: ZcashError) -> AlertState<SettingsReducer.Action> {
AlertState<SettingsReducer.Action> {
public static func cantBackupWallet(_ error: ZcashError) -> AlertState {
AlertState {
TextState(L10n.Settings.Alert.CantBackupWallet.title)
} message: {
TextState(L10n.Settings.Alert.CantBackupWallet.message(error.message, error.code.rawValue))
}
}
static func sendSupportMail() -> AlertState<SettingsReducer.Action> {
AlertState<SettingsReducer.Action> {
public static func sendSupportMail() -> AlertState {
AlertState {
TextState(L10n.Settings.Alert.CantSendEmail.title)
} actions: {
ButtonState(action: .sendSupportMailFinished) {
@ -196,7 +222,7 @@ extension AlertState where Action == SettingsReducer.Action {
// MARK: Placeholders
extension SettingsReducer.State {
static let placeholder = SettingsReducer.State(
public static let placeholder = SettingsReducer.State(
exportLogsState: .placeholder,
isCrashReportingOn: true,
phraseDisplayState: RecoveryPhraseDisplayReducer.State(
@ -206,7 +232,7 @@ extension SettingsReducer.State {
}
extension SettingsStore {
static let placeholder = SettingsStore(
public static let placeholder = SettingsStore(
initialState: .placeholder,
reducer: SettingsReducer()
)

View File

@ -2,11 +2,17 @@ import SwiftUI
import ComposableArchitecture
import Generated
import RecoveryPhraseDisplay
import UIComponents
import ExportLogs
struct SettingsView: View {
public struct SettingsView: View {
let store: SettingsStore
var body: some View {
public init(store: SettingsStore) {
self.store = store
}
public var body: some View {
WithViewStore(store) { viewStore in
VStack(spacing: 40) {
Toggle(

View File

@ -11,8 +11,8 @@ import UIKit
import SwiftUI
import SupportDataGenerator
class UIMailDialog: UIView {
var completion: (() -> Void)?
public class UIMailDialog: UIView {
public var completion: (() -> Void)?
required init?(coder aDecoder: NSCoder) {
super.init(coder: aDecoder)
@ -24,7 +24,7 @@ class UIMailDialog: UIView {
}
extension UIMailDialog {
func doInitialSetup(supportData: SupportData, completion: @escaping () -> Void) {
public func doInitialSetup(supportData: SupportData, completion: @escaping () -> Void) {
self.completion = completion
DispatchQueue.main.async {
let mailVC = MFMailComposeViewController()
@ -50,25 +50,25 @@ extension UIMailDialog {
}
extension UIMailDialog: MFMailComposeViewControllerDelegate {
func mailComposeController(_ controller: MFMailComposeViewController, didFinishWith result: MFMailComposeResult, error: Error?) {
public func mailComposeController(_ controller: MFMailComposeViewController, didFinishWith result: MFMailComposeResult, error: Error?) {
controller.dismiss(animated: true, completion: completion)
}
}
struct UIMailDialogView: UIViewRepresentable {
let supportData: SupportData
let completion: () -> Void
public struct UIMailDialogView: UIViewRepresentable {
public let supportData: SupportData
public let completion: () -> Void
func makeUIView(context: UIViewRepresentableContext<UIMailDialogView>) -> UIMailDialog {
public func makeUIView(context: UIViewRepresentableContext<UIMailDialogView>) -> UIMailDialog {
let view = UIMailDialog()
view.doInitialSetup(supportData: supportData, completion: completion)
return view
}
func updateUIView(_ uiView: UIMailDialog, context: UIViewRepresentableContext<UIMailDialogView>) {
public func updateUIView(_ uiView: UIMailDialog, context: UIViewRepresentableContext<UIMailDialogView>) {
// We can leave it empty here because the view is just handler how to bridge UIKit's UIActivityViewController
// presentation into SwiftUI. The view itself is not visible, only instantiated, therefore no updates needed.
}
typealias UIViewType = UIMailDialog
public typealias UIViewType = UIMailDialog
}

View File

@ -9,10 +9,14 @@ import SwiftUI
import ComposableArchitecture
import Generated
struct About: View {
public struct About: View {
let store: SettingsStore
var body: some View {
public init(store: SettingsStore) {
self.store = store
}
public var body: some View {
WithViewStore(store) { viewStore in
VStack {
Text(L10n.Settings.version(viewStore.appVersion, viewStore.appBuild))

View File

@ -5,8 +5,8 @@ import Utils
import Models
import Generated
struct TransactionDetailView: View {
enum RowMark {
public struct TransactionDetailView: View {
public enum RowMark {
case neutral
case success
case fail
@ -14,10 +14,17 @@ struct TransactionDetailView: View {
case highlight
}
var transaction: TransactionState
var store: WalletEventsFlowStore
var body: some View {
let store: WalletEventsFlowStore
let transaction: TransactionState
let tokenName: String
public init(store: WalletEventsFlowStore, transaction: TransactionState, tokenName: String) {
self.store = store
self.transaction = transaction
self.tokenName = tokenName
}
public var body: some View {
WithViewStore(store) { viewStore in
VStack(alignment: .leading) {
header
@ -26,29 +33,29 @@ struct TransactionDetailView: View {
VStack(alignment: .leading) {
switch transaction.status {
case .paid:
Text(L10n.Transaction.youSent(transaction.zecAmount.decimalString(), TargetConstants.tokenName))
Text(L10n.Transaction.youSent(transaction.zecAmount.decimalString(), tokenName))
.padding()
address(mark: .inactive, viewStore: viewStore)
memo(transaction, viewStore, mark: .highlight)
case .sending:
Text(L10n.Transaction.youAreSending(transaction.zecAmount.decimalString(), TargetConstants.tokenName))
Text(L10n.Transaction.youAreSending(transaction.zecAmount.decimalString(), tokenName))
.padding()
address(mark: .inactive, viewStore: viewStore)
memo(transaction, viewStore, mark: .highlight)
case .receiving:
Text(L10n.Transaction.youAreReceiving(transaction.zecAmount.decimalString(), TargetConstants.tokenName))
Text(L10n.Transaction.youAreReceiving(transaction.zecAmount.decimalString(), tokenName))
.padding()
memo(transaction, viewStore, mark: .highlight)
case .received:
Text(L10n.Transaction.youReceived(transaction.zecAmount.decimalString(), TargetConstants.tokenName))
Text(L10n.Transaction.youReceived(transaction.zecAmount.decimalString(), tokenName))
.padding()
memo(transaction, viewStore, mark: .highlight)
case .failed:
Text(L10n.Transaction.youDidNotSent(transaction.zecAmount.decimalString(), TargetConstants.tokenName))
Text(L10n.Transaction.youDidNotSent(transaction.zecAmount.decimalString(), tokenName))
.padding()
address(mark: .inactive, viewStore: viewStore)
@ -201,6 +208,7 @@ struct TransactionDetail_Previews: PreviewProvider {
static var previews: some View {
NavigationView {
TransactionDetailView(
store: WalletEventsFlowStore.placeholder,
transaction:
TransactionState(
errorMessage: L10n.Error.rollBack,
@ -213,13 +221,14 @@ struct TransactionDetail_Previews: PreviewProvider {
timestamp: 1234567,
zecAmount: Zatoshi(25_000_000)
),
store: WalletEventsFlowStore.placeholder
tokenName: "ZEC"
)
.preferredColorScheme(.light)
}
NavigationView {
TransactionDetailView(
store: WalletEventsFlowStore.placeholder,
transaction:
TransactionState(
errorMessage: L10n.Error.rollBack,
@ -232,13 +241,14 @@ struct TransactionDetail_Previews: PreviewProvider {
timestamp: 1234567,
zecAmount: Zatoshi(25_000_000)
),
store: WalletEventsFlowStore.placeholder
tokenName: "ZEC"
)
.preferredColorScheme(.light)
}
NavigationView {
TransactionDetailView(
store: WalletEventsFlowStore.placeholder,
transaction:
TransactionState(
errorMessage: L10n.Error.rollBack,
@ -251,13 +261,14 @@ struct TransactionDetail_Previews: PreviewProvider {
timestamp: 1234567,
zecAmount: Zatoshi(25_000_000)
),
store: WalletEventsFlowStore.placeholder
tokenName: "ZEC"
)
.preferredColorScheme(.light)
}
NavigationView {
TransactionDetailView(
store: WalletEventsFlowStore.placeholder,
transaction:
TransactionState(
errorMessage: L10n.Error.rollBack,
@ -270,7 +281,7 @@ struct TransactionDetail_Previews: PreviewProvider {
timestamp: 1234567,
zecAmount: Zatoshi(25_000_000)
),
store: WalletEventsFlowStore.placeholder
tokenName: "ZEC"
)
.preferredColorScheme(.light)
}

View File

@ -10,10 +10,16 @@ import ZcashLightClientKit
import Models
import Generated
struct TransactionRowView: View {
var transaction: TransactionState
public struct TransactionRowView: View {
let transaction: TransactionState
let tokenName: String
public init(transaction: TransactionState, tokenName: String) {
self.transaction = transaction
self.tokenName = tokenName
}
var body: some View {
public var body: some View {
ZStack {
icon
@ -35,7 +41,7 @@ struct TransactionRowView: View {
Text(transaction.unarySymbol)
.font(.system(size: 16))
.foregroundColor(Asset.Colors.Mfp.fontDark.color)
+ Text(L10n.balance(transaction.zecAmount.decimalString(), TargetConstants.tokenName))
+ Text(L10n.balance(transaction.zecAmount.decimalString(), tokenName))
.font(.system(size: 16))
.foregroundColor(Asset.Colors.Mfp.fontDark.color)
}
@ -111,7 +117,8 @@ struct TransactionRowView_Previews: PreviewProvider {
status: .paid(success: true),
timestamp: 1234567,
zecAmount: Zatoshi(123_000_000)
)
),
tokenName: "ZEC"
)
.applyScreenBackground()
.previewLayout(.fixed(width: 428, height: 60))
@ -125,7 +132,8 @@ struct TransactionRowView_Previews: PreviewProvider {
status: .failed,
timestamp: 1234567,
zecAmount: Zatoshi(123_000_000)
)
),
tokenName: "ZEC"
)
.applyScreenBackground()
.previewLayout(.fixed(width: 428, height: 60))
@ -139,7 +147,8 @@ struct TransactionRowView_Previews: PreviewProvider {
status: .sending,
timestamp: 1234567,
zecAmount: Zatoshi(123_000_000)
)
),
tokenName: "ZEC"
)
.applyScreenBackground()
.previewLayout(.fixed(width: 428, height: 60))
@ -153,7 +162,8 @@ struct TransactionRowView_Previews: PreviewProvider {
status: .received,
timestamp: 1234567,
zecAmount: Zatoshi(123_000_000)
)
),
tokenName: "ZEC"
)
.applyScreenBackground()
.previewLayout(.fixed(width: 428, height: 60))

View File

@ -14,10 +14,10 @@ import ZcashLightClientKit
// MARK: - Rows
extension WalletEvent {
@ViewBuilder func rowView(_ viewStore: WalletEventsFlowViewStore) -> some View {
@ViewBuilder public func rowView(_ viewStore: WalletEventsFlowViewStore, tokenName: String) -> some View {
switch state {
case .transaction(let transaction):
TransactionRowView(transaction: transaction)
TransactionRowView(transaction: transaction, tokenName: tokenName)
case .shielded(let zatoshi):
// TODO: [#390] implement design once shielding is supported
// https://github.com/zcash/secant-ios-wallet/issues/390
@ -35,10 +35,10 @@ extension WalletEvent {
// MARK: - Details
extension WalletEvent {
@ViewBuilder func detailView(_ store: WalletEventsFlowStore) -> some View {
@ViewBuilder public func detailView(_ store: WalletEventsFlowStore, tokenName: String) -> some View {
switch state {
case .transaction(let transaction):
TransactionDetailView(transaction: transaction, store: store)
TransactionDetailView(store: store, transaction: transaction, tokenName: tokenName)
case .shielded(let zatoshi):
// TODO: [#390] implement design once shielding is supported
// https://github.com/zcash/secant-ios-wallet/issues/390
@ -75,8 +75,8 @@ private extension WalletEvent {
}
extension IdentifiedArrayOf where Element == WalletEvent {
static var placeholder: IdentifiedArrayOf<WalletEvent> {
return .init(
public static var placeholder: IdentifiedArrayOf<WalletEvent> {
.init(
uniqueElements: (0..<30).map {
WalletEvent(
id: String($0),

View File

@ -4,30 +4,49 @@ import ZcashLightClientKit
import Utils
import Models
import Generated
import Pasteboard
import SDKSynchronizer
import ZcashSDKEnvironment
typealias WalletEventsFlowStore = Store<WalletEventsFlowReducer.State, WalletEventsFlowReducer.Action>
typealias WalletEventsFlowViewStore = ViewStore<WalletEventsFlowReducer.State, WalletEventsFlowReducer.Action>
public typealias WalletEventsFlowStore = Store<WalletEventsFlowReducer.State, WalletEventsFlowReducer.Action>
public typealias WalletEventsFlowViewStore = ViewStore<WalletEventsFlowReducer.State, WalletEventsFlowReducer.Action>
struct WalletEventsFlowReducer: ReducerProtocol {
public struct WalletEventsFlowReducer: ReducerProtocol {
private enum CancelId { case timer }
struct State: Equatable {
enum Destination: Equatable {
public struct State: Equatable {
public enum Destination: Equatable {
case latest
case all
case showWalletEvent(WalletEvent)
}
@PresentationState var alert: AlertState<Action>?
var destination: Destination?
var latestMinedHeight: BlockHeight?
var isScrollable = true
var requiredTransactionConfirmations = 0
var walletEvents = IdentifiedArrayOf<WalletEvent>.placeholder
var selectedWalletEvent: WalletEvent?
@PresentationState public var alert: AlertState<Action>?
public var destination: Destination?
public var latestMinedHeight: BlockHeight?
public var isScrollable = true
public var requiredTransactionConfirmations = 0
public var walletEvents = IdentifiedArrayOf<WalletEvent>.placeholder
public var selectedWalletEvent: WalletEvent?
public init(
destination: Destination? = nil,
latestMinedHeight: BlockHeight? = nil,
isScrollable: Bool = true,
requiredTransactionConfirmations: Int = 0,
walletEvents: IdentifiedArrayOf<WalletEvent> = .placeholder,
selectedWalletEvent: WalletEvent? = nil
) {
self.destination = destination
self.latestMinedHeight = latestMinedHeight
self.isScrollable = isScrollable
self.requiredTransactionConfirmations = requiredTransactionConfirmations
self.walletEvents = walletEvents
self.selectedWalletEvent = selectedWalletEvent
}
}
enum Action: Equatable {
public enum Action: Equatable {
case alert(PresentationAction<Action>)
case copyToPastboard(RedactableString)
case dismissAlert
@ -46,8 +65,10 @@ struct WalletEventsFlowReducer: ReducerProtocol {
@Dependency(\.sdkSynchronizer) var sdkSynchronizer
@Dependency(\.zcashSDKEnvironment) var zcashSDKEnvironment
public init() {}
// swiftlint:disable:next cyclomatic_complexity
func reduce(into state: inout State, action: Action) -> ComposableArchitecture.EffectTask<Action> {
public func reduce(into state: inout State, action: Action) -> ComposableArchitecture.EffectTask<Action> {
switch action {
case .onAppear:
state.requiredTransactionConfirmations = zcashSDKEnvironment.requiredTransactionConfirmations
@ -148,8 +169,8 @@ extension WalletEventsFlowViewStore {
// MARK: Alerts
extension AlertState where Action == WalletEventsFlowReducer.Action {
static func warnBeforeLeavingApp(_ blockExplorerURL: URL?) -> AlertState<WalletEventsFlowReducer.Action> {
AlertState<WalletEventsFlowReducer.Action> {
public static func warnBeforeLeavingApp(_ blockExplorerURL: URL?) -> AlertState {
AlertState {
TextState(L10n.WalletEvent.Alert.LeavingApp.title)
} actions: {
ButtonState(action: .openBlockExplorer(blockExplorerURL)) {
@ -167,7 +188,7 @@ extension AlertState where Action == WalletEventsFlowReducer.Action {
// MARK: Placeholders
extension TransactionState {
static var placeholder: Self {
public static var placeholder: Self {
.init(
zAddress: "t1gXqfSSQt6WfpwyuCU3Wi7sSVZ66DYQ3Po",
fee: Zatoshi(10),
@ -178,7 +199,7 @@ extension TransactionState {
)
}
static func statePlaceholder(_ status: Status) -> Self {
public static func statePlaceholder(_ status: Status) -> Self {
.init(
zAddress: "t1gXqfSSQt6WfpwyuCU3Wi7sSVZ66DYQ3Po",
fee: Zatoshi(10),
@ -191,17 +212,17 @@ extension TransactionState {
}
extension WalletEventsFlowReducer.State {
static var placeHolder: Self {
public static var placeHolder: Self {
.init(walletEvents: .placeholder)
}
static var emptyPlaceHolder: Self {
public static var emptyPlaceHolder: Self {
.init(walletEvents: [])
}
}
extension WalletEventsFlowStore {
static var placeholder: Store<WalletEventsFlowReducer.State, WalletEventsFlowReducer.Action> {
public static var placeholder: Store<WalletEventsFlowReducer.State, WalletEventsFlowReducer.Action> {
return Store(
initialState: .placeHolder,
reducer: WalletEventsFlowReducer()
@ -211,7 +232,7 @@ extension WalletEventsFlowStore {
}
extension IdentifiedArrayOf where Element == TransactionState {
static var placeholder: IdentifiedArrayOf<TransactionState> {
public static var placeholder: IdentifiedArrayOf<TransactionState> {
return .init(
uniqueElements: (0..<30).map {
TransactionState(

View File

@ -2,10 +2,16 @@ import SwiftUI
import ComposableArchitecture
import Generated
struct WalletEventsFlowView: View {
public struct WalletEventsFlowView: View {
let store: WalletEventsFlowStore
let tokenName: String
var body: some View {
public init(store: WalletEventsFlowStore, tokenName: String) {
self.store = store
self.tokenName = tokenName
}
public var body: some View {
WithViewStore(store) { viewStore in
List {
walletEventsList(with: viewStore)
@ -15,7 +21,7 @@ struct WalletEventsFlowView: View {
.onAppear { viewStore.send(.onAppear) }
.onDisappear(perform: { viewStore.send(.onDisappear) })
.navigationLinkEmpty(isActive: viewStore.bindingForSelectedWalletEvent(viewStore.selectedWalletEvent)) {
viewStore.selectedWalletEvent?.detailView(store)
viewStore.selectedWalletEvent?.detailView(store, tokenName: tokenName)
}
}
.alert(store: store.scope(
@ -28,7 +34,7 @@ struct WalletEventsFlowView: View {
extension WalletEventsFlowView {
func walletEventsList(with viewStore: WalletEventsFlowViewStore) -> some View {
ForEach(viewStore.walletEvents) { walletEvent in
walletEvent.rowView(viewStore)
walletEvent.rowView(viewStore, tokenName: tokenName)
.onTapGesture {
viewStore.send(.updateDestination(.showWalletEvent(walletEvent)))
}
@ -43,7 +49,7 @@ extension WalletEventsFlowView {
struct TransactionView_Previews: PreviewProvider {
static var previews: some View {
NavigationView {
WalletEventsFlowView(store: .placeholder)
WalletEventsFlowView(store: .placeholder, tokenName: "ZEC")
.preferredColorScheme(.light)
}
}

View File

@ -8,7 +8,7 @@
import SwiftUI
extension View {
func disable(when isDisabled: Bool, dimmingOpacity: Double) -> some View {
public func disable(when isDisabled: Bool, dimmingOpacity: Double) -> some View {
self.modifier(
DisableWithOpacity(isDisabled: isDisabled, opacity: dimmingOpacity)
)

View File

@ -14,15 +14,12 @@
0D26AE9D299E8196005260EE /* CrashReporterTestKey.swift in Sources */ = {isa = PBXBuildFile; fileRef = 0D26103F298C406F00CC9DE9 /* CrashReporterTestKey.swift */; };
0D26AEA0299E8196005260EE /* SandboxStore.swift in Sources */ = {isa = PBXBuildFile; fileRef = 9EAFEB8E2808183D00199FC9 /* SandboxStore.swift */; };
0D26AEA5299E8196005260EE /* TransactionSendingView.swift in Sources */ = {isa = PBXBuildFile; fileRef = 34DA414628E4385800F8CC61 /* TransactionSendingView.swift */; };
0D26AEA6299E8196005260EE /* WalletEventsFlowView.swift in Sources */ = {isa = PBXBuildFile; fileRef = F96B41E6273B501F0021B49A /* WalletEventsFlowView.swift */; };
0D26AEAA299E8196005260EE /* CrashReporterLiveKey.swift in Sources */ = {isa = PBXBuildFile; fileRef = 0D26103D298C3FA600CC9DE9 /* CrashReporterLiveKey.swift */; };
0D26AEAC299E8196005260EE /* TCATextField.swift in Sources */ = {isa = PBXBuildFile; fileRef = 2EDA079F27EDE18C00D6F09B /* TCATextField.swift */; };
0D26AEAF299E8196005260EE /* TransactionAmountTextFieldStore.swift in Sources */ = {isa = PBXBuildFile; fileRef = 2EB7758627FC67FD00269373 /* TransactionAmountTextFieldStore.swift */; };
0D26AEB1299E8196005260EE /* AppDelegate.swift in Sources */ = {isa = PBXBuildFile; fileRef = 9EF8135F27F043CC0075AF48 /* AppDelegate.swift */; };
0D26AEB5299E8196005260EE /* TransactionDetailView.swift in Sources */ = {isa = PBXBuildFile; fileRef = F96B41E5273B501F0021B49A /* TransactionDetailView.swift */; };
0D26AEBC299E8196005260EE /* TCATextFieldStore.swift in Sources */ = {isa = PBXBuildFile; fileRef = 2EB1C5E727D77F6100BC43D7 /* TCATextFieldStore.swift */; };
0D26AEBF299E8196005260EE /* TransactionFailedView.swift in Sources */ = {isa = PBXBuildFile; fileRef = 9E5BF640281FD7B600BA3F17 /* TransactionFailedView.swift */; };
0D26AEC2299E8196005260EE /* TransactionRowView.swift in Sources */ = {isa = PBXBuildFile; fileRef = 9EAB46792861EA6A002904A0 /* TransactionRowView.swift */; };
0D26AEC4299E8196005260EE /* TCALogging.swift in Sources */ = {isa = PBXBuildFile; fileRef = 9E0F5740297E7F1C005304FA /* TCALogging.swift */; };
0D26AEC6299E8196005260EE /* ImportWalletView.swift in Sources */ = {isa = PBXBuildFile; fileRef = 9E2DF99B27CF704D00649636 /* ImportWalletView.swift */; };
0D26AEC7299E8196005260EE /* RootInitialization.swift in Sources */ = {isa = PBXBuildFile; fileRef = 9E9ADA7C2938F4C00071767B /* RootInitialization.swift */; };
@ -35,7 +32,6 @@
0D26AEE7299E8196005260EE /* TransactionAddressTextFieldStore.swift in Sources */ = {isa = PBXBuildFile; fileRef = 9E5BF64E2823E94900BA3F17 /* TransactionAddressTextFieldStore.swift */; };
0D26AEE9299E8196005260EE /* WithStateBinding.swift in Sources */ = {isa = PBXBuildFile; fileRef = F9EEB8152742C2210032EEB8 /* WithStateBinding.swift */; };
0D26AEEB299E8196005260EE /* Previews.swift in Sources */ = {isa = PBXBuildFile; fileRef = F93673D52742CB840099C6AF /* Previews.swift */; };
0D26AEEE299E8196005260EE /* QRCodeScanView.swift in Sources */ = {isa = PBXBuildFile; fileRef = 9E7FE0F82832824C00C374E8 /* QRCodeScanView.swift */; };
0D26AEF0299E8196005260EE /* TCALoggerReducer.swift in Sources */ = {isa = PBXBuildFile; fileRef = 9E0F5742297EB96C005304FA /* TCALoggerReducer.swift */; };
0D26AEF2299E8196005260EE /* MultipleLineTextField.swift in Sources */ = {isa = PBXBuildFile; fileRef = 9E7225F2288AB6DD00DF7F17 /* MultipleLineTextField.swift */; };
0D26AEF3299E8196005260EE /* NotEnoughFreeSpaceView.swift in Sources */ = {isa = PBXBuildFile; fileRef = 3448CB3128E47666006ADEDB /* NotEnoughFreeSpaceView.swift */; };
@ -44,18 +40,15 @@
0D26AEFC299E8196005260EE /* RootStore.swift in Sources */ = {isa = PBXBuildFile; fileRef = F9971A4A27680DC400A2DB75 /* RootStore.swift */; };
0D26AEFD299E8196005260EE /* HomeView.swift in Sources */ = {isa = PBXBuildFile; fileRef = F93874EF273C4DE200F0E875 /* HomeView.swift */; };
0D26AEFF299E8196005260EE /* SandboxView.swift in Sources */ = {isa = PBXBuildFile; fileRef = 9EAFEB8D2808183D00199FC9 /* SandboxView.swift */; };
0D26AF05299E8196005260EE /* ScanView.swift in Sources */ = {isa = PBXBuildFile; fileRef = F9971A5D27680DF600A2DB75 /* ScanView.swift */; };
0D26AF07299E8196005260EE /* RootView.swift in Sources */ = {isa = PBXBuildFile; fileRef = F9971A4C27680DC400A2DB75 /* RootView.swift */; };
0D26AF0A299E8196005260EE /* OnboardingFooterView.swift in Sources */ = {isa = PBXBuildFile; fileRef = 2EA11F5A27467EF800709571 /* OnboardingFooterView.swift */; };
0D26AF0E299E8196005260EE /* MultiLineTextFieldStore.swift in Sources */ = {isa = PBXBuildFile; fileRef = 9E7225F5288AC71A00DF7F17 /* MultiLineTextFieldStore.swift */; };
0D26AF0F299E8196005260EE /* DebugFrame.swift in Sources */ = {isa = PBXBuildFile; fileRef = 2EDA07A327EDE2A900D6F09B /* DebugFrame.swift */; };
0D26AF11299E8196005260EE /* LottieAnimation.swift in Sources */ = {isa = PBXBuildFile; fileRef = 9E6612322878338C00C75B70 /* LottieAnimation.swift */; };
0D26AF18299E8196005260EE /* WalletEventsFlowStore.swift in Sources */ = {isa = PBXBuildFile; fileRef = F96B41E3273B501F0021B49A /* WalletEventsFlowStore.swift */; };
0D26AF1B299E8196005260EE /* HomeStore.swift in Sources */ = {isa = PBXBuildFile; fileRef = F93874ED273C4DE200F0E875 /* HomeStore.swift */; };
0D26AF20299E8196005260EE /* UInt+SuperscriptText.swift in Sources */ = {isa = PBXBuildFile; fileRef = 0DACFA8027208D940039EEA5 /* UInt+SuperscriptText.swift */; };
0D26AF23299E8196005260EE /* SendFlowStore.swift in Sources */ = {isa = PBXBuildFile; fileRef = F9C165B72740403600592F76 /* SendFlowStore.swift */; };
0D26AF24299E8196005260EE /* SecantApp.swift in Sources */ = {isa = PBXBuildFile; fileRef = 0D4E7A0826B364170058B01E /* SecantApp.swift */; };
0D26AF37299E8196005260EE /* ScanUIView.swift in Sources */ = {isa = PBXBuildFile; fileRef = 9E7FE0F528327F6F00C374E8 /* ScanUIView.swift */; };
0D26AF3A299E8196005260EE /* OnboardingContentView.swift in Sources */ = {isa = PBXBuildFile; fileRef = 2EA11F5C27467F7700709571 /* OnboardingContentView.swift */; };
0D26AF3B299E8196005260EE /* CircularProgress.swift in Sources */ = {isa = PBXBuildFile; fileRef = 9E7CB6142869E8C300A02233 /* CircularProgress.swift */; };
0D26AF3C299E8196005260EE /* OnboardingHeaderView.swift in Sources */ = {isa = PBXBuildFile; fileRef = 2E58E73A274679F000B2B84B /* OnboardingHeaderView.swift */; };
@ -68,12 +61,9 @@
0D26AF47299E8196005260EE /* CreateTransactionView.swift in Sources */ = {isa = PBXBuildFile; fileRef = F9C165BB2740403600592F76 /* CreateTransactionView.swift */; };
0D26AF4B299E8196005260EE /* TextFieldTitleAccessoryButtonStyle.swift in Sources */ = {isa = PBXBuildFile; fileRef = 2E35F99927B3E99C00EB79CD /* TextFieldTitleAccessoryButtonStyle.swift */; };
0D26AF4D299E8196005260EE /* ImportWalletStore.swift in Sources */ = {isa = PBXBuildFile; fileRef = 9E2DF99827CF704D00649636 /* ImportWalletStore.swift */; };
0D26AF4F299E8196005260EE /* SettingsView.swift in Sources */ = {isa = PBXBuildFile; fileRef = F9971A6427680DFE00A2DB75 /* SettingsView.swift */; };
0D26AF53299E8196005260EE /* TextFieldFooter.swift in Sources */ = {isa = PBXBuildFile; fileRef = 2EDA07A127EDE1AE00D6F09B /* TextFieldFooter.swift */; };
0D26AF54299E8196005260EE /* CrashReporterInterface.swift in Sources */ = {isa = PBXBuildFile; fileRef = 0D26103B298C3E4800CC9DE9 /* CrashReporterInterface.swift */; };
0D26AF56299E8196005260EE /* ScanStore.swift in Sources */ = {isa = PBXBuildFile; fileRef = F9971A5E27680DF600A2DB75 /* ScanStore.swift */; };
0D26AF5F299E8196005260EE /* SendFlowView.swift in Sources */ = {isa = PBXBuildFile; fileRef = F9C165CA2741AB5D00592F76 /* SendFlowView.swift */; };
0D26AF64299E8196005260EE /* SettingsStore.swift in Sources */ = {isa = PBXBuildFile; fileRef = F9971A6227680DFE00A2DB75 /* SettingsStore.swift */; };
0D26AF65299E8196005260EE /* InitializationState.swift in Sources */ = {isa = PBXBuildFile; fileRef = 9EF8139B27F47AED0075AF48 /* InitializationState.swift */; };
0D26AF68299E8196005260EE /* TransactionAmountTextField.swift in Sources */ = {isa = PBXBuildFile; fileRef = 2E8719CA27FB09990082C926 /* TransactionAmountTextField.swift */; };
0D26AF6A299E8196005260EE /* ClearBackgroundView.swift in Sources */ = {isa = PBXBuildFile; fileRef = 9E6713F9289BE0E100A6796F /* ClearBackgroundView.swift */; };
@ -90,14 +80,11 @@
0D26AF84299E8196005260EE /* Preview Assets.xcassets in Resources */ = {isa = PBXBuildFile; fileRef = 0D4E7A0F26B364180058B01E /* Preview Assets.xcassets */; };
0D26AF88299E8196005260EE /* LaunchScreen.storyboard in Resources */ = {isa = PBXBuildFile; fileRef = 9E2F1C8B280ED6A7004E65FE /* LaunchScreen.storyboard */; };
0D26AF8C299E8196005260EE /* GoogleService-Info.plist in Resources */ = {isa = PBXBuildFile; fileRef = 0D3B01EB298DAF89007EBCDA /* GoogleService-Info.plist */; };
0D3016B529BF94D1002371B3 /* Button+Disabling.swift in Sources */ = {isa = PBXBuildFile; fileRef = 0D3016B429BF94D1002371B3 /* Button+Disabling.swift */; };
0D3016B629BF94D1002371B3 /* Button+Disabling.swift in Sources */ = {isa = PBXBuildFile; fileRef = 0D3016B429BF94D1002371B3 /* Button+Disabling.swift */; };
0D3016B829BFB2FB002371B3 /* PlainOnboardingView.swift in Sources */ = {isa = PBXBuildFile; fileRef = 0D3016B729BFB2FB002371B3 /* PlainOnboardingView.swift */; };
0D3016B929BFB2FB002371B3 /* PlainOnboardingView.swift in Sources */ = {isa = PBXBuildFile; fileRef = 0D3016B729BFB2FB002371B3 /* PlainOnboardingView.swift */; };
0D3B01EC298DAF89007EBCDA /* GoogleService-Info.plist in Resources */ = {isa = PBXBuildFile; fileRef = 0D3B01EB298DAF89007EBCDA /* GoogleService-Info.plist */; };
0D4E7A0926B364170058B01E /* SecantApp.swift in Sources */ = {isa = PBXBuildFile; fileRef = 0D4E7A0826B364170058B01E /* SecantApp.swift */; };
0D4E7A1026B364180058B01E /* Preview Assets.xcassets in Resources */ = {isa = PBXBuildFile; fileRef = 0D4E7A0F26B364180058B01E /* Preview Assets.xcassets */; };
0D573CB629C106E900B97379 /* About.swift in Sources */ = {isa = PBXBuildFile; fileRef = 9E4AA4F729BF76BB00752BB3 /* About.swift */; };
0D5D9B8F2914620700DBD03F /* URLRouting in Frameworks */ = {isa = PBXBuildFile; productRef = 0D5D9B8E2914620700DBD03F /* URLRouting */; };
0DACFA8127208D940039EEA5 /* UInt+SuperscriptText.swift in Sources */ = {isa = PBXBuildFile; fileRef = 0DACFA8027208D940039EEA5 /* UInt+SuperscriptText.swift */; };
0DB8AA81271DC7520035BC9D /* DesignGuide.swift in Sources */ = {isa = PBXBuildFile; fileRef = 0DB8AA80271DC7520035BC9D /* DesignGuide.swift */; };
@ -117,14 +104,8 @@
2EDA07A427EDE2A900D6F09B /* DebugFrame.swift in Sources */ = {isa = PBXBuildFile; fileRef = 2EDA07A327EDE2A900D6F09B /* DebugFrame.swift */; };
3448CB3228E47666006ADEDB /* NotEnoughFreeSpaceView.swift in Sources */ = {isa = PBXBuildFile; fileRef = 3448CB3128E47666006ADEDB /* NotEnoughFreeSpaceView.swift */; };
346715A528E2027D0035F7C4 /* CheckCircleStore.swift in Sources */ = {isa = PBXBuildFile; fileRef = 346715A428E2027D0035F7C4 /* CheckCircleStore.swift */; };
346731A229AE3A5100974482 /* UIMailDialog.swift in Sources */ = {isa = PBXBuildFile; fileRef = 346731A129AE3A5100974482 /* UIMailDialog.swift */; };
346731A329AE3A5100974482 /* UIMailDialog.swift in Sources */ = {isa = PBXBuildFile; fileRef = 346731A129AE3A5100974482 /* UIMailDialog.swift */; };
346D41E428DF0B8600963F36 /* CheckCircle.swift in Sources */ = {isa = PBXBuildFile; fileRef = 346D41E328DF0B8600963F36 /* CheckCircle.swift */; };
34BF09092927C98000222134 /* Memo+toString.swift in Sources */ = {isa = PBXBuildFile; fileRef = 34BF09082927C98000222134 /* Memo+toString.swift */; };
34C5658229B60C1C002F3A7C /* UIShareDialog.swift in Sources */ = {isa = PBXBuildFile; fileRef = 34C5658129B60C1C002F3A7C /* UIShareDialog.swift */; };
34C5658329B60C1C002F3A7C /* UIShareDialog.swift in Sources */ = {isa = PBXBuildFile; fileRef = 34C5658129B60C1C002F3A7C /* UIShareDialog.swift */; };
34C5658529B60C8B002F3A7C /* ExportLogsStore.swift in Sources */ = {isa = PBXBuildFile; fileRef = 34C5658429B60C8B002F3A7C /* ExportLogsStore.swift */; };
34C5658629B60C8B002F3A7C /* ExportLogsStore.swift in Sources */ = {isa = PBXBuildFile; fileRef = 34C5658429B60C8B002F3A7C /* ExportLogsStore.swift */; };
34CE032B29C0938600A6626B /* ZcashLightClientKit in Frameworks */ = {isa = PBXBuildFile; productRef = 34CE032A29C0938600A6626B /* ZcashLightClientKit */; };
34DA414728E4385800F8CC61 /* TransactionSendingView.swift in Sources */ = {isa = PBXBuildFile; fileRef = 34DA414628E4385800F8CC61 /* TransactionSendingView.swift */; };
34DA414928E439CD00F8CC61 /* sendingTransaction.json in Resources */ = {isa = PBXBuildFile; fileRef = 34DA414828E439CD00F8CC61 /* sendingTransaction.json */; };
@ -176,12 +157,8 @@
9E0031B82A27724D003DFCEB /* WalletStorage in Frameworks */ = {isa = PBXBuildFile; productRef = 9E0031B72A27724D003DFCEB /* WalletStorage */; };
9E0031BA2A2878EE003DFCEB /* AddressDetails in Frameworks */ = {isa = PBXBuildFile; productRef = 9E0031B92A2878EE003DFCEB /* AddressDetails */; };
9E0031BC2A2878F3003DFCEB /* AddressDetails in Frameworks */ = {isa = PBXBuildFile; productRef = 9E0031BB2A2878F3003DFCEB /* AddressDetails */; };
9E0031C02A28B221003DFCEB /* BalanceBreakdownStore.swift in Sources */ = {isa = PBXBuildFile; fileRef = 9E0031BE2A28B221003DFCEB /* BalanceBreakdownStore.swift */; };
9E0031C12A28B221003DFCEB /* BalanceBreakdownView.swift in Sources */ = {isa = PBXBuildFile; fileRef = 9E0031BF2A28B221003DFCEB /* BalanceBreakdownView.swift */; };
9E0031C32A28BB92003DFCEB /* RecoveryPhraseDisplay in Frameworks */ = {isa = PBXBuildFile; productRef = 9E0031C22A28BB92003DFCEB /* RecoveryPhraseDisplay */; };
9E0031C52A28BB97003DFCEB /* RecoveryPhraseDisplay in Frameworks */ = {isa = PBXBuildFile; productRef = 9E0031C42A28BB97003DFCEB /* RecoveryPhraseDisplay */; };
9E0031C62A28BD54003DFCEB /* BalanceBreakdownStore.swift in Sources */ = {isa = PBXBuildFile; fileRef = 9E0031BE2A28B221003DFCEB /* BalanceBreakdownStore.swift */; };
9E0031C72A28BD54003DFCEB /* BalanceBreakdownView.swift in Sources */ = {isa = PBXBuildFile; fileRef = 9E0031BF2A28B221003DFCEB /* BalanceBreakdownView.swift */; };
9E0310B52A24A4CA0021F995 /* FileManager in Frameworks */ = {isa = PBXBuildFile; productRef = 9E0310B42A24A4CA0021F995 /* FileManager */; };
9E0310C52A24A4E60021F995 /* FileManager in Frameworks */ = {isa = PBXBuildFile; productRef = 9E0310C42A24A4E60021F995 /* FileManager */; };
9E0F5741297E7F1D005304FA /* TCALogging.swift in Sources */ = {isa = PBXBuildFile; fileRef = 9E0F5740297E7F1C005304FA /* TCALogging.swift */; };
@ -250,7 +227,6 @@
9E486DF429B9EEC4003E6945 /* UIResponder+Current.swift in Sources */ = {isa = PBXBuildFile; fileRef = 9E486DF229B9EEC4003E6945 /* UIResponder+Current.swift */; };
9E486DF929BA09C2003E6945 /* UIKit+Extensions.swift in Sources */ = {isa = PBXBuildFile; fileRef = 9E486DF829BA09C2003E6945 /* UIKit+Extensions.swift */; };
9E486DFA29BA09C2003E6945 /* UIKit+Extensions.swift in Sources */ = {isa = PBXBuildFile; fileRef = 9E486DF829BA09C2003E6945 /* UIKit+Extensions.swift */; };
9E4AA4F829BF76BB00752BB3 /* About.swift in Sources */ = {isa = PBXBuildFile; fileRef = 9E4AA4F729BF76BB00752BB3 /* About.swift */; };
9E5452682A28D5500098B887 /* Welcome in Frameworks */ = {isa = PBXBuildFile; productRef = 9E5452672A28D5500098B887 /* Welcome */; };
9E54526A2A28D5570098B887 /* Welcome in Frameworks */ = {isa = PBXBuildFile; productRef = 9E5452692A28D5570098B887 /* Welcome */; };
9E54526C2A28DA4B0098B887 /* Profile in Frameworks */ = {isa = PBXBuildFile; productRef = 9E54526B2A28DA4B0098B887 /* Profile */; };
@ -267,14 +243,10 @@
9E7225F6288AC71A00DF7F17 /* MultiLineTextFieldStore.swift in Sources */ = {isa = PBXBuildFile; fileRef = 9E7225F5288AC71A00DF7F17 /* MultiLineTextFieldStore.swift */; };
9E74CCD029DC0628003D6E32 /* ReviewRequestTests.swift in Sources */ = {isa = PBXBuildFile; fileRef = 9E74CCCF29DC0628003D6E32 /* ReviewRequestTests.swift */; };
9E7CB6152869E8C300A02233 /* CircularProgress.swift in Sources */ = {isa = PBXBuildFile; fileRef = 9E7CB6142869E8C300A02233 /* CircularProgress.swift */; };
9E7FE0F628327F6F00C374E8 /* ScanUIView.swift in Sources */ = {isa = PBXBuildFile; fileRef = 9E7FE0F528327F6F00C374E8 /* ScanUIView.swift */; };
9E7FE0F92832824C00C374E8 /* QRCodeScanView.swift in Sources */ = {isa = PBXBuildFile; fileRef = 9E7FE0F82832824C00C374E8 /* QRCodeScanView.swift */; };
9E80C44C2A25E8EC0049E6A7 /* MnemonicClient in Frameworks */ = {isa = PBXBuildFile; productRef = 9E80C44B2A25E8EC0049E6A7 /* MnemonicClient */; };
9E80C4522A25E8FA0049E6A7 /* MnemonicClient in Frameworks */ = {isa = PBXBuildFile; productRef = 9E80C4512A25E8FA0049E6A7 /* MnemonicClient */; };
9E852D6129B098F400CF4AC1 /* RootDebug.swift in Sources */ = {isa = PBXBuildFile; fileRef = 9E852D6029B098F400CF4AC1 /* RootDebug.swift */; };
9E852D6229B098F400CF4AC1 /* RootDebug.swift in Sources */ = {isa = PBXBuildFile; fileRef = 9E852D6029B098F400CF4AC1 /* RootDebug.swift */; };
9E9074FF2A260FE400269308 /* WalletEvent+View.swift in Sources */ = {isa = PBXBuildFile; fileRef = 9E9074FE2A260FE400269308 /* WalletEvent+View.swift */; };
9E9075002A260FE400269308 /* WalletEvent+View.swift in Sources */ = {isa = PBXBuildFile; fileRef = 9E9074FE2A260FE400269308 /* WalletEvent+View.swift */; };
9E9075022A2681F700269308 /* Generated in Frameworks */ = {isa = PBXBuildFile; productRef = 9E9075012A2681F700269308 /* Generated */; };
9E9075042A2681FF00269308 /* Generated in Frameworks */ = {isa = PBXBuildFile; productRef = 9E9075032A2681FF00269308 /* Generated */; };
9E9075062A2689D600269308 /* RecoveryPhraseValidationFlow in Frameworks */ = {isa = PBXBuildFile; productRef = 9E9075052A2689D600269308 /* RecoveryPhraseValidationFlow */; };
@ -289,23 +261,25 @@
9E9ADA7F2938F5EC0071767B /* RootDestination.swift in Sources */ = {isa = PBXBuildFile; fileRef = 9E9ADA7E2938F5EC0071767B /* RootDestination.swift */; };
9E9CEA3E29D47BE000599DF5 /* OnChangeReducer.swift in Sources */ = {isa = PBXBuildFile; fileRef = 9E9CEA3D29D47BE000599DF5 /* OnChangeReducer.swift */; };
9EAB466D285A0468002904A0 /* Parsing in Frameworks */ = {isa = PBXBuildFile; productRef = 9EAB466C285A0468002904A0 /* Parsing */; };
9EAB467A2861EA6A002904A0 /* TransactionRowView.swift in Sources */ = {isa = PBXBuildFile; fileRef = 9EAB46792861EA6A002904A0 /* TransactionRowView.swift */; };
9EAFEB8F2808183D00199FC9 /* SandboxView.swift in Sources */ = {isa = PBXBuildFile; fileRef = 9EAFEB8D2808183D00199FC9 /* SandboxView.swift */; };
9EAFEB902808183D00199FC9 /* SandboxStore.swift in Sources */ = {isa = PBXBuildFile; fileRef = 9EAFEB8E2808183D00199FC9 /* SandboxStore.swift */; };
9EAFEB9128081E9400199FC9 /* HomeStore.swift in Sources */ = {isa = PBXBuildFile; fileRef = F93874ED273C4DE200F0E875 /* HomeStore.swift */; };
9EAFEB9228081E9400199FC9 /* HomeView.swift in Sources */ = {isa = PBXBuildFile; fileRef = F93874EF273C4DE200F0E875 /* HomeView.swift */; };
9EE5926D2A2DDF94007147CD /* BalanceBreakdown in Frameworks */ = {isa = PBXBuildFile; productRef = 9EE5926C2A2DDF94007147CD /* BalanceBreakdown */; };
9EE5926F2A2DDF98007147CD /* BalanceBreakdown in Frameworks */ = {isa = PBXBuildFile; productRef = 9EE5926E2A2DDF98007147CD /* BalanceBreakdown */; };
9EE592712A2DF202007147CD /* WalletEventsFlow in Frameworks */ = {isa = PBXBuildFile; productRef = 9EE592702A2DF202007147CD /* WalletEventsFlow */; };
9EE592732A2DF207007147CD /* WalletEventsFlow in Frameworks */ = {isa = PBXBuildFile; productRef = 9EE592722A2DF207007147CD /* WalletEventsFlow */; };
9EE592752A2DF7D8007147CD /* Scan in Frameworks */ = {isa = PBXBuildFile; productRef = 9EE592742A2DF7D8007147CD /* Scan */; };
9EE592772A2DF7DD007147CD /* Scan in Frameworks */ = {isa = PBXBuildFile; productRef = 9EE592762A2DF7DD007147CD /* Scan */; };
9EE592792A2E027F007147CD /* ExportLogs in Frameworks */ = {isa = PBXBuildFile; productRef = 9EE592782A2E027F007147CD /* ExportLogs */; };
9EE5927B2A2E0284007147CD /* Settings in Frameworks */ = {isa = PBXBuildFile; productRef = 9EE5927A2A2E0284007147CD /* Settings */; };
9EE5927D2A2E0288007147CD /* ExportLogs in Frameworks */ = {isa = PBXBuildFile; productRef = 9EE5927C2A2E0288007147CD /* ExportLogs */; };
9EE5927F2A2E028D007147CD /* Settings in Frameworks */ = {isa = PBXBuildFile; productRef = 9EE5927E2A2E028D007147CD /* Settings */; };
9EF8136027F043CC0075AF48 /* AppDelegate.swift in Sources */ = {isa = PBXBuildFile; fileRef = 9EF8135F27F043CC0075AF48 /* AppDelegate.swift */; };
9EF8139C27F47AED0075AF48 /* InitializationState.swift in Sources */ = {isa = PBXBuildFile; fileRef = 9EF8139B27F47AED0075AF48 /* InitializationState.swift */; };
F93673D62742CB840099C6AF /* Previews.swift in Sources */ = {isa = PBXBuildFile; fileRef = F93673D52742CB840099C6AF /* Previews.swift */; };
F96B41E7273B501F0021B49A /* WalletEventsFlowStore.swift in Sources */ = {isa = PBXBuildFile; fileRef = F96B41E3273B501F0021B49A /* WalletEventsFlowStore.swift */; };
F96B41E8273B501F0021B49A /* TransactionDetailView.swift in Sources */ = {isa = PBXBuildFile; fileRef = F96B41E5273B501F0021B49A /* TransactionDetailView.swift */; };
F96B41E9273B501F0021B49A /* WalletEventsFlowView.swift in Sources */ = {isa = PBXBuildFile; fileRef = F96B41E6273B501F0021B49A /* WalletEventsFlowView.swift */; };
F9971A4D27680DC400A2DB75 /* RootStore.swift in Sources */ = {isa = PBXBuildFile; fileRef = F9971A4A27680DC400A2DB75 /* RootStore.swift */; };
F9971A4E27680DC400A2DB75 /* RootView.swift in Sources */ = {isa = PBXBuildFile; fileRef = F9971A4C27680DC400A2DB75 /* RootView.swift */; };
F9971A5F27680DF600A2DB75 /* ScanView.swift in Sources */ = {isa = PBXBuildFile; fileRef = F9971A5D27680DF600A2DB75 /* ScanView.swift */; };
F9971A6027680DF600A2DB75 /* ScanStore.swift in Sources */ = {isa = PBXBuildFile; fileRef = F9971A5E27680DF600A2DB75 /* ScanStore.swift */; };
F9971A6527680DFE00A2DB75 /* SettingsStore.swift in Sources */ = {isa = PBXBuildFile; fileRef = F9971A6227680DFE00A2DB75 /* SettingsStore.swift */; };
F9971A6627680DFE00A2DB75 /* SettingsView.swift in Sources */ = {isa = PBXBuildFile; fileRef = F9971A6427680DFE00A2DB75 /* SettingsView.swift */; };
F9C165BF2740403600592F76 /* SendFlowStore.swift in Sources */ = {isa = PBXBuildFile; fileRef = F9C165B72740403600592F76 /* SendFlowStore.swift */; };
F9C165C22740403600592F76 /* CreateTransactionView.swift in Sources */ = {isa = PBXBuildFile; fileRef = F9C165BB2740403600592F76 /* CreateTransactionView.swift */; };
F9C165C42740403600592F76 /* TransactionSentView.swift in Sources */ = {isa = PBXBuildFile; fileRef = F9C165BD2740403600592F76 /* TransactionSentView.swift */; };
@ -336,7 +310,6 @@
0D26103D298C3FA600CC9DE9 /* CrashReporterLiveKey.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = CrashReporterLiveKey.swift; sourceTree = "<group>"; };
0D26103F298C406F00CC9DE9 /* CrashReporterTestKey.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = CrashReporterTestKey.swift; sourceTree = "<group>"; };
0D26AF94299E8196005260EE /* secant-mainnet.app */ = {isa = PBXFileReference; explicitFileType = wrapper.application; includeInIndex = 0; path = "secant-mainnet.app"; sourceTree = BUILT_PRODUCTS_DIR; };
0D3016B429BF94D1002371B3 /* Button+Disabling.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = "Button+Disabling.swift"; sourceTree = "<group>"; };
0D3016B729BFB2FB002371B3 /* PlainOnboardingView.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = PlainOnboardingView.swift; sourceTree = "<group>"; };
0D3B01EB298DAF89007EBCDA /* GoogleService-Info.plist */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = text.plist.xml; path = "GoogleService-Info.plist"; sourceTree = "<group>"; };
0D4E7A0526B364170058B01E /* secant-testnet.app */ = {isa = PBXFileReference; explicitFileType = wrapper.application; includeInIndex = 0; path = "secant-testnet.app"; sourceTree = BUILT_PRODUCTS_DIR; };
@ -374,20 +347,15 @@
3448CB3128E47666006ADEDB /* NotEnoughFreeSpaceView.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = NotEnoughFreeSpaceView.swift; sourceTree = "<group>"; };
3448CB3628E485CB006ADEDB /* NotEnoughFeeSpaceSnapshots.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = NotEnoughFeeSpaceSnapshots.swift; sourceTree = "<group>"; };
346715A428E2027D0035F7C4 /* CheckCircleStore.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = CheckCircleStore.swift; sourceTree = "<group>"; };
346731A129AE3A5100974482 /* UIMailDialog.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = UIMailDialog.swift; sourceTree = "<group>"; };
3469F18129ACD70500A07146 /* OnboardingFlowFeatureFlagTests.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = OnboardingFlowFeatureFlagTests.swift; sourceTree = "<group>"; };
346D41E328DF0B8600963F36 /* CheckCircle.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = CheckCircle.swift; sourceTree = "<group>"; };
34BF09082927C98000222134 /* Memo+toString.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = "Memo+toString.swift"; sourceTree = "<group>"; };
34C5658129B60C1C002F3A7C /* UIShareDialog.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = UIShareDialog.swift; sourceTree = "<group>"; };
34C5658429B60C8B002F3A7C /* ExportLogsStore.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = ExportLogsStore.swift; sourceTree = "<group>"; };
34DA414628E4385800F8CC61 /* TransactionSendingView.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = TransactionSendingView.swift; sourceTree = "<group>"; };
34DA414828E439CD00F8CC61 /* sendingTransaction.json */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = text.json; path = sendingTransaction.json; sourceTree = "<group>"; };
34F039B229ABCE8500CF0053 /* WalletConfigProviderTests.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = WalletConfigProviderTests.swift; sourceTree = "<group>"; };
6654C73D2715A41300901167 /* OnboardingFlowStore.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = OnboardingFlowStore.swift; sourceTree = "<group>"; };
6654C7432715A4AC00901167 /* OnboardingStoreTests.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = OnboardingStoreTests.swift; sourceTree = "<group>"; };
66A0807A271993C500118B79 /* OnboardingProgressIndicator.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = OnboardingProgressIndicator.swift; sourceTree = "<group>"; };
9E0031BE2A28B221003DFCEB /* BalanceBreakdownStore.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = BalanceBreakdownStore.swift; sourceTree = "<group>"; };
9E0031BF2A28B221003DFCEB /* BalanceBreakdownView.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = BalanceBreakdownView.swift; sourceTree = "<group>"; };
9E01F8272833CDA0000EFC57 /* ScanTests.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = ScanTests.swift; sourceTree = "<group>"; };
9E02B56B27FED475005B809B /* DatabaseFilesTests.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = DatabaseFilesTests.swift; sourceTree = "<group>"; };
9E0F5740297E7F1C005304FA /* TCALogging.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = TCALogging.swift; sourceTree = "<group>"; };
@ -408,7 +376,6 @@
9E486DEF29B9EE84003E6945 /* KeyboardAdaptive.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = KeyboardAdaptive.swift; sourceTree = "<group>"; };
9E486DF229B9EEC4003E6945 /* UIResponder+Current.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = "UIResponder+Current.swift"; sourceTree = "<group>"; };
9E486DF829BA09C2003E6945 /* UIKit+Extensions.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = "UIKit+Extensions.swift"; sourceTree = "<group>"; };
9E4AA4F729BF76BB00752BB3 /* About.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = About.swift; sourceTree = "<group>"; };
9E5BF63E2819542C00BA3F17 /* WalletEventsTests.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = WalletEventsTests.swift; sourceTree = "<group>"; };
9E5BF640281FD7B600BA3F17 /* TransactionFailedView.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = TransactionFailedView.swift; sourceTree = "<group>"; };
9E5BF643281FEC9900BA3F17 /* SendTests.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = SendTests.swift; sourceTree = "<group>"; };
@ -429,12 +396,9 @@
9E7CB6142869E8C300A02233 /* CircularProgress.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = CircularProgress.swift; sourceTree = "<group>"; };
9E7CB6232874246800A02233 /* ProfileTests.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = ProfileTests.swift; sourceTree = "<group>"; };
9E7CB6262874269F00A02233 /* ProfileSnapshotTests.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = ProfileSnapshotTests.swift; sourceTree = "<group>"; };
9E7FE0F528327F6F00C374E8 /* ScanUIView.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = ScanUIView.swift; sourceTree = "<group>"; };
9E7FE0F82832824C00C374E8 /* QRCodeScanView.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = QRCodeScanView.swift; sourceTree = "<group>"; };
9E852D5B29AF8EB200CF4AC1 /* RecoveryPhraseValidationFlowFeatureFlagTests.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = RecoveryPhraseValidationFlowFeatureFlagTests.swift; sourceTree = "<group>"; };
9E852D6029B098F400CF4AC1 /* RootDebug.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = RootDebug.swift; sourceTree = "<group>"; };
9E852D6429B0A86300CF4AC1 /* DebugTests.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = DebugTests.swift; sourceTree = "<group>"; };
9E9074FE2A260FE400269308 /* WalletEvent+View.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = "WalletEvent+View.swift"; sourceTree = "<group>"; };
9E90751D2A269BE300269308 /* Assets.xcassets */ = {isa = PBXFileReference; lastKnownFileType = folder.assetcatalog; path = Assets.xcassets; sourceTree = "<group>"; };
9E92AF0728530EBF007367AD /* View+UIImage.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = "View+UIImage.swift"; sourceTree = "<group>"; };
9E94C61F28AA7DEE008256E9 /* BalanceBreakdownTests.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = BalanceBreakdownTests.swift; sourceTree = "<group>"; };
@ -449,7 +413,6 @@
9E9ECC9428589E150099D5A2 /* ImportWalletSnapshotTests.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = ImportWalletSnapshotTests.swift; sourceTree = "<group>"; };
9E9ECC9628589E150099D5A2 /* OnboardingSnapshotTests.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = OnboardingSnapshotTests.swift; sourceTree = "<group>"; };
9EAB4675285B5C7C002904A0 /* DeeplinkTests.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = DeeplinkTests.swift; sourceTree = "<group>"; };
9EAB46792861EA6A002904A0 /* TransactionRowView.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = TransactionRowView.swift; sourceTree = "<group>"; };
9EAFEB812805793200199FC9 /* RootTests.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = RootTests.swift; sourceTree = "<group>"; };
9EAFEB852805A23100199FC9 /* SecItemClientTests.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = SecItemClientTests.swift; sourceTree = "<group>"; };
9EAFEB8D2808183D00199FC9 /* SandboxView.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = SandboxView.swift; sourceTree = "<group>"; };
@ -465,15 +428,8 @@
F93673D52742CB840099C6AF /* Previews.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = Previews.swift; sourceTree = "<group>"; };
F93874ED273C4DE200F0E875 /* HomeStore.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = HomeStore.swift; sourceTree = "<group>"; };
F93874EF273C4DE200F0E875 /* HomeView.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = HomeView.swift; sourceTree = "<group>"; };
F96B41E3273B501F0021B49A /* WalletEventsFlowStore.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = WalletEventsFlowStore.swift; sourceTree = "<group>"; };
F96B41E5273B501F0021B49A /* TransactionDetailView.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = TransactionDetailView.swift; sourceTree = "<group>"; };
F96B41E6273B501F0021B49A /* WalletEventsFlowView.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = WalletEventsFlowView.swift; sourceTree = "<group>"; };
F9971A4A27680DC400A2DB75 /* RootStore.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = RootStore.swift; sourceTree = "<group>"; };
F9971A4C27680DC400A2DB75 /* RootView.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = RootView.swift; sourceTree = "<group>"; };
F9971A5D27680DF600A2DB75 /* ScanView.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = ScanView.swift; sourceTree = "<group>"; };
F9971A5E27680DF600A2DB75 /* ScanStore.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = ScanStore.swift; sourceTree = "<group>"; };
F9971A6227680DFE00A2DB75 /* SettingsStore.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = SettingsStore.swift; sourceTree = "<group>"; };
F9971A6427680DFE00A2DB75 /* SettingsView.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = SettingsView.swift; sourceTree = "<group>"; };
F9C165B72740403600592F76 /* SendFlowStore.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = SendFlowStore.swift; sourceTree = "<group>"; };
F9C165BB2740403600592F76 /* CreateTransactionView.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = CreateTransactionView.swift; sourceTree = "<group>"; };
F9C165BD2740403600592F76 /* TransactionSentView.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = TransactionSentView.swift; sourceTree = "<group>"; };
@ -489,8 +445,13 @@
9E0031922A272A61003DFCEB /* NumberFormatter in Frameworks */,
9E0031902A272A61003DFCEB /* LogsHandler in Frameworks */,
0D26AF71299E8196005260EE /* Lottie in Frameworks */,
9EE5927F2A2E028D007147CD /* Settings in Frameworks */,
9EE5927D2A2E0288007147CD /* ExportLogs in Frameworks */,
9EE592752A2DF7D8007147CD /* Scan in Frameworks */,
0D26AF72299E8196005260EE /* URLRouting in Frameworks */,
9EE5926F2A2DDF98007147CD /* BalanceBreakdown in Frameworks */,
0D26AF73299E8196005260EE /* ZcashLightClientKit in Frameworks */,
9EE592732A2DF207007147CD /* WalletEventsFlow in Frameworks */,
9E0031BA2A2878EE003DFCEB /* AddressDetails in Frameworks */,
9E0031722A272747003DFCEB /* CaptureDevice in Frameworks */,
9E00316E2A272746003DFCEB /* AppVersion in Frameworks */,
@ -534,8 +495,13 @@
9E00318A2A272A52003DFCEB /* NumberFormatter in Frameworks */,
9E0031882A272A52003DFCEB /* LogsHandler in Frameworks */,
9E6612312878337F00C75B70 /* Lottie in Frameworks */,
9EE5927B2A2E0284007147CD /* Settings in Frameworks */,
9EE592792A2E027F007147CD /* ExportLogs in Frameworks */,
9EE592772A2DF7DD007147CD /* Scan in Frameworks */,
0D5D9B8F2914620700DBD03F /* URLRouting in Frameworks */,
9EE5926D2A2DDF94007147CD /* BalanceBreakdown in Frameworks */,
34CE032B29C0938600A6626B /* ZcashLightClientKit in Frameworks */,
9EE592712A2DF202007147CD /* WalletEventsFlow in Frameworks */,
9E0031BC2A2878F3003DFCEB /* AddressDetails in Frameworks */,
9E0031642A272736003DFCEB /* CaptureDevice in Frameworks */,
9E0031602A272736003DFCEB /* AppVersion in Frameworks */,
@ -699,7 +665,6 @@
0DF2DC5227235E1F00FA31E2 /* Extensions */ = {
isa = PBXGroup;
children = (
0D3016B429BF94D1002371B3 /* Button+Disabling.swift */,
);
path = Extensions;
sourceTree = "<group>";
@ -777,23 +742,6 @@
path = CheckCircle;
sourceTree = "<group>";
};
34C5657F29B60BDF002F3A7C /* ExportLogs */ = {
isa = PBXGroup;
children = (
34C5658429B60C8B002F3A7C /* ExportLogsStore.swift */,
34C5658029B60C1C002F3A7C /* UIKitBridge */,
);
path = ExportLogs;
sourceTree = "<group>";
};
34C5658029B60C1C002F3A7C /* UIKitBridge */ = {
isa = PBXGroup;
children = (
34C5658129B60C1C002F3A7C /* UIShareDialog.swift */,
);
path = UIKitBridge;
sourceTree = "<group>";
};
34F039B129ABCE8500CF0053 /* WalletConfigProviderTests */ = {
isa = PBXGroup;
children = (
@ -805,18 +753,13 @@
6654C73B2715A3F000901167 /* Features */ = {
isa = PBXGroup;
children = (
9E0031BD2A28B21A003DFCEB /* BalanceBreakdown */,
34C5657F29B60BDF002F3A7C /* ExportLogs */,
F93874EC273C4DE200F0E875 /* Home */,
9E2DF99727CF704D00649636 /* ImportWallet */,
3448CB3028E4764E006ADEDB /* NotEnoughFreeSpace */,
6654C73C2715A3FA00901167 /* OnboardingFlow */,
F9971A4927680DC400A2DB75 /* Root */,
9EAFEB8B2808174900199FC9 /* Sandbox */,
F9971A5B27680DF600A2DB75 /* Scan */,
F9C165B62740403600592F76 /* SendFlow */,
F9971A6127680DFE00A2DB75 /* Settings */,
F96B41E2273B501F0021B49A /* WalletEventsFlow */,
);
path = Features;
sourceTree = "<group>";
@ -859,15 +802,6 @@
path = ProgressIndicators;
sourceTree = "<group>";
};
9E0031BD2A28B21A003DFCEB /* BalanceBreakdown */ = {
isa = PBXGroup;
children = (
9E0031BE2A28B221003DFCEB /* BalanceBreakdownStore.swift */,
9E0031BF2A28B221003DFCEB /* BalanceBreakdownView.swift */,
);
path = BalanceBreakdown;
sourceTree = "<group>";
};
9E01F8262833CD84000EFC57 /* ScanTests */ = {
isa = PBXGroup;
children = (
@ -956,14 +890,6 @@
path = SnapshotTests;
sourceTree = "<group>";
};
9E4AA4F629BF76AA00752BB3 /* Views */ = {
isa = PBXGroup;
children = (
9E4AA4F729BF76BB00752BB3 /* About.swift */,
);
path = Views;
sourceTree = "<group>";
};
9E5BF63D281953F900BA3F17 /* WalletEventsTests */ = {
isa = PBXGroup;
children = (
@ -1001,14 +927,6 @@
path = TransactionAddress;
sourceTree = "<group>";
};
9E612C6D2987A96500D09B09 /* UIKitBridge */ = {
isa = PBXGroup;
children = (
346731A129AE3A5100974482 /* UIMailDialog.swift */,
);
path = UIKitBridge;
sourceTree = "<group>";
};
9E612C7729913F2300D09B09 /* SensitiveDataTests */ = {
isa = PBXGroup;
children = (
@ -1177,15 +1095,6 @@
path = TCATextField;
sourceTree = "<group>";
};
9E7FE0F72832823100C374E8 /* UIKitBridge */ = {
isa = PBXGroup;
children = (
9E7FE0F528327F6F00C374E8 /* ScanUIView.swift */,
9E7FE0F82832824C00C374E8 /* QRCodeScanView.swift */,
);
path = UIKitBridge;
sourceTree = "<group>";
};
9E94C61E28AA7DD5008256E9 /* BalanceBreakdownTests */ = {
isa = PBXGroup;
children = (
@ -1309,26 +1218,6 @@
path = Home;
sourceTree = "<group>";
};
F96B41E2273B501F0021B49A /* WalletEventsFlow */ = {
isa = PBXGroup;
children = (
F96B41E3273B501F0021B49A /* WalletEventsFlowStore.swift */,
F96B41E6273B501F0021B49A /* WalletEventsFlowView.swift */,
F96B41E4273B501F0021B49A /* Views */,
);
path = WalletEventsFlow;
sourceTree = "<group>";
};
F96B41E4273B501F0021B49A /* Views */ = {
isa = PBXGroup;
children = (
F96B41E5273B501F0021B49A /* TransactionDetailView.swift */,
9EAB46792861EA6A002904A0 /* TransactionRowView.swift */,
9E9074FE2A260FE400269308 /* WalletEvent+View.swift */,
);
path = Views;
sourceTree = "<group>";
};
F9971A4927680DC400A2DB75 /* Root */ = {
isa = PBXGroup;
children = (
@ -1341,27 +1230,6 @@
path = Root;
sourceTree = "<group>";
};
F9971A5B27680DF600A2DB75 /* Scan */ = {
isa = PBXGroup;
children = (
F9971A5E27680DF600A2DB75 /* ScanStore.swift */,
F9971A5D27680DF600A2DB75 /* ScanView.swift */,
9E7FE0F72832823100C374E8 /* UIKitBridge */,
);
path = Scan;
sourceTree = "<group>";
};
F9971A6127680DFE00A2DB75 /* Settings */ = {
isa = PBXGroup;
children = (
F9971A6227680DFE00A2DB75 /* SettingsStore.swift */,
F9971A6427680DFE00A2DB75 /* SettingsView.swift */,
9E4AA4F629BF76AA00752BB3 /* Views */,
9E612C6D2987A96500D09B09 /* UIKitBridge */,
);
path = Settings;
sourceTree = "<group>";
};
F9C165B62740403600592F76 /* SendFlow */ = {
isa = PBXGroup;
children = (
@ -1442,6 +1310,11 @@
9E0031C42A28BB97003DFCEB /* RecoveryPhraseDisplay */,
9E5452672A28D5500098B887 /* Welcome */,
9E54526D2A28DA510098B887 /* Profile */,
9EE5926E2A2DDF98007147CD /* BalanceBreakdown */,
9EE592722A2DF207007147CD /* WalletEventsFlow */,
9EE592742A2DF7D8007147CD /* Scan */,
9EE5927C2A2E0288007147CD /* ExportLogs */,
9EE5927E2A2E028D007147CD /* Settings */,
);
productName = secant;
productReference = 0D26AF94299E8196005260EE /* secant-mainnet.app */;
@ -1503,6 +1376,11 @@
9E0031C22A28BB92003DFCEB /* RecoveryPhraseDisplay */,
9E5452692A28D5570098B887 /* Welcome */,
9E54526B2A28DA4B0098B887 /* Profile */,
9EE5926C2A2DDF94007147CD /* BalanceBreakdown */,
9EE592702A2DF202007147CD /* WalletEventsFlow */,
9EE592762A2DF7DD007147CD /* Scan */,
9EE592782A2E027F007147CD /* ExportLogs */,
9EE5927A2A2E0284007147CD /* Settings */,
);
productName = secant;
productReference = 0D4E7A0526B364170058B01E /* secant-testnet.app */;
@ -1821,16 +1699,13 @@
0D26AE9D299E8196005260EE /* CrashReporterTestKey.swift in Sources */,
0D26AEA0299E8196005260EE /* SandboxStore.swift in Sources */,
0D26AEA5299E8196005260EE /* TransactionSendingView.swift in Sources */,
0D26AEA6299E8196005260EE /* WalletEventsFlowView.swift in Sources */,
0D26AEAA299E8196005260EE /* CrashReporterLiveKey.swift in Sources */,
0D26AEAC299E8196005260EE /* TCATextField.swift in Sources */,
0D26AEAF299E8196005260EE /* TransactionAmountTextFieldStore.swift in Sources */,
0D26AEB1299E8196005260EE /* AppDelegate.swift in Sources */,
0D3016B929BFB2FB002371B3 /* PlainOnboardingView.swift in Sources */,
0D26AEB5299E8196005260EE /* TransactionDetailView.swift in Sources */,
0D26AEBC299E8196005260EE /* TCATextFieldStore.swift in Sources */,
0D26AEBF299E8196005260EE /* TransactionFailedView.swift in Sources */,
0D26AEC2299E8196005260EE /* TransactionRowView.swift in Sources */,
0D26AEC4299E8196005260EE /* TCALogging.swift in Sources */,
9E486DFA29BA09C2003E6945 /* UIKit+Extensions.swift in Sources */,
9E33ECDA29D5E30700708DE4 /* OnChangeReducer.swift in Sources */,
@ -1844,10 +1719,8 @@
0D26AEDC299E8196005260EE /* CheckCircle.swift in Sources */,
0D26AEE4299E8196005260EE /* CurrencySelectionView.swift in Sources */,
0D26AEE7299E8196005260EE /* TransactionAddressTextFieldStore.swift in Sources */,
34C5658629B60C8B002F3A7C /* ExportLogsStore.swift in Sources */,
0D26AEE9299E8196005260EE /* WithStateBinding.swift in Sources */,
0D26AEEB299E8196005260EE /* Previews.swift in Sources */,
0D26AEEE299E8196005260EE /* QRCodeScanView.swift in Sources */,
0D26AEF0299E8196005260EE /* TCALoggerReducer.swift in Sources */,
0D26AEF2299E8196005260EE /* MultipleLineTextField.swift in Sources */,
0D26AEF3299E8196005260EE /* NotEnoughFreeSpaceView.swift in Sources */,
@ -1856,25 +1729,17 @@
0D26AEFC299E8196005260EE /* RootStore.swift in Sources */,
0D26AEFD299E8196005260EE /* HomeView.swift in Sources */,
0D26AEFF299E8196005260EE /* SandboxView.swift in Sources */,
34C5658329B60C1C002F3A7C /* UIShareDialog.swift in Sources */,
9E9075002A260FE400269308 /* WalletEvent+View.swift in Sources */,
0D3016B629BF94D1002371B3 /* Button+Disabling.swift in Sources */,
9E852D6229B098F400CF4AC1 /* RootDebug.swift in Sources */,
0D26AF05299E8196005260EE /* ScanView.swift in Sources */,
0D26AF07299E8196005260EE /* RootView.swift in Sources */,
9E0031C62A28BD54003DFCEB /* BalanceBreakdownStore.swift in Sources */,
0D26AF0A299E8196005260EE /* OnboardingFooterView.swift in Sources */,
0D26AF0E299E8196005260EE /* MultiLineTextFieldStore.swift in Sources */,
0D26AF0F299E8196005260EE /* DebugFrame.swift in Sources */,
0D26AF11299E8196005260EE /* LottieAnimation.swift in Sources */,
9E486DF129B9EE84003E6945 /* KeyboardAdaptive.swift in Sources */,
0D573CB629C106E900B97379 /* About.swift in Sources */,
0D26AF18299E8196005260EE /* WalletEventsFlowStore.swift in Sources */,
0D26AF1B299E8196005260EE /* HomeStore.swift in Sources */,
0D26AF20299E8196005260EE /* UInt+SuperscriptText.swift in Sources */,
0D26AF23299E8196005260EE /* SendFlowStore.swift in Sources */,
0D26AF24299E8196005260EE /* SecantApp.swift in Sources */,
0D26AF37299E8196005260EE /* ScanUIView.swift in Sources */,
0D26AF3A299E8196005260EE /* OnboardingContentView.swift in Sources */,
0D26AF3B299E8196005260EE /* CircularProgress.swift in Sources */,
0D26AF3C299E8196005260EE /* OnboardingHeaderView.swift in Sources */,
@ -1887,14 +1752,9 @@
0D26AF47299E8196005260EE /* CreateTransactionView.swift in Sources */,
0D26AF4B299E8196005260EE /* TextFieldTitleAccessoryButtonStyle.swift in Sources */,
0D26AF4D299E8196005260EE /* ImportWalletStore.swift in Sources */,
0D26AF4F299E8196005260EE /* SettingsView.swift in Sources */,
0D26AF53299E8196005260EE /* TextFieldFooter.swift in Sources */,
0D26AF54299E8196005260EE /* CrashReporterInterface.swift in Sources */,
346731A329AE3A5100974482 /* UIMailDialog.swift in Sources */,
9E0031C72A28BD54003DFCEB /* BalanceBreakdownView.swift in Sources */,
0D26AF56299E8196005260EE /* ScanStore.swift in Sources */,
0D26AF5F299E8196005260EE /* SendFlowView.swift in Sources */,
0D26AF64299E8196005260EE /* SettingsStore.swift in Sources */,
0D26AF65299E8196005260EE /* InitializationState.swift in Sources */,
9E486DF429B9EEC4003E6945 /* UIResponder+Current.swift in Sources */,
0D26AF68299E8196005260EE /* TransactionAmountTextField.swift in Sources */,
@ -1911,17 +1771,13 @@
0D261040298C406F00CC9DE9 /* CrashReporterTestKey.swift in Sources */,
9EAFEB902808183D00199FC9 /* SandboxStore.swift in Sources */,
34DA414728E4385800F8CC61 /* TransactionSendingView.swift in Sources */,
F96B41E9273B501F0021B49A /* WalletEventsFlowView.swift in Sources */,
9E4AA4F829BF76BB00752BB3 /* About.swift in Sources */,
0D26103E298C3FA600CC9DE9 /* CrashReporterLiveKey.swift in Sources */,
2EDA07A027EDE18C00D6F09B /* TCATextField.swift in Sources */,
2EB7758727FC67FD00269373 /* TransactionAmountTextFieldStore.swift in Sources */,
9EF8136027F043CC0075AF48 /* AppDelegate.swift in Sources */,
0D3016B829BFB2FB002371B3 /* PlainOnboardingView.swift in Sources */,
F96B41E8273B501F0021B49A /* TransactionDetailView.swift in Sources */,
2EB1C5E827D77F6100BC43D7 /* TCATextFieldStore.swift in Sources */,
9E5BF641281FD7B600BA3F17 /* TransactionFailedView.swift in Sources */,
9EAB467A2861EA6A002904A0 /* TransactionRowView.swift in Sources */,
9E0F5741297E7F1D005304FA /* TCALogging.swift in Sources */,
9E9CEA3E29D47BE000599DF5 /* OnChangeReducer.swift in Sources */,
9E486DF929BA09C2003E6945 /* UIKit+Extensions.swift in Sources */,
@ -1935,10 +1791,8 @@
346D41E428DF0B8600963F36 /* CheckCircle.swift in Sources */,
2E8719CD27FB0D3B0082C926 /* CurrencySelectionView.swift in Sources */,
9E5BF6502823E94900BA3F17 /* TransactionAddressTextFieldStore.swift in Sources */,
34C5658529B60C8B002F3A7C /* ExportLogsStore.swift in Sources */,
F9EEB8162742C2210032EEB8 /* WithStateBinding.swift in Sources */,
F93673D62742CB840099C6AF /* Previews.swift in Sources */,
9E7FE0F92832824C00C374E8 /* QRCodeScanView.swift in Sources */,
9E0F5743297EB96C005304FA /* TCALoggerReducer.swift in Sources */,
9E7225F3288AB6DD00DF7F17 /* MultipleLineTextField.swift in Sources */,
3448CB3228E47666006ADEDB /* NotEnoughFreeSpaceView.swift in Sources */,
@ -1947,24 +1801,17 @@
F9971A4D27680DC400A2DB75 /* RootStore.swift in Sources */,
9EAFEB9228081E9400199FC9 /* HomeView.swift in Sources */,
9EAFEB8F2808183D00199FC9 /* SandboxView.swift in Sources */,
34C5658229B60C1C002F3A7C /* UIShareDialog.swift in Sources */,
9E9074FF2A260FE400269308 /* WalletEvent+View.swift in Sources */,
0D3016B529BF94D1002371B3 /* Button+Disabling.swift in Sources */,
9E852D6129B098F400CF4AC1 /* RootDebug.swift in Sources */,
F9971A5F27680DF600A2DB75 /* ScanView.swift in Sources */,
F9971A4E27680DC400A2DB75 /* RootView.swift in Sources */,
2EA11F5B27467EF800709571 /* OnboardingFooterView.swift in Sources */,
9E7225F6288AC71A00DF7F17 /* MultiLineTextFieldStore.swift in Sources */,
2EDA07A427EDE2A900D6F09B /* DebugFrame.swift in Sources */,
9E6612332878338C00C75B70 /* LottieAnimation.swift in Sources */,
9E486DF029B9EE84003E6945 /* KeyboardAdaptive.swift in Sources */,
F96B41E7273B501F0021B49A /* WalletEventsFlowStore.swift in Sources */,
9EAFEB9128081E9400199FC9 /* HomeStore.swift in Sources */,
0DACFA8127208D940039EEA5 /* UInt+SuperscriptText.swift in Sources */,
9E0031C12A28B221003DFCEB /* BalanceBreakdownView.swift in Sources */,
F9C165BF2740403600592F76 /* SendFlowStore.swift in Sources */,
0D4E7A0926B364170058B01E /* SecantApp.swift in Sources */,
9E7FE0F628327F6F00C374E8 /* ScanUIView.swift in Sources */,
2EA11F5D27467F7700709571 /* OnboardingContentView.swift in Sources */,
9E7CB6152869E8C300A02233 /* CircularProgress.swift in Sources */,
2E58E73B274679F000B2B84B /* OnboardingHeaderView.swift in Sources */,
@ -1977,15 +1824,10 @@
F9C165C22740403600592F76 /* CreateTransactionView.swift in Sources */,
2E35F99A27B3E99C00EB79CD /* TextFieldTitleAccessoryButtonStyle.swift in Sources */,
9E2DF99C27CF704D00649636 /* ImportWalletStore.swift in Sources */,
F9971A6627680DFE00A2DB75 /* SettingsView.swift in Sources */,
2EDA07A227EDE1AE00D6F09B /* TextFieldFooter.swift in Sources */,
0D26103C298C3E4800CC9DE9 /* CrashReporterInterface.swift in Sources */,
346731A229AE3A5100974482 /* UIMailDialog.swift in Sources */,
F9971A6027680DF600A2DB75 /* ScanStore.swift in Sources */,
F9C165CB2741AB5D00592F76 /* SendFlowView.swift in Sources */,
F9971A6527680DFE00A2DB75 /* SettingsStore.swift in Sources */,
9EF8139C27F47AED0075AF48 /* InitializationState.swift in Sources */,
9E0031C02A28B221003DFCEB /* BalanceBreakdownStore.swift in Sources */,
9E486DF329B9EEC4003E6945 /* UIResponder+Current.swift in Sources */,
2E8719CB27FB09990082C926 /* TransactionAmountTextField.swift in Sources */,
9E6713FA289BE0E100A6796F /* ClearBackgroundView.swift in Sources */,
@ -2882,6 +2724,46 @@
package = 9EAB466B285A0468002904A0 /* XCRemoteSwiftPackageReference "swift-parsing" */;
productName = Parsing;
};
9EE5926C2A2DDF94007147CD /* BalanceBreakdown */ = {
isa = XCSwiftPackageProductDependency;
productName = BalanceBreakdown;
};
9EE5926E2A2DDF98007147CD /* BalanceBreakdown */ = {
isa = XCSwiftPackageProductDependency;
productName = BalanceBreakdown;
};
9EE592702A2DF202007147CD /* WalletEventsFlow */ = {
isa = XCSwiftPackageProductDependency;
productName = WalletEventsFlow;
};
9EE592722A2DF207007147CD /* WalletEventsFlow */ = {
isa = XCSwiftPackageProductDependency;
productName = WalletEventsFlow;
};
9EE592742A2DF7D8007147CD /* Scan */ = {
isa = XCSwiftPackageProductDependency;
productName = Scan;
};
9EE592762A2DF7DD007147CD /* Scan */ = {
isa = XCSwiftPackageProductDependency;
productName = Scan;
};
9EE592782A2E027F007147CD /* ExportLogs */ = {
isa = XCSwiftPackageProductDependency;
productName = ExportLogs;
};
9EE5927A2A2E0284007147CD /* Settings */ = {
isa = XCSwiftPackageProductDependency;
productName = Settings;
};
9EE5927C2A2E0288007147CD /* ExportLogs */ = {
isa = XCSwiftPackageProductDependency;
productName = ExportLogs;
};
9EE5927E2A2E028D007147CD /* Settings */ = {
isa = XCSwiftPackageProductDependency;
productName = Settings;
};
/* End XCSwiftPackageProductDependency section */
};
rootObject = 0D4E79FD26B364170058B01E /* Project object */;

View File

@ -10,6 +10,10 @@ import Models
import Generated
import ReviewRequest
import Profile
import BalanceBreakdown
import WalletEventsFlow
import Scan
import Settings
typealias HomeStore = Store<HomeReducer.State, HomeReducer.Action>
typealias HomeViewStore = ViewStore<HomeReducer.State, HomeReducer.Action>
@ -115,7 +119,7 @@ struct HomeReducer: ReducerProtocol {
}
Scope(state: \.balanceBreakdownState, action: /Action.balanceBreakdown) {
BalanceBreakdownReducer()
BalanceBreakdownReducer(networkType: TargetConstants.zcashNetwork.networkType)
}
Reduce { state, action in
@ -298,8 +302,8 @@ extension HomeViewStore {
// MARK: Alerts
extension AlertState where Action == HomeReducer.Action {
static func syncFailed(_ error: ZcashError, _ secondaryButtonTitle: String) -> AlertState<HomeReducer.Action> {
AlertState<HomeReducer.Action> {
static func syncFailed(_ error: ZcashError, _ secondaryButtonTitle: String) -> AlertState {
AlertState {
TextState(L10n.Home.SyncFailed.title)
} actions: {
ButtonState(action: .retrySync) {

View File

@ -3,6 +3,9 @@ import ComposableArchitecture
import StoreKit
import Generated
import Profile
import BalanceBreakdown
import WalletEventsFlow
import Settings
struct HomeView: View {
let store: Store<HomeReducer.State, HomeReducer.Action>
@ -48,7 +51,12 @@ struct HomeView: View {
))
.navigationLinkEmpty(
isActive: viewStore.bindingForDestination(.balanceBreakdown),
destination: { BalanceBreakdownView(store: store.balanceBreakdownStore()) }
destination: {
BalanceBreakdownView(
store: store.balanceBreakdownStore(),
tokenName: TargetConstants.tokenName
)
}
)
.navigationLinkEmpty(
isActive: viewStore.bindingForDestination(.notEnoughFreeDiskSpace),
@ -56,7 +64,7 @@ struct HomeView: View {
)
.navigationLinkEmpty(
isActive: viewStore.bindingForDestination(.transactionHistory),
destination: { WalletEventsFlowView(store: store.historyStore()) }
destination: { WalletEventsFlowView(store: store.historyStore(), tokenName: TargetConstants.tokenName) }
)
.navigationLinkEmpty(
isActive: viewStore.bindingForDestination(.send),

View File

@ -172,8 +172,8 @@ extension ImportWalletViewStore {
// MARK: Alerts
extension AlertState where Action == ImportWalletReducer.Action {
static func succeed() -> AlertState<ImportWalletReducer.Action> {
AlertState<ImportWalletReducer.Action> {
static func succeed() -> AlertState {
AlertState {
TextState(L10n.General.success)
} actions: {
ButtonState(action: .successfullyRecovered) {
@ -184,8 +184,8 @@ extension AlertState where Action == ImportWalletReducer.Action {
}
}
static func failed(_ error: ZcashError) -> AlertState<ImportWalletReducer.Action> {
AlertState<ImportWalletReducer.Action> {
static func failed(_ error: ZcashError) -> AlertState {
AlertState {
TextState(L10n.ImportWallet.Alert.Failed.title)
} actions: {
ButtonState(action: .dismissAlert) {

View File

@ -12,6 +12,7 @@ import RecoveryPhraseDisplay
import Welcome
import Generated
import Foundation
import ExportLogs
typealias RootStore = Store<RootReducer.State, RootReducer.Action>
typealias RootViewStore = ViewStore<RootReducer.State, RootReducer.Action>
@ -149,32 +150,32 @@ extension RootReducer {
// MARK: Alerts
extension AlertState where Action == RootReducer.Action {
static func cantCreateNewWallet(_ error: ZcashError) -> AlertState<RootReducer.Action> {
AlertState<RootReducer.Action> {
static func cantCreateNewWallet(_ error: ZcashError) -> AlertState {
AlertState {
TextState(L10n.Root.Initialization.Alert.Failed.title)
} message: {
TextState(L10n.Root.Initialization.Alert.CantCreateNewWallet.message(error.message, error.code.rawValue))
}
}
static func cantLoadSeedPhrase() -> AlertState<RootReducer.Action> {
AlertState<RootReducer.Action> {
static func cantLoadSeedPhrase() -> AlertState {
AlertState {
TextState(L10n.Root.Initialization.Alert.Failed.title)
} message: {
TextState(L10n.Root.Initialization.Alert.CantLoadSeedPhrase.message)
}
}
static func cantStartSync(_ error: ZcashError) -> AlertState<RootReducer.Action> {
AlertState<RootReducer.Action> {
static func cantStartSync(_ error: ZcashError) -> AlertState {
AlertState {
TextState(L10n.Root.Debug.Alert.Rewind.CantStartSync.title)
} message: {
TextState(L10n.Root.Debug.Alert.Rewind.CantStartSync.message(error.message, error.code.rawValue))
}
}
static func cantStoreThatUserPassedPhraseBackupTest(_ error: ZcashError) -> AlertState<RootReducer.Action> {
AlertState<RootReducer.Action> {
static func cantStoreThatUserPassedPhraseBackupTest(_ error: ZcashError) -> AlertState {
AlertState {
TextState(L10n.Root.Initialization.Alert.Failed.title)
} message: {
TextState(
@ -183,46 +184,46 @@ extension AlertState where Action == RootReducer.Action {
}
}
static func failedToProcessDeeplink(_ url: URL, _ error: ZcashError) -> AlertState<RootReducer.Action> {
AlertState<RootReducer.Action> {
static func failedToProcessDeeplink(_ url: URL, _ error: ZcashError) -> AlertState {
AlertState {
TextState(L10n.Root.Destination.Alert.FailedToProcessDeeplink.title)
} message: {
TextState(L10n.Root.Destination.Alert.FailedToProcessDeeplink.message(url, error.message, error.code.rawValue))
}
}
static func initializationFailed(_ error: ZcashError) -> AlertState<RootReducer.Action> {
AlertState<RootReducer.Action> {
static func initializationFailed(_ error: ZcashError) -> AlertState {
AlertState {
TextState(L10n.Root.Initialization.Alert.SdkInitFailed.title)
} message: {
TextState(L10n.Root.Initialization.Alert.Error.message(error.message, error.code.rawValue))
}
}
static func rewindFailed(_ error: ZcashError) -> AlertState<RootReducer.Action> {
AlertState<RootReducer.Action> {
static func rewindFailed(_ error: ZcashError) -> AlertState {
AlertState {
TextState(L10n.Root.Debug.Alert.Rewind.Failed.title)
} message: {
TextState(L10n.Root.Debug.Alert.Rewind.Failed.message(error.message, error.code.rawValue))
}
}
static func walletStateFailed(_ walletState: InitializationState) -> AlertState<RootReducer.Action> {
AlertState<RootReducer.Action> {
static func walletStateFailed(_ walletState: InitializationState) -> AlertState {
AlertState {
TextState(L10n.Root.Initialization.Alert.Failed.title)
} message: {
TextState(L10n.Root.Initialization.Alert.WalletStateFailed.message(walletState))
}
}
static func wipeFailed() -> AlertState<RootReducer.Action> {
AlertState<RootReducer.Action> {
static func wipeFailed() -> AlertState {
AlertState {
TextState(L10n.Root.Initialization.Alert.WipeFailed.title)
}
}
static func wipeRequest() -> AlertState<RootReducer.Action> {
AlertState<RootReducer.Action> {
static func wipeRequest() -> AlertState {
AlertState {
TextState(L10n.Root.Initialization.Alert.Wipe.title)
} actions: {
ButtonState(role: .destructive, action: .initialization(.nukeWallet)) {

View File

@ -6,6 +6,7 @@ import RecoveryPhraseValidationFlow
import Models
import RecoveryPhraseDisplay
import Welcome
import ExportLogs
struct RootView: View {
let store: RootStore

View File

@ -1,6 +1,7 @@
import ComposableArchitecture
import SwiftUI
import Profile
import WalletEventsFlow
typealias SandboxStore = Store<SandboxReducer.State, SandboxReducer.Action>
typealias SandboxViewStore = ViewStore<SandboxReducer.State, SandboxReducer.Action>

View File

@ -2,6 +2,8 @@ import SwiftUI
import ComposableArchitecture
import RecoveryPhraseDisplay
import Profile
import WalletEventsFlow
import Scan
struct SandboxView: View {
struct SandboxDestinationValue: Identifiable {
@ -24,7 +26,7 @@ struct SandboxView: View {
@ViewBuilder func view(for destination: SandboxReducer.State.Destination) -> some View {
switch destination {
case .history:
WalletEventsFlowView(store: store.historyStore())
WalletEventsFlowView(store: store.historyStore(), tokenName: TargetConstants.tokenName)
case .send:
SendFlowView(
store: .init(
@ -83,7 +85,7 @@ struct SandboxView: View {
isPresented: viewStore.bindingForDestination(.history),
content: {
NavigationView {
WalletEventsFlowView(store: store.historyStore())
WalletEventsFlowView(store: store.historyStore(), tokenName: TargetConstants.tokenName)
.toolbar {
ToolbarItem {
Button("Done") { viewStore.send(.updateDestination(nil)) }

View File

@ -10,6 +10,7 @@ import ComposableArchitecture
import ZcashLightClientKit
import AudioServices
import Utils
import Scan
typealias SendFlowStore = Store<SendFlowReducer.State, SendFlowReducer.Action>
typealias SendFlowViewStore = ViewStore<SendFlowReducer.State, SendFlowReducer.Action>
@ -122,7 +123,7 @@ struct SendFlowReducer: ReducerProtocol {
}
Scope(state: \.scanState, action: /Action.scan) {
ScanReducer()
ScanReducer(networkType: TargetConstants.zcashNetwork.networkType)
}
Reduce { state, action in

View File

@ -8,6 +8,7 @@
import SwiftUI
import ComposableArchitecture
import Generated
import Scan
struct SendFlowView: View {
let store: SendFlowStore

View File

@ -9,6 +9,7 @@ import ComposableArchitecture
import ZcashLightClientKit
import Foundation
import Utils
import NumberFormatter
typealias TransactionAmountTextFieldStore = Store<TransactionAmountTextFieldReducer.State, TransactionAmountTextFieldReducer.Action>

View File

@ -11,13 +11,14 @@ import ZcashLightClientKit
import Combine
import Utils
import Generated
import BalanceBreakdown
@testable import secant_testnet
class BalanceBreakdownTests: XCTestCase {
func testOnAppear() throws {
let store = TestStore(
initialState: .placeholder,
reducer: BalanceBreakdownReducer()
reducer: BalanceBreakdownReducer(networkType: .testnet)
)
store.dependencies.sdkSynchronizer = .mocked()
@ -40,7 +41,7 @@ class BalanceBreakdownTests: XCTestCase {
@MainActor func testShieldFundsSucceed() async throws {
let store = TestStore(
initialState: .placeholder,
reducer: BalanceBreakdownReducer()
reducer: BalanceBreakdownReducer(networkType: .testnet)
)
store.dependencies.sdkSynchronizer = .mock
@ -65,7 +66,7 @@ class BalanceBreakdownTests: XCTestCase {
@MainActor func testShieldFundsFails() async throws {
let store = TestStore(
initialState: .placeholder,
reducer: BalanceBreakdownReducer()
reducer: BalanceBreakdownReducer(networkType: .testnet)
)
store.dependencies.sdkSynchronizer = .mocked(shieldFunds: { _, _, _ in throw ZcashError.synchronizerNotPrepared })
@ -90,7 +91,7 @@ class BalanceBreakdownTests: XCTestCase {
@MainActor func testShieldFundsButtonDisabledWhenNoShieldableFunds() async throws {
let store = TestStore(
initialState: .placeholder,
reducer: BalanceBreakdownReducer()
reducer: BalanceBreakdownReducer(networkType: .testnet)
)
XCTAssertFalse(store.state.shieldingFunds)
@ -112,7 +113,7 @@ class BalanceBreakdownTests: XCTestCase {
)
)
),
reducer: BalanceBreakdownReducer()
reducer: BalanceBreakdownReducer(networkType: .testnet)
)
XCTAssertFalse(store.state.shieldingFunds)
@ -134,7 +135,7 @@ class BalanceBreakdownTests: XCTestCase {
)
)
),
reducer: BalanceBreakdownReducer()
reducer: BalanceBreakdownReducer(networkType: .testnet)
)
XCTAssertTrue(store.state.shieldingFunds)

View File

@ -6,9 +6,10 @@
//
import XCTest
@testable import secant_testnet
import ComposableArchitecture
import ZcashLightClientKit
import Scan
@testable import secant_testnet
class ScanTests: XCTestCase {
func testOnAppearResetValues() throws {
@ -19,7 +20,7 @@ class ScanTests: XCTestCase {
isTorchOn: true,
scanStatus: .value("t1gXqfSSQt6WfpwyuCU3Wi7sSVZ66DYQ3Po".redacted)
),
reducer: ScanReducer()
reducer: ScanReducer(networkType: .testnet)
)
store.dependencies.captureDevice = .noOp
@ -34,7 +35,7 @@ class ScanTests: XCTestCase {
func testTorchOn() throws {
let store = TestStore(
initialState: ScanReducer.State(),
reducer: ScanReducer()
reducer: ScanReducer(networkType: .testnet)
)
store.dependencies.captureDevice = .noOp
@ -49,7 +50,7 @@ class ScanTests: XCTestCase {
initialState: ScanReducer.State(
isTorchOn: true
),
reducer: ScanReducer()
reducer: ScanReducer(networkType: .testnet)
)
store.dependencies.captureDevice = .noOp
@ -62,7 +63,7 @@ class ScanTests: XCTestCase {
func testScannedInvalidValue() throws {
let store = TestStore(
initialState: ScanReducer.State(),
reducer: ScanReducer()
reducer: ScanReducer(networkType: .testnet)
)
store.dependencies.uriParser.isValidURI = { _, _ in false }
@ -78,7 +79,7 @@ class ScanTests: XCTestCase {
let store = TestStore(
initialState: ScanReducer.State(),
reducer: ScanReducer()
reducer: ScanReducer(networkType: .testnet)
)
store.dependencies.mainQueue = testScheduler.eraseToAnyScheduler()
@ -97,7 +98,7 @@ class ScanTests: XCTestCase {
func testScanFailed() throws {
let store = TestStore(
initialState: ScanReducer.State(),
reducer: ScanReducer()
reducer: ScanReducer(networkType: .testnet)
)
store.send(.scanFailed) { state in

View File

@ -12,6 +12,8 @@ import LogsHandler
import Models
import WalletStorage
import RecoveryPhraseDisplay
import Settings
import ExportLogs
@testable import secant_testnet
@MainActor

View File

@ -6,10 +6,11 @@
//
import XCTest
@testable import secant_testnet
import ComposableArchitecture
import ZcashLightClientKit
import SwiftUI
import BalanceBreakdown
@testable import secant_testnet
class BalanceBreakdownSnapshotTests: XCTestCase {
func testBalanceBreakdownSnapshot() throws {
@ -21,11 +22,11 @@ class BalanceBreakdownSnapshotTests: XCTestCase {
shieldingFunds: false,
transparentBalance: WalletBalance(verified: Zatoshi(850_000_000), total: Zatoshi(850_000_000)).redacted
),
reducer: BalanceBreakdownReducer()
reducer: BalanceBreakdownReducer(networkType: .testnet)
.dependency(\.sdkSynchronizer, .noOp)
.dependency(\.mainQueue, .immediate)
)
addAttachments(BalanceBreakdownView(store: store))
addAttachments(BalanceBreakdownView(store: store, tokenName: "ZEC"))
}
}

View File

@ -6,9 +6,10 @@
//
import XCTest
@testable import secant_testnet
import ComposableArchitecture
import SwiftUI
import Settings
@testable import secant_testnet
class SettingsSnapshotTests: XCTestCase {
func testSettingsSnapshot() throws {

View File

@ -9,6 +9,7 @@ import XCTest
import ComposableArchitecture
import ZcashLightClientKit
import Models
import WalletEventsFlow
@testable import secant_testnet
class WalletEventsSnapshotTests: XCTestCase {
@ -23,7 +24,7 @@ class WalletEventsSnapshotTests: XCTestCase {
// landing wallet events screen
addAttachments(
name: "\(#function)_initial",
WalletEventsFlowView(store: store)
WalletEventsFlowView(store: store, tokenName: "ZEC")
)
}
@ -76,7 +77,7 @@ class WalletEventsSnapshotTests: XCTestCase {
addAttachments(
name: "\(#function)_WalletEventDetail",
TransactionDetailView(transaction: transaction, store: walletEventsStore)
TransactionDetailView(store: walletEventsStore, transaction: transaction, tokenName: "ZEC")
)
}
@ -129,7 +130,7 @@ class WalletEventsSnapshotTests: XCTestCase {
addAttachments(
name: "\(#function)_WalletEventDetail",
TransactionDetailView(transaction: transaction, store: walletEventsStore)
TransactionDetailView(store: walletEventsStore, transaction: transaction, tokenName: "ZEC")
)
}
@ -187,7 +188,7 @@ class WalletEventsSnapshotTests: XCTestCase {
addAttachments(
name: "\(#function)_WalletEventDetail",
TransactionDetailView(transaction: transaction, store: walletEventsStore)
TransactionDetailView(store: walletEventsStore, transaction: transaction, tokenName: "ZEC")
)
}
@ -241,7 +242,7 @@ class WalletEventsSnapshotTests: XCTestCase {
addAttachments(
name: "\(#function)_WalletEventDetail",
TransactionDetailView(transaction: transaction, store: walletEventsStore)
TransactionDetailView(store: walletEventsStore, transaction: transaction, tokenName: "ZEC")
)
}
}

View File

@ -10,6 +10,7 @@ import ComposableArchitecture
import ZcashLightClientKit
import Pasteboard
import Models
import WalletEventsFlow
@testable import secant_testnet
class WalletEventsTests: XCTestCase {