Skip to content

Commit 2b41e97

Browse files
committed
fix: preserve active calculator input on rate refresh
1 parent 09d1fb3 commit 2b41e97

3 files changed

Lines changed: 35 additions & 6 deletions

File tree

Bitkit/Components/Widgets/CalculatorWidget.swift

Lines changed: 5 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -64,20 +64,20 @@ struct CalculatorWidget: View {
6464
}
6565
.onChange(of: currency.selectedCurrency) {
6666
refreshCurrencyFields()
67-
refreshDerivedValue()
67+
refreshDerivedValue(preferredSource: calculatorInput.activeInput)
6868
refreshNumberPadConfiguration()
6969
persistValues()
7070
}
7171
.onChange(of: currency.displayUnit) { _, newUnit in
7272
convertBitcoinValue(to: newUnit)
7373
refreshCurrencyFields()
74-
refreshDerivedValue()
74+
refreshDerivedValue(preferredSource: calculatorInput.activeInput)
7575
refreshNumberPadConfiguration()
7676
persistValues()
7777
}
7878
.onChange(of: currency.rates) {
7979
refreshCurrencyFields()
80-
refreshDerivedValue()
80+
refreshDerivedValue(preferredSource: calculatorInput.activeInput)
8181
persistValues()
8282
}
8383
.onChange(of: calculatorInput.submittedKey?.id) {
@@ -264,8 +264,8 @@ struct CalculatorWidget: View {
264264
previousDisplayUnit = newUnit
265265
}
266266

267-
private func refreshDerivedValue() {
268-
if values.shouldRefreshBitcoinFromFiat {
267+
private func refreshDerivedValue(preferredSource: CalculatorMoneyType? = nil) {
268+
if values.refreshSource(activeInput: preferredSource) == .fiat {
269269
refreshBitcoinFromFiat()
270270
} else {
271271
refreshFiatFromBitcoin()

Bitkit/Models/CalculatorWidgetData.swift

Lines changed: 6 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -24,9 +24,14 @@ struct CalculatorWidgetValues: Codable, Equatable {
2424
var shouldRefreshBitcoinFromFiat: Bool {
2525
bitcoinValue.isEmpty && !fiatValue.isEmpty
2626
}
27+
28+
func refreshSource(activeInput: CalculatorMoneyType?) -> CalculatorMoneyType {
29+
if let activeInput { return activeInput }
30+
return shouldRefreshBitcoinFromFiat ? .fiat : .bitcoin
31+
}
2732
}
2833

29-
enum CalculatorMoneyType {
34+
enum CalculatorMoneyType: Equatable {
3035
case bitcoin
3136
case fiat
3237
}

BitkitTests/CalculatorWidgetTests.swift

Lines changed: 24 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -100,6 +100,30 @@ final class CalculatorWidgetTests: XCTestCase {
100100
XCTAssertTrue(values.shouldRefreshBitcoinFromFiat)
101101
}
102102

103+
func testFiatActiveInputStaysRefreshSourceWhenBothValuesExist() {
104+
let values = CalculatorWidgetValues(bitcoinValue: "10000", fiatValue: "12.34")
105+
106+
XCTAssertEqual(values.refreshSource(activeInput: .fiat), .fiat)
107+
}
108+
109+
func testBitcoinActiveInputStaysRefreshSourceWhenFiatOnlyWouldOtherwiseWin() {
110+
let values = CalculatorWidgetValues(bitcoinValue: "", fiatValue: "12.34")
111+
112+
XCTAssertEqual(values.refreshSource(activeInput: .bitcoin), .bitcoin)
113+
}
114+
115+
func testRefreshSourceFallsBackToFiatOnlyValue() {
116+
let values = CalculatorWidgetValues(bitcoinValue: "", fiatValue: "12.34")
117+
118+
XCTAssertEqual(values.refreshSource(activeInput: nil), .fiat)
119+
}
120+
121+
func testRefreshSourceFallsBackToBitcoinWhenBothValuesExist() {
122+
let values = CalculatorWidgetValues(bitcoinValue: "10000", fiatValue: "12.34")
123+
124+
XCTAssertEqual(values.refreshSource(activeInput: nil), .bitcoin)
125+
}
126+
103127
func testPreviewPreservesPersistedFiatOnlyValue() {
104128
let values = CalculatorWidgetValues(bitcoinValue: "", fiatValue: "12.34")
105129

0 commit comments

Comments
 (0)