2022-06-23 02:05:34 -07:00
|
|
|
//
|
|
|
|
// WalletEvent.swift
|
|
|
|
// secant-testnet
|
|
|
|
//
|
|
|
|
// Created by Lukáš Korba on 20.06.2022.
|
|
|
|
//
|
|
|
|
|
|
|
|
import Foundation
|
|
|
|
import ComposableArchitecture
|
|
|
|
import SwiftUI
|
|
|
|
import ZcashLightClientKit
|
|
|
|
|
|
|
|
// MARK: - Model
|
|
|
|
|
2023-02-13 11:32:50 -08:00
|
|
|
struct WalletEvent: Equatable, Identifiable, Redactable {
|
2022-06-23 02:05:34 -07:00
|
|
|
enum WalletEventState: Equatable {
|
|
|
|
case send(TransactionState)
|
|
|
|
case pending(TransactionState)
|
|
|
|
case received(TransactionState)
|
|
|
|
case failed(TransactionState)
|
|
|
|
case shielded(Zatoshi)
|
|
|
|
case walletImport(BlockHeight)
|
|
|
|
}
|
|
|
|
|
|
|
|
let id: String
|
|
|
|
let state: WalletEventState
|
2023-02-06 00:38:34 -08:00
|
|
|
var timestamp: TimeInterval?
|
2022-06-23 02:05:34 -07:00
|
|
|
}
|
|
|
|
|
|
|
|
// MARK: - Rows
|
|
|
|
|
|
|
|
extension WalletEvent {
|
2022-06-28 00:38:08 -07:00
|
|
|
@ViewBuilder func rowView(_ viewStore: WalletEventsFlowViewStore) -> some View {
|
2022-06-23 02:05:34 -07:00
|
|
|
switch state {
|
2022-06-30 04:59:03 -07:00
|
|
|
case .send(let transaction),
|
|
|
|
.pending(let transaction),
|
|
|
|
.received(let transaction),
|
|
|
|
.failed(let transaction):
|
2022-06-23 02:05:34 -07:00
|
|
|
TransactionRowView(transaction: transaction)
|
|
|
|
case .shielded(let zatoshi):
|
2023-01-20 05:55:08 -08:00
|
|
|
// TODO: [#390] implement design once shielding is supported
|
2022-07-08 11:27:18 -07:00
|
|
|
// https://github.com/zcash/secant-ios-wallet/issues/390
|
2023-03-07 13:18:17 -08:00
|
|
|
Text(L10n.WalletEvent.Row.shielded(zatoshi.decimalString()))
|
2023-03-06 06:14:18 -08:00
|
|
|
.padding(.leading, 30)
|
2022-06-23 02:05:34 -07:00
|
|
|
case .walletImport:
|
2023-01-20 05:55:08 -08:00
|
|
|
// TODO: [#391] implement design once shielding is supported
|
2022-07-08 11:27:18 -07:00
|
|
|
// https://github.com/zcash/secant-ios-wallet/issues/391
|
2023-03-07 13:18:17 -08:00
|
|
|
Text(L10n.WalletEvent.Row.import)
|
2023-03-06 06:14:18 -08:00
|
|
|
.padding(.leading, 30)
|
2022-06-23 02:05:34 -07:00
|
|
|
}
|
|
|
|
}
|
|
|
|
}
|
|
|
|
|
|
|
|
// MARK: - Details
|
|
|
|
|
|
|
|
extension WalletEvent {
|
2022-09-22 12:20:46 -07:00
|
|
|
@ViewBuilder func detailView(_ store: WalletEventsFlowStore) -> some View {
|
2022-06-23 02:05:34 -07:00
|
|
|
switch state {
|
2022-06-30 04:59:03 -07:00
|
|
|
case .send(let transaction),
|
|
|
|
.pending(let transaction),
|
|
|
|
.received(let transaction),
|
|
|
|
.failed(let transaction):
|
2022-09-22 12:20:46 -07:00
|
|
|
TransactionDetailView(transaction: transaction, store: store)
|
2022-06-23 02:05:34 -07:00
|
|
|
case .shielded(let zatoshi):
|
2023-01-20 05:55:08 -08:00
|
|
|
// TODO: [#390] implement design once shielding is supported
|
2022-07-08 11:27:18 -07:00
|
|
|
// https://github.com/zcash/secant-ios-wallet/issues/390
|
2023-03-07 13:18:17 -08:00
|
|
|
Text(L10n.WalletEvent.Detail.shielded(zatoshi.decimalString()))
|
2022-06-23 02:05:34 -07:00
|
|
|
case .walletImport:
|
2023-01-20 05:55:08 -08:00
|
|
|
// TODO: [#391] implement design once shielding is supported
|
2022-07-08 11:27:18 -07:00
|
|
|
// https://github.com/zcash/secant-ios-wallet/issues/391
|
2023-03-07 13:18:17 -08:00
|
|
|
Text(L10n.WalletEvent.Detail.import)
|
2022-06-23 02:05:34 -07:00
|
|
|
}
|
|
|
|
}
|
|
|
|
}
|
|
|
|
|
|
|
|
// MARK: - Placeholders
|
|
|
|
|
|
|
|
private extension WalletEvent {
|
|
|
|
static func randomWalletEventState() -> WalletEvent.WalletEventState {
|
2022-07-08 11:27:18 -07:00
|
|
|
switch Int.random(in: 0..<6) {
|
|
|
|
case 1: return .received(.statePlaceholder(.received))
|
|
|
|
case 2: return .failed(.statePlaceholder(.failed))
|
2022-07-19 11:56:46 -07:00
|
|
|
case 3: return .shielded(Zatoshi(234_000_000))
|
2022-06-23 02:05:34 -07:00
|
|
|
case 4: return .walletImport(BlockHeight(1_629_724))
|
2022-07-08 11:27:18 -07:00
|
|
|
case 5: return .pending(.statePlaceholder(.pending))
|
2022-06-23 02:05:34 -07:00
|
|
|
default: return .send(.placeholder)
|
|
|
|
}
|
|
|
|
}
|
2023-03-06 06:14:18 -08:00
|
|
|
|
|
|
|
static func mockedWalletEventState(atIndex: Int) -> WalletEvent.WalletEventState {
|
|
|
|
switch atIndex % 4 {
|
|
|
|
case 0: return .received(.statePlaceholder(.received))
|
|
|
|
case 1: return .failed(.statePlaceholder(.failed))
|
|
|
|
case 2: return .pending(.statePlaceholder(.pending))
|
|
|
|
case 3: return .send(.placeholder)
|
|
|
|
default: return .send(.placeholder)
|
|
|
|
}
|
|
|
|
}
|
2022-06-23 02:05:34 -07:00
|
|
|
}
|
|
|
|
|
|
|
|
extension IdentifiedArrayOf where Element == WalletEvent {
|
|
|
|
static var placeholder: IdentifiedArrayOf<WalletEvent> {
|
|
|
|
return .init(
|
|
|
|
uniqueElements: (0..<30).map {
|
|
|
|
WalletEvent(
|
|
|
|
id: String($0),
|
2023-03-06 06:14:18 -08:00
|
|
|
state: WalletEvent.mockedWalletEventState(atIndex: $0),
|
2022-06-23 02:05:34 -07:00
|
|
|
timestamp: 1234567
|
|
|
|
)
|
|
|
|
}
|
|
|
|
)
|
|
|
|
}
|
|
|
|
}
|