Skip to content

Commit 34e98a9

Browse files
committed
refactor: simplify HomeView by componentizing the header activity section
1 parent c9a4670 commit 34e98a9

File tree

3 files changed

+123
-83
lines changed

3 files changed

+123
-83
lines changed

BDKSwiftExampleWallet.xcodeproj/project.pbxproj

Lines changed: 4 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -10,6 +10,7 @@
1010
774586B52DB7B2BC00A631E1 /* BalanceView.swift in Sources */ = {isa = PBXBuildFile; fileRef = 774586B42DB7B2BC00A631E1 /* BalanceView.swift */; };
1111
779E70872DB9C98A006E22D3 /* WalletSyncScriptInspector.swift in Sources */ = {isa = PBXBuildFile; fileRef = 779E70862DB9C98A006E22D3 /* WalletSyncScriptInspector.swift */; };
1212
779E70892DB9C9AB006E22D3 /* WalletFullScanScriptInspector.swift in Sources */ = {isa = PBXBuildFile; fileRef = 779E70882DB9C9AB006E22D3 /* WalletFullScanScriptInspector.swift */; };
13+
77AD9F062DBB031D00182E65 /* ActivityHomeHeaderView.swift in Sources */ = {isa = PBXBuildFile; fileRef = 77AD9F052DBB031D00182E65 /* ActivityHomeHeaderView.swift */; };
1314
77F0FDC92DA9A93D00B30E4F /* Connection+Extensions.swift in Sources */ = {isa = PBXBuildFile; fileRef = 77F0FDC82DA9A93700B30E4F /* Connection+Extensions.swift */; };
1415
A733D6D02A81113000F333B4 /* Localizable.xcstrings in Resources */ = {isa = PBXBuildFile; fileRef = A733D6CF2A81113000F333B4 /* Localizable.xcstrings */; };
1516
A73F7A362A3B778E00B87FC6 /* Int+Extensions.swift in Sources */ = {isa = PBXBuildFile; fileRef = A73F7A352A3B778E00B87FC6 /* Int+Extensions.swift */; };
@@ -114,6 +115,7 @@
114115
774586B42DB7B2BC00A631E1 /* BalanceView.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = BalanceView.swift; sourceTree = "<group>"; };
115116
779E70862DB9C98A006E22D3 /* WalletSyncScriptInspector.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = WalletSyncScriptInspector.swift; sourceTree = "<group>"; };
116117
779E70882DB9C9AB006E22D3 /* WalletFullScanScriptInspector.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = WalletFullScanScriptInspector.swift; sourceTree = "<group>"; };
118+
77AD9F052DBB031D00182E65 /* ActivityHomeHeaderView.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = ActivityHomeHeaderView.swift; sourceTree = "<group>"; };
117119
77F0FDC82DA9A93700B30E4F /* Connection+Extensions.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = "Connection+Extensions.swift"; sourceTree = "<group>"; };
118120
A733D6CF2A81113000F333B4 /* Localizable.xcstrings */ = {isa = PBXFileReference; lastKnownFileType = text.json.xcstrings; path = Localizable.xcstrings; sourceTree = "<group>"; };
119121
A73F7A352A3B778E00B87FC6 /* Int+Extensions.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = "Int+Extensions.swift"; sourceTree = "<group>"; };
@@ -325,6 +327,7 @@
325327
isa = PBXGroup;
326328
children = (
327329
AE2381AC2C60578500F6B00C /* ActivityListView.swift */,
330+
77AD9F052DBB031D00182E65 /* ActivityHomeHeaderView.swift */,
328331
AE0C30F62A804A2D008F1EAE /* TransactionListView.swift */,
329332
AE29ED102BBE318A00EB9C4F /* TransactionItemView.swift */,
330333
AEB130C82A44E4850087785B /* TransactionDetailView.swift */,
@@ -733,6 +736,7 @@
733736
AED4CC0C2A1D3A9400CE1831 /* OnboardingView.swift in Sources */,
734737
77F0FDC92DA9A93D00B30E4F /* Connection+Extensions.swift in Sources */,
735738
AE6716012A9AC089005C193F /* KeyServiceError.swift in Sources */,
739+
77AD9F062DBB031D00182E65 /* ActivityHomeHeaderView.swift in Sources */,
736740
AE0C30FB2A804B95008F1EAE /* WalletViewModel.swift in Sources */,
737741
AE49847C2A1BBBD6009951E2 /* BDKSwiftExampleWalletApp.swift in Sources */,
738742
AE6715FF2A9AC066005C193F /* FeeServiceError.swift in Sources */,
Lines changed: 110 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,110 @@
1+
//
2+
// TransactionListHeaderView.swift
3+
// BDKSwiftExampleWallet
4+
//
5+
// Created by Rubens Machion on 24/04/25.
6+
//
7+
8+
import SwiftUI
9+
10+
struct ActivityHomeHeaderView: View {
11+
12+
struct DataSource {
13+
let walletSyncState: WalletSyncState
14+
let progress: Float
15+
let inspectedScripts: UInt64
16+
let totalScripts: UInt64
17+
let needsFullScan: Bool
18+
}
19+
20+
let dataSource: ActivityHomeHeaderView.DataSource
21+
22+
let showAllTransactions: () -> Void
23+
24+
var body: some View {
25+
HStack {
26+
Text("Activity")
27+
Spacer()
28+
if dataSource.walletSyncState == .syncing {
29+
HStack {
30+
if dataSource.progress < 1.0 {
31+
Text("\(dataSource.inspectedScripts)")
32+
.padding(.trailing, -5.0)
33+
.fontWeight(.semibold)
34+
.contentTransition(.numericText())
35+
.transition(.opacity)
36+
37+
if !dataSource.needsFullScan {
38+
Text("/")
39+
.padding(.trailing, -5.0)
40+
.transition(.opacity)
41+
Text("\(dataSource.totalScripts)")
42+
.contentTransition(.numericText())
43+
.transition(.opacity)
44+
}
45+
}
46+
47+
if !dataSource.needsFullScan {
48+
Text(
49+
String(
50+
format: "%.0f%%",
51+
dataSource.progress * 100
52+
)
53+
)
54+
.contentTransition(.numericText())
55+
.transition(.opacity)
56+
}
57+
}
58+
.fontDesign(.monospaced)
59+
.foregroundStyle(.secondary)
60+
.font(.caption2)
61+
.fontWeight(.thin)
62+
.animation(.easeInOut, value: dataSource.inspectedScripts)
63+
.animation(.easeInOut, value: dataSource.totalScripts)
64+
.animation(.easeInOut, value: dataSource.progress)
65+
}
66+
HStack {
67+
HStack(spacing: 5) {
68+
if dataSource.walletSyncState == .syncing {
69+
Image(systemName: "slowmo")
70+
.symbolEffect(
71+
.variableColor.cumulative
72+
)
73+
} else if dataSource.walletSyncState == .synced {
74+
Image(systemName: "checkmark.circle.fill")
75+
.foregroundStyle(
76+
dataSource.walletSyncState == .synced
77+
? .green : .secondary
78+
)
79+
} else if dataSource.walletSyncState == .notStarted {
80+
Image(systemName: "arrow.clockwise")
81+
} else {
82+
Image(
83+
systemName: "person.crop.circle.badge.exclamationmark"
84+
)
85+
}
86+
}
87+
.contentTransition(.symbolEffect(.replace.offUp))
88+
89+
}
90+
.foregroundStyle(.secondary)
91+
.font(.caption)
92+
93+
if dataSource.walletSyncState == .synced {
94+
Button {
95+
self.showAllTransactions()
96+
} label: {
97+
HStack(spacing: 2) {
98+
Text("Show All")
99+
Image(systemName: "arrow.right")
100+
}
101+
.font(.caption)
102+
.foregroundStyle(.secondary)
103+
.fontWeight(.regular)
104+
}
105+
}
106+
107+
}
108+
.fontWeight(.bold)
109+
}
110+
}

BDKSwiftExampleWallet/View/WalletView.swift

Lines changed: 9 additions & 83 deletions
Original file line numberDiff line numberDiff line change
@@ -42,90 +42,16 @@ struct WalletView: View {
4242
}
4343

4444
VStack {
45-
HStack {
46-
Text("Activity")
47-
Spacer()
48-
if viewModel.walletSyncState == .syncing {
49-
HStack {
50-
if viewModel.progress < 1.0 {
51-
Text("\(viewModel.inspectedScripts)")
52-
.padding(.trailing, -5.0)
53-
.fontWeight(.semibold)
54-
.contentTransition(.numericText())
55-
.transition(.opacity)
56-
57-
if !viewModel.bdkClient.needsFullScan() {
58-
Text("/")
59-
.padding(.trailing, -5.0)
60-
.transition(.opacity)
61-
Text("\(viewModel.totalScripts)")
62-
.contentTransition(.numericText())
63-
.transition(.opacity)
64-
}
65-
}
66-
67-
if !viewModel.bdkClient.needsFullScan() {
68-
Text(
69-
String(
70-
format: "%.0f%%",
71-
viewModel.progress * 100
72-
)
73-
)
74-
.contentTransition(.numericText())
75-
.transition(.opacity)
76-
}
77-
}
78-
.fontDesign(.monospaced)
79-
.foregroundStyle(.secondary)
80-
.font(.caption2)
81-
.fontWeight(.thin)
82-
.animation(.easeInOut, value: viewModel.inspectedScripts)
83-
.animation(.easeInOut, value: viewModel.totalScripts)
84-
.animation(.easeInOut, value: viewModel.progress)
85-
}
86-
HStack {
87-
HStack(spacing: 5) {
88-
if viewModel.walletSyncState == .syncing {
89-
Image(systemName: "slowmo")
90-
.symbolEffect(
91-
.variableColor.cumulative
92-
)
93-
} else if viewModel.walletSyncState == .synced {
94-
Image(systemName: "checkmark.circle.fill")
95-
.foregroundStyle(
96-
viewModel.walletSyncState == .synced
97-
? .green : .secondary
98-
)
99-
} else if viewModel.walletSyncState == .notStarted {
100-
Image(systemName: "arrow.clockwise")
101-
} else {
102-
Image(
103-
systemName: "person.crop.circle.badge.exclamationmark"
104-
)
105-
}
106-
}
107-
.contentTransition(.symbolEffect(.replace.offUp))
108-
109-
}
110-
.foregroundStyle(.secondary)
111-
.font(.caption)
112-
113-
if viewModel.walletSyncState == .synced {
114-
Button {
115-
showAllTransactions = true
116-
} label: {
117-
HStack(spacing: 2) {
118-
Text("Show All")
119-
Image(systemName: "arrow.right")
120-
}
121-
.font(.caption)
122-
.foregroundStyle(.secondary)
123-
.fontWeight(.regular)
124-
}
45+
ActivityHomeHeaderView(
46+
dataSource: .init(
47+
walletSyncState: $viewModel.walletSyncState.wrappedValue,
48+
progress: $viewModel.progress.wrappedValue,
49+
inspectedScripts: $viewModel.inspectedScripts.wrappedValue,
50+
totalScripts: $viewModel.totalScripts.wrappedValue,
51+
needsFullScan: viewModel.bdkClient.needsFullScan()
52+
)) {
53+
showAllTransactions = true
12554
}
126-
127-
}
128-
.fontWeight(.bold)
12955
TransactionListView(
13056
viewModel: .init(),
13157
transactions: viewModel.recentTransactions,

0 commit comments

Comments
 (0)