Skip to content
Open
Show file tree
Hide file tree
Changes from all commits
Commits
Show all changes
27 commits
Select commit Hold shift + click to select a range
d71e3c0
WIP: add public Paykit endpoints
ben-kaufman Apr 25, 2026
11b62ce
fix: align contact add flow with Android
ben-kaufman Apr 27, 2026
c4458e4
fix: complete public Paykit contact payments
ben-kaufman Apr 29, 2026
c863f46
Update CHANGELOG.md
ben-kaufman Apr 29, 2026
16b34dc
fix: surface contact activity load errors
ben-kaufman Apr 29, 2026
85858ee
fix: move contact activity sync out of send views
ben-kaufman Apr 29, 2026
220ee6a
fix: keep contact payment boundaries in view layer
ben-kaufman Apr 29, 2026
3d1f2b2
fix: show contact names in activity rows
ben-kaufman May 4, 2026
edc5e9f
fix: disambiguate contact test models
ben-kaufman May 4, 2026
01aefdd
fix: address public payments review cleanup
ben-kaufman May 4, 2026
98d3e04
refactor: share contact payment route helper
ben-kaufman May 4, 2026
c430f9a
fix: include pubky key format in shared targets
ben-kaufman May 4, 2026
2249d9d
fix: address public payment review followups
ben-kaufman May 4, 2026
7d48489
fix: preserve contact context for fast payments
ben-kaufman May 4, 2026
73971b6
fix: isolate public paykit receive invoice
ben-kaufman May 4, 2026
30ce344
fix: address public paykit review blockers
ben-kaufman May 4, 2026
07b7a2a
chore: align pay contacts lifecycle hook
ben-kaufman May 4, 2026
fac5074
fix: handle optional public invoice description
ben-kaufman May 4, 2026
e037fe7
fix: align public paykit endpoint lifecycle
ben-kaufman May 4, 2026
1b7c140
fix: avoid async autoclosure in paykit refresh
ben-kaufman May 4, 2026
3ea3f58
fix: tighten public paykit lifecycle
ben-kaufman May 4, 2026
5ee3d84
fix: address public paykit cleanup review
ben-kaufman May 4, 2026
a41afa5
fix: align paykit contacts with android
ben-kaufman May 4, 2026
c589229
chore: update paykit bindings to rc5
ben-kaufman May 5, 2026
31b2b28
fix: use network-specific paykit onchain methods
ben-kaufman May 5, 2026
768c3d0
Merge branch 'master' into codex-paykit-public-endpoints-pr527
ovitrif May 5, 2026
2881537
fix: address paykit review feedback
ben-kaufman May 5, 2026
File filter

Filter by extension

Filter by extension


Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
10 changes: 6 additions & 4 deletions Bitkit.xcodeproj/project.pbxproj
Original file line number Diff line number Diff line change
Expand Up @@ -87,6 +87,7 @@
Extensions/PaymentDetails.swift,
Models/BlocktankNotificationType.swift,
Models/LnPeer.swift,
Models/PubkyPublicKeyFormat.swift,
Models/Toast.swift,
Models/Transfer.swift,
Models/TransferType.swift,
Expand Down Expand Up @@ -117,6 +118,7 @@
Extensions/PaymentDetails.swift,
Models/BlocktankNotificationType.swift,
Models/LnPeer.swift,
Models/PubkyPublicKeyFormat.swift,
Models/Toast.swift,
Services/CoreService.swift,
Services/GeoService.swift,
Expand Down Expand Up @@ -904,8 +906,8 @@
isa = XCRemoteSwiftPackageReference;
repositoryURL = "https://github.com/pubky/paykit-rs";
requirement = {
kind = revision;
revision = cd1253291b1582759d569372d5942b8871527ea1;
kind = exactVersion;
version = 0.1.0-rc5;
};
};
18D65DFE2EB9649F00252335 /* XCRemoteSwiftPackageReference "vss-rust-client-ffi" */ = {
Expand Down Expand Up @@ -936,8 +938,8 @@
isa = XCRemoteSwiftPackageReference;
repositoryURL = "https://github.com/synonymdev/bitkit-core";
requirement = {
kind = revision;
revision = 99bd86bb60c1f14e8ce8a6356cd2ab36f222fc69;
kind = exactVersion;
version = 0.1.58;
};
};
96E20CD22CB6D91A00C24149 /* XCRemoteSwiftPackageReference "CodeScanner" */ = {
Expand Down

Some generated files are not rendered by default. Learn more about how customized files appear on GitHub.

1 change: 1 addition & 0 deletions Bitkit/AppScene.swift
Original file line number Diff line number Diff line change
Expand Up @@ -560,6 +560,7 @@ struct AppScene: View {
Task {
await clearDeliveredNotifications()
await LightningService.shared.reconnectPeers()
await wallet.refreshPublicPaykitEndpointsOnForeground()
}
}
}
Expand Down
7 changes: 6 additions & 1 deletion Bitkit/Components/Activity/ActivityList.swift
Original file line number Diff line number Diff line change
Expand Up @@ -3,6 +3,7 @@ import SwiftUI

struct ActivityList: View {
@EnvironmentObject var activity: ActivityListViewModel
@EnvironmentObject var contactsManager: ContactsManager
@EnvironmentObject var feeEstimatesManager: FeeEstimatesManager
@State private var isHorizontalSwipe = false

Expand All @@ -28,7 +29,11 @@ struct ActivityList: View {

case let .activity(item):
NavigationLink(value: Route.activityDetail(item)) {
ActivityRow(item: item, feeEstimates: feeEstimatesManager.estimates)
ActivityRow(
item: item,
feeEstimates: feeEstimatesManager.estimates,
contact: item.contact(in: contactsManager.contacts)
)
}
.accessibilityIdentifier("Activity-\(index)")
.disabled(isHorizontalSwipe)
Expand Down
42 changes: 42 additions & 0 deletions Bitkit/Components/ContactAvatarLetter.swift
Original file line number Diff line number Diff line change
@@ -0,0 +1,42 @@
import SwiftUI

struct ContactAvatarLetter: View {
let source: String
let size: CGFloat
var backgroundColor: Color = .white.opacity(0.1)
var strokeColor: Color?
var strokeWidth: CGFloat = 0

private var letter: String {
String(source.prefix(1)).uppercased()
}

var body: some View {
Circle()
.fill(backgroundColor)
.frame(width: size, height: size)
.overlay {
avatarText
}
.overlay {
if let strokeColor, strokeWidth > 0 {
Circle()
.stroke(strokeColor, lineWidth: strokeWidth)
}
}
.accessibilityHidden(true)
}

@ViewBuilder
private var avatarText: some View {
if size >= 72 {
HeadlineText(letter)
} else if size >= 56 {
TitleText(letter)
} else if size >= 44 {
BodyMSBText(letter)
} else {
CaptionBText(letter, textColor: .textPrimary)
}
}
}
2 changes: 1 addition & 1 deletion Bitkit/Constants/Env.swift
Original file line number Diff line number Diff line change
Expand Up @@ -272,7 +272,7 @@ enum Env {
case .bitcoin:
return "/pub/bitkit.to/:rw,/pub/pubky.app/:r,/pub/paykit/v0/:rw"
default:
return "/pub/staging.bitkit.to/:rw,/pub/staging.pubky.app/:r,/pub/staging.paykit/v0/:rw"
return "/pub/staging.bitkit.to/:rw,/pub/staging.pubky.app/:r,/pub/paykit/v0/:rw"
}
}

Expand Down
18 changes: 18 additions & 0 deletions Bitkit/Extensions/Activity+Contact.swift
Original file line number Diff line number Diff line change
@@ -0,0 +1,18 @@
import BitkitCore

extension Activity {
func contact(in contacts: [PubkyContact]) -> PubkyContact? {
guard let contactPublicKey else { return nil }
return contacts.first(where: { PubkyPublicKeyFormat.matches($0.publicKey, contactPublicKey) })
}

private var contactPublicKey: String? {
switch self {
case let .lightning(lightning):
return lightning.contact

case let .onchain(onchain):
return onchain.contact
}
}
}
1 change: 1 addition & 0 deletions Bitkit/MainNavView.swift
Original file line number Diff line number Diff line change
Expand Up @@ -385,6 +385,7 @@ struct MainNavView: View {
}
case .contactsIntro: ContactsIntroView()
case let .contactDetail(publicKey): ContactDetailView(publicKey: publicKey)
case let .contactActivity(publicKey): ContactActivityView(publicKey: publicKey)
case .contactImportOverview:
if let fallbackRoute = fallbackRouteForMissingPendingImport(hasPendingImport: contactsManager.hasPendingImport) {
missingPendingImportView(fallbackRoute: fallbackRoute)
Expand Down
Loading
Loading