Following features have been modularized: - BalanceBreakdown - WalletEventsFlow - Scan - ExportLogs - Settings - AlertState generic type cleanup - crashReported TODO added
This commit is contained in:
parent
e3a312ee1a
commit
0d5904e30c
|
@ -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: [
|
||||
|
|
|
@ -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)
|
||||
)
|
||||
}
|
|
@ -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)
|
||||
}
|
||||
}
|
|
@ -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()
|
||||
}
|
||||
}
|
|
@ -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)
|
|
@ -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)
|
||||
)
|
||||
}
|
|
@ -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 {
|
|
@ -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()
|
||||
)
|
|
@ -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(
|
|
@ -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
|
||||
}
|
|
@ -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))
|
|
@ -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)
|
||||
}
|
|
@ -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))
|
|
@ -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),
|
|
@ -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(
|
|
@ -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)
|
||||
}
|
||||
}
|
|
@ -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)
|
||||
)
|
|
@ -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 */;
|
||||
|
|
|
@ -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) {
|
||||
|
|
|
@ -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),
|
||||
|
|
|
@ -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) {
|
||||
|
|
|
@ -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)) {
|
||||
|
|
|
@ -6,6 +6,7 @@ import RecoveryPhraseValidationFlow
|
|||
import Models
|
||||
import RecoveryPhraseDisplay
|
||||
import Welcome
|
||||
import ExportLogs
|
||||
|
||||
struct RootView: View {
|
||||
let store: RootStore
|
||||
|
|
|
@ -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>
|
||||
|
|
|
@ -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)) }
|
||||
|
|
|
@ -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
|
||||
|
|
|
@ -8,6 +8,7 @@
|
|||
import SwiftUI
|
||||
import ComposableArchitecture
|
||||
import Generated
|
||||
import Scan
|
||||
|
||||
struct SendFlowView: View {
|
||||
let store: SendFlowStore
|
||||
|
|
|
@ -9,6 +9,7 @@ import ComposableArchitecture
|
|||
import ZcashLightClientKit
|
||||
import Foundation
|
||||
import Utils
|
||||
import NumberFormatter
|
||||
|
||||
typealias TransactionAmountTextFieldStore = Store<TransactionAmountTextFieldReducer.State, TransactionAmountTextFieldReducer.Action>
|
||||
|
||||
|
|
|
@ -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)
|
||||
|
|
|
@ -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
|
||||
|
|
|
@ -12,6 +12,8 @@ import LogsHandler
|
|||
import Models
|
||||
import WalletStorage
|
||||
import RecoveryPhraseDisplay
|
||||
import Settings
|
||||
import ExportLogs
|
||||
@testable import secant_testnet
|
||||
|
||||
@MainActor
|
||||
|
|
|
@ -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"))
|
||||
}
|
||||
}
|
||||
|
|
|
@ -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 {
|
||||
|
|
|
@ -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")
|
||||
)
|
||||
}
|
||||
}
|
||||
|
|
|
@ -10,6 +10,7 @@ import ComposableArchitecture
|
|||
import ZcashLightClientKit
|
||||
import Pasteboard
|
||||
import Models
|
||||
import WalletEventsFlow
|
||||
@testable import secant_testnet
|
||||
|
||||
class WalletEventsTests: XCTestCase {
|
||||
|
|
Loading…
Reference in New Issue