Skip to content
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
Show all changes
122 commits
Select commit Hold shift + click to select a range
d87fb61
chore: point iOS package to forked urnetwork-sdk checkout
Ryanmello07 Jul 3, 2026
6ed515e
ci: add beta build workflow for unsigned iOS IPA
Ryanmello07 Jul 3, 2026
21545f2
ci: use stable Go version for beta build
Ryanmello07 Jul 3, 2026
fa47d17
ci: clone urnetwork/connect next to SDK for go.mod replace
Ryanmello07 Jul 3, 2026
8a23ee3
ci: clone connect into workspace root for app workflows
Ryanmello07 Jul 3, 2026
da1661f
ci: check out glog dependency and use forked connect for beta build
Ryanmello07 Jul 3, 2026
e991594
ci: check out iOS repo as sibling of urnetwork-sdk so Package.swift c…
Ryanmello07 Jul 3, 2026
7ee9b98
feat(sdk-service): add authWalletChallenge to UrApiService
Ryanmello07 Jul 4, 2026
b1eff2d
feat(login): add Solana wallet-challenge fetch to LoginInitialViewModel
Ryanmello07 Jul 4, 2026
30e768c
fix(login): sign server-issued challenge for Solana login (iOS)
Ryanmello07 Jul 4, 2026
91d1ab5
fix(login): re-sign a fresh challenge before navigating to create-net…
Ryanmello07 Jul 4, 2026
faf62cc
fix: wrap authWalletChallenge SDK callback in SdkCallback helper
Ryanmello07 Jul 4, 2026
c603552
ios: fix AuthNetworkClientArgs field rename after connect/sdk merge
Ryanmello07 Jul 11, 2026
a1c8977
Merge branch 'urnetwork:main' into beta/custom-server
Ryanmello07 Jul 11, 2026
a024cad
ios: add Change Network API selector (iOS + macOS)
Ryanmello07 Jul 11, 2026
5f46fc7
Merge branch 'beta/custom-server' of https://github.com/Ryanmello07/u…
Ryanmello07 Jul 11, 2026
0cd43df
ios: fix LocalizedStringKey conversion in NetworkServerSheet
Ryanmello07 Jul 11, 2026
4f7e43f
ci: build and release a macOS app archive alongside iOS
Ryanmello07 Jul 11, 2026
1c0b75c
ios: remove Solana sign-in button from macOS login screen
Ryanmello07 Jul 11, 2026
00525d4
fix(settings): use renamed deviceDescription field on NetworkClientInfo
Ryanmello07 Jul 11, 2026
87b74f4
fix(ios): address Copilot review feedback on apple#327
Ryanmello07 Jul 11, 2026
0354201
fix(ios): remove unused URnetworkSdk import in NetworkServerSheet.swift
Ryanmello07 Jul 11, 2026
de344a0
fix(ios): strip port before deriving api./connect. subdomains
Ryanmello07 Jul 11, 2026
13e79c5
ad and tracker blocker
xcolwell Jul 12, 2026
a2c5474
feat(ios): use server-issued challenges for Bittensor sign-in, matchi…
Ryanmello07 Jul 12, 2026
203548b
docs(ios): confirm Bittensor challenge blockchain identifier against …
Ryanmello07 Jul 12, 2026
7ef3be7
ci: trigger rebuild with updated SDK fork (ip_blocker methods)
Ryanmello07 Jul 12, 2026
e578559
ci: trigger rebuild with updated connect fork (ip_blocker types)
Ryanmello07 Jul 12, 2026
1003bd7
fix(ios): handle .bittensor case in isWalletAppInstalled switch
Ryanmello07 Jul 12, 2026
9612d49
fix(ios): copilot review fixes — empty template guard, IPv6 normaliza…
Ryanmello07 Jul 13, 2026
964a778
merge: bring in upstream main (ad and tracker blocker) to beta/custom…
Ryanmello07 Jul 13, 2026
db5a45c
Potential fix for pull request finding
Ryanmello07 Jul 13, 2026
390e788
fix(build): remove duplicate signInWithBittensor parameter from merge
Ryanmello07 Jul 13, 2026
c95259b
merge: sync beta/custom-server with upstream main
Ryanmello07 Jul 13, 2026
8e82c05
fix(ios): solana login + network change refresh
Ryanmello07 Jul 13, 2026
2f0ecd2
fix(ios): force-recreate LoginNavigationView on network change
Ryanmello07 Jul 14, 2026
ecde12b
merge: sync beta/custom-server with upstream main
Ryanmello07 Jul 14, 2026
3db7f38
fix(ios): make UrApiService resolve the active api live, not once at …
Ryanmello07 Jul 14, 2026
48d336a
Merge branch 'urnetwork:main' into beta/custom-server
Ryanmello07 Jul 15, 2026
1c4a133
ci: trigger beta build on PRs to beta/custom-server
Ryanmello07 Jul 15, 2026
f54acb2
Merge pull request #3 from Ryanmello07/feat/ci-pr-trigger-clean
Ryanmello07 Jul 15, 2026
6618d9e
feat: add seedphrase sign-in and instant sign-up, remove guest mode
Ryanmello07 Jul 15, 2026
201f0fb
fix: address code review findings — dead code, seedphrase normalizati…
Ryanmello07 Jul 15, 2026
7b90467
fix: resolve 6 Xcode build errors from CI
Ryanmello07 Jul 15, 2026
7097b3e
fix: refactor SeedphraseDisplayView to resolve Swift compiler timeout
Ryanmello07 Jul 15, 2026
4326bee
fix: apply subagent review findings — fix maxWidth layout order
Ryanmello07 Jul 15, 2026
f767754
fix: rename surfaceColor to tintedBackgroundBase to match Theme struct
Ryanmello07 Jul 15, 2026
0fac0ac
fix: resolve 5 macOS build errors with platform guards
Ryanmello07 Jul 15, 2026
e4b37f5
fix: add presentSeedphraseLogin and presentCreateInstant to iOS SSOBu…
Ryanmello07 Jul 15, 2026
0cf2f1e
Merge branch 'urnetwork:main' into beta/custom-server
Ryanmello07 Jul 16, 2026
3fa50e1
ci: upload IPA + macOS artifacts to PR checks
Ryanmello07 Jul 16, 2026
b3e1fd7
ci: upload IPA + macOS artifacts to PR checks
Ryanmello07 Jul 16, 2026
da13f2a
feat: add account management UI for seedphrase, auth methods, and net…
Ryanmello07 Jul 16, 2026
3e6bcb5
feat: add seedphrase and auth method management to macOS settings form
Ryanmello07 Jul 16, 2026
2e01a48
[verified] fix: address code review findings — seedphrase error handl…
Ryanmello07 Jul 16, 2026
ea4666d
fix: close unclosed extension in UrApiService.swift causing build fai…
Ryanmello07 Jul 16, 2026
10c7429
fix: resolve 6 Swift compilation errors found by CI
Ryanmello07 Jul 16, 2026
68bea3c
fix: use Go-style gomobile setter naming SetUserAuth/SetPassword
Ryanmello07 Jul 16, 2026
44d89d0
fix: revert SetUserAuth/SetPassword to direct property syntax
Ryanmello07 Jul 17, 2026
b5bfe2b
fix: remove iOS-only keyboardType param from AddAuthSheet for macOS c…
Ryanmello07 Jul 17, 2026
9cddcd7
fix: remove multiplier section from macOS form to fix scope errors
Ryanmello07 Jul 17, 2026
80ce1e7
fix: address real testing feedback — auth methods, seedphrase state, …
Ryanmello07 Jul 17, 2026
db387f1
fix: remove problematic Google/Apple sign-in button imports
Ryanmello07 Jul 17, 2026
8b4a82a
fix: remove stale Apple/wallet helper code that referenced removed types
Ryanmello07 Jul 17, 2026
45a49c8
fix: UI fixes for seedphrase detection, auth method listing, and AddA…
Ryanmello07 Jul 17, 2026
b9bc637
fix: restore working Apple/Google/Wallet buttons in AddAuthSheet
Ryanmello07 Jul 17, 2026
d30e1af
fix: add GoogleSignIn import and fix macOS wallet guard
Ryanmello07 Jul 17, 2026
0cae30a
fix: move GoogleSignIn import outside iOS guard, guard handleAppleRes…
Ryanmello07 Jul 17, 2026
36864ff
fix: remove platform guards from imports (same pattern as LoginInitia…
Ryanmello07 Jul 17, 2026
37f287b
feat: working wallet connection in AddAuthSheet
Ryanmello07 Jul 17, 2026
1000711
fix: break up SettingsView onOpenURL into handleDeepLink method, add …
Ryanmello07 Jul 17, 2026
4999256
fix: simplify onOpenURL, remove handleDeepLink multiplier code, add W…
Ryanmello07 Jul 17, 2026
714d371
fix: break up SettingsView body expression into computed property to …
Ryanmello07 Jul 17, 2026
55f013c
fix: use @ViewBuilder function instead of computed property for solan…
Ryanmello07 Jul 17, 2026
788b278
fix: revert SolanaSignMessageSheet extraction, use simple handleWalle…
Ryanmello07 Jul 17, 2026
db24106
fix: wrap SolanaSignMessageSheet in Group to reduce type-check comple…
Ryanmello07 Jul 17, 2026
e95cae4
fix: extract SettingsForm_iOS into computed property to fix Swift typ…
Ryanmello07 Jul 17, 2026
3caf83e
fix: fully extract iOS view chain into iosBody computed property to r…
Ryanmello07 Jul 17, 2026
799aaef
fix: wrap base chain in AnyView to break type-checker's expression depth
Ryanmello07 Jul 17, 2026
fb6d2b8
fix: split modifier chain with intermediate let bases for type-checker
Ryanmello07 Jul 17, 2026
de5d13b
fix: move auth sheet/dialog modifiers to overlay computed property to…
Ryanmello07 Jul 17, 2026
9757a0a
fix: move onOpenURL to authModifiers, keep main chain at original len…
Ryanmello07 Jul 17, 2026
a1e75e9
fix: wrap inner modifier chain in Group {}, attach auth modifiers out…
Ryanmello07 Jul 17, 2026
a113463
fix: extract every sheet content into computed properties, use conten…
Ryanmello07 Jul 17, 2026
340c583
fix: use ZStack with separately type-checked computed properties for …
Ryanmello07 Jul 17, 2026
5ee6814
fix: keep body chain at 8 modifiers (+1 for .overlay), move all auth …
Ryanmello07 Jul 17, 2026
9b122c0
fix: ZStack with settingsForm having minimal chain (3 modifiers), all…
Ryanmello07 Jul 17, 2026
7b8ae57
fix: split all modifier chains into independent @ViewBuilder computed…
Ryanmello07 Jul 17, 2026
796d6e9
fix: Color.clear as base, all dialogs/sheets/onOpenURL on Color.clear…
Ryanmello07 Jul 17, 2026
8461e34
fix: fix syntax error - ) vs } on onChange trailing closure end
Ryanmello07 Jul 17, 2026
1b7612d
fix: extract auth modifiers into separate SettingsAuthModifiersView s…
Ryanmello07 Jul 17, 2026
84ca166
fix: move ALL modifiers (task/alert/onChange/dialogs/sheets/onOpenURL…
Ryanmello07 Jul 17, 2026
f30701c
fix: split modifiers into SettingsCoreModifiersView (6 modifiers) and…
Ryanmello07 Jul 17, 2026
674ccec
fix: use inline let bindings in body to give type-checker concrete ty…
Ryanmello07 Jul 17, 2026
bdae449
chore: remove unused SettingsAuthModifiersView and SettingsCoreModifi…
Ryanmello07 Jul 17, 2026
f763420
fix: restore ViewModel properties dropped by upstream merge (presentS…
Ryanmello07 Jul 17, 2026
637163c
refactor: use backend auth_types array instead of local hasSeedphrase…
Ryanmello07 Jul 18, 2026
b6d92f5
feat: refresh auth_types from server after add/remove/seedphrase oper…
Ryanmello07 Jul 18, 2026
9d23123
ci: trigger rebuild with updated SDK AuthTypes support
Ryanmello07 Jul 18, 2026
852e9d6
fix: unwrap optional SdkStringList for networkUser.authTypes
Ryanmello07 Jul 18, 2026
9778030
chore: remove scratch planning doc from repo
Ryanmello07 Jul 18, 2026
07a2b36
fix: show seedphrase after instant account creation on macOS
Ryanmello07 Jul 18, 2026
144eb7b
fix: AddAuthSheet stale UI, uncancelled wallet poll, dead code
Ryanmello07 Jul 18, 2026
567ae48
fix: macOS Sign-In Methods can't list or remove multiple auth methods
Ryanmello07 Jul 18, 2026
8cb76da
fix: Profile Save uses live auth_types, not the frozen legacy authType
Ryanmello07 Jul 18, 2026
287a124
fix: gate seedphrase Sign In on word count, not just non-empty
Ryanmello07 Jul 18, 2026
6ed6f8f
fix: createInstantAccount ignores verificationRequired unlike createN…
Ryanmello07 Jul 18, 2026
7cf9297
fix: dim macOS seedphrase/instant-account buttons when disabled
Ryanmello07 Jul 18, 2026
0ac09e1
fix: don't refresh network user after a failed seedphrase/auth operation
Ryanmello07 Jul 18, 2026
d67c276
fix: include phone auth in ProfileView's needsNameClaim identity check
Ryanmello07 Jul 18, 2026
da38604
fix: stale UI after network name change, and recognize wallet as iden…
Ryanmello07 Jul 19, 2026
02d4b03
fix: refresh JWT when the app returns to foreground, not just on rename
Ryanmello07 Jul 19, 2026
58307d9
feat(ios,macos): add seedphrase sign-in, instant account creation, an…
Ryanmello07 Jul 19, 2026
0c71813
Merge urnetwork/apple:main (perf and correctness fixes wave) into bet…
Ryanmello07 Jul 21, 2026
0b44742
Merge beta/custom-server (upstream perf/correctness wave) into feat/s…
Ryanmello07 Jul 21, 2026
e895dff
Merge urnetwork/apple:main (perf and correctness fixes wave) into fea…
Ryanmello07 Jul 21, 2026
bb9404d
chore: retrigger CI to pick up SDK beta/custom-server update
Ryanmello07 Jul 21, 2026
0a7e3b6
chore: retrigger CI to pick up connect beta/custom-server update
Ryanmello07 Jul 21, 2026
970914d
Merge feat/seedphrase-auth-ios (fork PR#4 fixes) into feat/seedphrase…
Ryanmello07 Jul 21, 2026
26e758a
Delete beta-build.yml
Ryanmello07 Jul 21, 2026
d410931
fix: strip fork-only leakage flagged in PR self-review
Ryanmello07 Jul 21, 2026
7d0550a
Remove orphaned "Confirm Seeker Token" localization entry
Ryanmello07 Jul 21, 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
11 changes: 1 addition & 10 deletions app/network/Authenticate/CreateNetwork/CreateNetworkView.swift
Original file line number Diff line number Diff line change
Expand Up @@ -188,16 +188,7 @@ struct CreateNetworkView: View {
#endif

Task {
let result = deviceManager.device != nil
// device exists - upgrade guest network
? await viewModel.upgradeGuestNetwork(
userAuth: userAuth,
authJwt: authLoginArgs.authJwt,
authType: authLoginArgs.authJwtType,
walletAuth: authLoginArgs.walletAuth
)
// no device exists - create a new network
: await viewModel.createNetwork(
let result = await viewModel.createNetwork(
userAuth: userAuth,
authJwt: authLoginArgs.authJwt,
authType: authLoginArgs.authJwtType,
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -247,58 +247,6 @@ extension CreateNetworkView {

}

func upgradeGuestNetwork(
userAuth: String?,
authJwt: String?,
authType: String?,
walletAuth: SdkWalletAuthArgs?
) async -> LoginNetworkResult {

if !formIsValid {
return .failure(NSError(domain: domain, code: 0, userInfo: [NSLocalizedDescriptionKey: "Create network form is invalid"]))
}

if isCreatingNetwork {
return .failure(NSError(domain: domain, code: 0, userInfo: [NSLocalizedDescriptionKey: "Network creation already in progress"]))
}


self.createNetworkErrorMessage = nil
self.isCreatingNetwork = true

do {

let args = SdkUpgradeGuestArgs()
args.networkName = networkName.trimmingCharacters(in: .whitespacesAndNewlines)

if let userAuth = userAuth {
args.userAuth = userAuth
args.password = password
}

if let authJwt, let authType {
args.authJwt = authJwt
args.authJwtType = authType
}

if let walletAuth {
args.walletAuth = walletAuth
}

let result = try await urApiService.upgradeGuest(args)

self.isCreatingNetwork = false

return result

} catch {
self.isCreatingNetwork = false
return .failure(error)
}


}

func createNetwork(
userAuth: String?,
authJwt: String?,
Expand Down
Original file line number Diff line number Diff line change
@@ -0,0 +1,133 @@
//
// CreateNetworkInstantView.swift
// URnetwork
//

import SwiftUI
import URnetworkSdk

private struct InstantAccountResult: Identifiable {
let id = UUID()
let jwt: String
let seedphrase: String
}

struct CreateNetworkInstantView: View {

@EnvironmentObject var themeManager: ThemeManager

@StateObject private var viewModel: ViewModel

let handleSuccess: (_ jwt: String) async -> Void
let back: () -> Void

@State private var accountResult: InstantAccountResult? = nil

init(
urApiService: UrApiServiceProtocol,
handleSuccess: @escaping (_ jwt: String) async -> Void,
back: @escaping () -> Void
) {
_viewModel = StateObject(wrappedValue: ViewModel(urApiService: urApiService))
self.handleSuccess = handleSuccess
self.back = back
}

var body: some View {
ScrollView {
VStack(alignment: .center) {

Text("Create Instant Account")
.foregroundColor(.urWhite)
.font(themeManager.currentTheme.titleFont)

Spacer().frame(height: 16)

Text("No email, phone, or password needed. Your account is secured by a seedphrase.")
.foregroundColor(themeManager.currentTheme.textMutedColor)
.font(themeManager.currentTheme.bodyFont)
.multilineTextAlignment(.center)

Spacer().frame(height: 48)

UrSwitchToggle(isOn: $viewModel.termsAgreed, isEnabled: !viewModel.isCreatingAccount) {
Text("I agree to URnetwork's [Terms and Services](https://ur.io/terms) and [Privacy Policy](https://ur.io/privacy)")
.foregroundColor(themeManager.currentTheme.textMutedColor)
.font(themeManager.currentTheme.secondaryBodyFont)
}

Spacer().frame(height: 32)

UrButton(
text: "Create Account",
action: {
Task {
let result = await viewModel.createInstantAccount()
if let (jwt, seedphrase) = result {
accountResult = InstantAccountResult(jwt: jwt, seedphrase: seedphrase)
}
}
},
enabled: viewModel.formIsValid,
isProcessing: viewModel.isCreatingAccount
)

Spacer().frame(height: 8)

UrInlineErrorText(message: viewModel.errorMessage)

}
.padding()
.frame(maxWidth: .infinity)
.frame(maxWidth: 400)
}
.background(themeManager.currentTheme.backgroundColor.ignoresSafeArea())
.toolbar {
#if os(iOS)
ToolbarItem(placement: .navigationBarLeading) {
Button(action: { back() }) {
Image(systemName: "chevron.left")
.foregroundColor(themeManager.currentTheme.textColor)
}
}
#elseif os(macOS)
ToolbarItem {
Button(action: { back() }) {
Image(systemName: "chevron.left")
.foregroundColor(themeManager.currentTheme.textColor)
}
}
#endif
}
#if os(iOS)
.navigationBarBackButtonHidden(true)
.fullScreenCover(item: $accountResult) { result in
SeedphraseDisplayView(
seedphrase: result.seedphrase,
onConfirmed: { _ in
accountResult = nil
Task {
await handleSuccess(result.jwt)
}
}
)
.environmentObject(themeManager)
}
#elseif os(macOS)
.sheet(item: $accountResult) { result in
SeedphraseDisplayView(
seedphrase: result.seedphrase,
onConfirmed: { _ in
accountResult = nil
Task {
await handleSuccess(result.jwt)
}
}
)
.environmentObject(themeManager)
.interactiveDismissDisabled(true)
}
#endif
}

}
Original file line number Diff line number Diff line change
@@ -0,0 +1,73 @@
//
// CreateNetworkInstantViewModel.swift
// URnetwork
//

import Foundation
import URnetworkSdk

extension CreateNetworkInstantView {

@MainActor
class ViewModel: ObservableObject {

private let urApiService: UrApiServiceProtocol

@Published var termsAgreed: Bool = false {
didSet {
errorMessage = nil
validateForm()
}
}

@Published private(set) var isCreatingAccount: Bool = false

@Published private(set) var formIsValid: Bool = false

@Published private(set) var errorMessage: String?

let domain = "CreateNetworkInstantViewModel"

init(urApiService: UrApiServiceProtocol) {
self.urApiService = urApiService
}

func setErrorMessage(_ message: String?) {
errorMessage = message
}

private func validateForm() {
formIsValid = termsAgreed && !isCreatingAccount
}

func createInstantAccount() async -> (jwt: String, seedphrase: String)? {

if isCreatingAccount {
return nil
}

guard termsAgreed else {
errorMessage = "You must agree to the Terms and Privacy Policy"
return nil
}

isCreatingAccount = true
errorMessage = nil

defer {
isCreatingAccount = false
}

do {
let result = try await urApiService.createInstantAccount()
return result
} catch {
errorMessage = "There was an error creating your account. Please try again."
return nil
}

}

}

}
Loading