Add support for manual price entry

This commit is contained in:
2024-08-29 23:17:40 +03:00
parent 46d2c2c7ef
commit 29650a3ea4
5 changed files with 47 additions and 14 deletions

View File

@@ -50,22 +50,21 @@ struct ContentView: View {
Text($0.description)
}
}
.onChange(of: priceSource) { newPriceSource in
priceFetcherDelegator.priceSource = newPriceSource
Task {
await updatePrice()
}
}
HStack {
TextField("", text: $satsViewModel.btcToUsdString)
.disabled(true)
Button(action: {
Task {
await updatePrice()
.disabled(priceSource != .manual)
#if os(iOS)
.keyboardType(.decimalPad)
#endif
if priceSource != .manual {
Button(action: {
Task {
await updatePrice()
}
}) {
Image(systemName: "arrow.clockwise")
}
}) {
Image(systemName: "arrow.clockwise")
}
}
} header: {
@@ -104,6 +103,12 @@ struct ContentView: View {
.task {
await updatePrice()
}
.onChange(of: priceSource) { newPriceSource in
priceFetcherDelegator.priceSource = newPriceSource
Task {
await updatePrice()
}
}
#if os(macOS)
.formStyle(.grouped)
#endif

View File

@@ -0,0 +1,18 @@
//
// ManualPriceFetcher.swift
// SatsPrice
//
// Created by Terry Yiu on 8/29/24.
//
import Foundation
import BigDecimal
/// Fake price fetcher that returns a randomized price. Useful for development testing without requiring a network call.
class ManualPriceFetcher: PriceFetcher {
var price: BigDecimal = 1
func btcToUsd() async throws -> BigDecimal? {
return price
}
}

View File

@@ -11,6 +11,7 @@ import BigDecimal
class PriceFetcherDelegator: PriceFetcher {
private let coinbasePriceFetcher = CoinbasePriceFetcher()
private let coinGeckoPriceFetcher = CoinGeckoPriceFetcher()
private let manualPriceFetcher = ManualPriceFetcher()
#if DEBUG
private let fakePriceFetcher = FakePriceFetcher()
#endif
@@ -27,6 +28,8 @@ class PriceFetcherDelegator: PriceFetcher {
coinbasePriceFetcher
case .coingecko:
coinGeckoPriceFetcher
case .manual:
manualPriceFetcher
#if DEBUG
case .fake:
fakePriceFetcher

View File

@@ -11,14 +11,15 @@ enum PriceSource: CaseIterable, CustomStringConvertible {
static var allCases: [PriceSource] {
#if DEBUG
[.coinbase, .coingecko, .fake]
[.coinbase, .coingecko, .manual, .fake]
#else
[.coinbase, .coingecko]
[.coinbase, .coingecko, .manual]
#endif
}
case coinbase
case coingecko
case manual
#if DEBUG
case fake
@@ -30,6 +31,8 @@ enum PriceSource: CaseIterable, CustomStringConvertible {
"Coinbase"
case .coingecko:
"CoinGecko"
case .manual:
"Manual"
#if DEBUG
case .fake:
"Fake"