Skip to content

Commit 85e74ab

Browse files
vitnehasilclaude
andcommitted
iOS: fix portfolio value history, scrub dots, inline nav titles
- Portfolio value: use tx.price (historical) instead of currentPrice for chart data and KPI snapshots — fixes incorrect historical portfolio valuation - Chart scrub: add PointMarks (dots) at intersections of the vertical RuleMark with each visible series line (matching Android) - Nav titles: Portfolio, Notifications, Settings use inline display mode to reduce vertical space Co-Authored-By: Claude Opus 4.6 (1M context) <noreply@anthropic.com>
1 parent 58a3e35 commit 85e74ab

4 files changed

Lines changed: 37 additions & 2 deletions

File tree

accbot-ios/AccBot/Presentation/Screens/Notifications/NotificationsView.swift

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -46,6 +46,7 @@ struct NotificationsView: View {
4646
}
4747
.background(colors.background)
4848
.navigationTitle(String(localized: "Notifications"))
49+
.navigationBarTitleDisplayMode(.inline)
4950
.toolbarBackground(colors.background, for: .navigationBar)
5051
.toolbarBackground(.visible, for: .navigationBar)
5152
.toolbar {

accbot-ios/AccBot/Presentation/Screens/Portfolio/PortfolioView.swift

Lines changed: 33 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -38,6 +38,7 @@ struct PortfolioView: View {
3838
}
3939
.background(colors.background)
4040
.navigationTitle(String(localized: "Portfolio"))
41+
.navigationBarTitleDisplayMode(.inline)
4142
.toolbarBackground(colors.background, for: .navigationBar)
4243
.toolbarBackground(.visible, for: .navigationBar)
4344
.toolbar {
@@ -204,6 +205,28 @@ struct PortfolioView: View {
204205

205206
private var isScrubbing: Bool { selectedDate != nil }
206207

208+
/// Find the nearest chart point per visible series for the scrub date.
209+
private func scrubPoints(for date: Date) -> [PortfolioViewModel.ChartPoint] {
210+
let target = date.timeIntervalSince1970
211+
var result = [PortfolioViewModel.ChartPoint]()
212+
let grouped = Dictionary(grouping: viewModel.chartData) { $0.series }
213+
for (_, points) in grouped {
214+
guard !points.isEmpty else { continue }
215+
var lo = 0, hi = points.count - 1
216+
while lo < hi {
217+
let mid = (lo + hi) / 2
218+
if points[mid].date.timeIntervalSince1970 < target { lo = mid + 1 }
219+
else { hi = mid }
220+
}
221+
let candidates = [max(0, lo - 1), min(lo, points.count - 1)]
222+
if let nearest = candidates.map({ points[$0] })
223+
.min(by: { abs($0.date.timeIntervalSince(date)) < abs($1.date.timeIntervalSince(date)) }) {
224+
result.append(nearest)
225+
}
226+
}
227+
return result
228+
}
229+
207230
// MARK: - KPI Section
208231

209232
private var kpiSection: some View {
@@ -393,6 +416,16 @@ struct PortfolioView: View {
393416
RuleMark(x: .value("Selected", date))
394417
.foregroundStyle(colors.onSurfaceVariant)
395418
.lineStyle(StrokeStyle(lineWidth: 1, dash: [4, 4]))
419+
420+
// Dots at intersection of RuleMark with each visible series
421+
ForEach(scrubPoints(for: date)) { point in
422+
PointMark(
423+
x: .value("Date", point.date),
424+
y: .value("Value", point.value)
425+
)
426+
.foregroundStyle(by: .value("Series", point.series.localizedName))
427+
.symbolSize(36)
428+
}
396429
}
397430
}
398431
.chartForegroundStyleScale([

accbot-ios/AccBot/Presentation/Screens/Portfolio/PortfolioViewModel.swift

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -443,7 +443,7 @@ final class PortfolioViewModel: ObservableObject {
443443
var snapshots = [KpiSnapshot]()
444444
for (index, tx) in zoomTransactions.enumerated() {
445445
let entry = cumulativeByTimestamp[tx.executedAt.timeIntervalSince1970]!
446-
let pv = entry.accumulated * (currentPrice ?? tx.price)
446+
let pv = entry.accumulated * tx.price
447447
let roi: Decimal? = entry.costBasis > 0
448448
? ((pv - entry.costBasis) / entry.costBasis) * 100
449449
: nil
@@ -490,7 +490,7 @@ final class PortfolioViewModel: ObservableObject {
490490
for (index, tx) in zoomTransactions.enumerated() {
491491
let value: Decimal
492492
switch series {
493-
case .portfolioValue: value = accumulatedByIndex[index] * (currentPrice ?? tx.price)
493+
case .portfolioValue: value = accumulatedByIndex[index] * tx.price
494494
case .costBasis: value = costBasisByIndex[index]
495495
case .cryptoPrice: value = tx.price
496496
case .avgBuyPrice: value = avgBuyPriceByIndex[index]

accbot-ios/AccBot/Presentation/Screens/Settings/SettingsView.swift

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -22,6 +22,7 @@ struct SettingsView: View {
2222
.maxFormWidth()
2323
.background(colors.background)
2424
.navigationTitle(String(localized: "Settings"))
25+
.navigationBarTitleDisplayMode(.inline)
2526
.toolbarBackground(colors.background, for: .navigationBar)
2627
.toolbarBackground(.visible, for: .navigationBar)
2728
.alert(

0 commit comments

Comments
 (0)