Skip to content
This repository has been archived by the owner on May 10, 2024. It is now read-only.

Commit

Permalink
Fix #5902: Let user select active rpc endpoint (#7628)
Browse files Browse the repository at this point in the history
  • Loading branch information
nuo-xu authored Jun 23, 2023
1 parent 44c8749 commit d922283
Show file tree
Hide file tree
Showing 2 changed files with 61 additions and 18 deletions.
75 changes: 59 additions & 16 deletions Sources/BraveWallet/Settings/CustomNetworkDetailsView.swift
Original file line number Diff line number Diff line change
Expand Up @@ -11,6 +11,7 @@ import BraveUI

struct NetworkInputItem: Identifiable {
var input: String
var isSelected: Bool = false
var error: String?
var id = UUID()
}
Expand Down Expand Up @@ -119,7 +120,7 @@ class CustomNetworkModel: ObservableObject, Identifiable {
}
}

@Published var rpcUrls: [NetworkInputItem] = [NetworkInputItem(input: "")] {
@Published var rpcUrls: [NetworkInputItem] = [NetworkInputItem(input: "", isSelected: true)] {
didSet {
// we only care the set on each item's `input`
if rpcUrls.reduce("", { $0 + $1.input }) != oldValue.reduce("", { $0 + $1.input }) {
Expand Down Expand Up @@ -213,7 +214,16 @@ class CustomNetworkModel: ObservableObject, Identifiable {
self.networkSymbol.input = network.symbol
self.networkDecimals.input = String(network.decimals)
if !network.rpcEndpoints.isEmpty {
self.rpcUrls = network.rpcEndpoints.compactMap { NetworkInputItem(input: $0.absoluteString) }
var result: [NetworkInputItem] = []
for (index, endpoint) in network.rpcEndpoints.enumerated() {
result.append(
NetworkInputItem(
input: endpoint.absoluteString,
isSelected: index == network.activeRpcEndpointIndex
)
)
}
self.rpcUrls = result
} else if mode.isViewMode {
self.rpcUrls = []
}
Expand Down Expand Up @@ -338,7 +348,8 @@ struct CustomNetworkDetailsView: View {
ForEach($model.rpcUrls) { $url in
networkTextField(
placeholder: Strings.Wallet.customNetworkUrlsPlaceholder,
item: $url
item: $url,
showRadioButton: true
)
}
.listRowBackground(Color(.secondaryBraveGroupedBackground))
Expand Down Expand Up @@ -412,19 +423,31 @@ struct CustomNetworkDetailsView: View {
)
}

@ViewBuilder private func networkTextField(placeholder: String, item: Binding<NetworkInputItem>) -> some View {
if model.mode.isViewMode {
Text(item.wrappedValue.input)
.contextMenu {
Button(action: { UIPasteboard.general.string = item.wrappedValue.input }) {
Label(Strings.Wallet.copyToPasteboard, braveSystemImage: "leo.copy.plain-text")
@ViewBuilder private func networkTextField(placeholder: String, item: Binding<NetworkInputItem>, showRadioButton: Bool = false) -> some View {
HStack {
if showRadioButton {
NetworkRadioButton(
checked: item.isSelected,
isDisabled: Binding(get: { item.input.wrappedValue.isEmpty || model.mode.isViewMode }, set: { _, _ in }),
onTapped: {
for index in model.rpcUrls.indices where model.rpcUrls[index].id != item.id {
model.rpcUrls[index].isSelected = !item.isSelected.wrappedValue
}
})
}
if model.mode.isViewMode {
Text(item.wrappedValue.input)
.contextMenu {
Button(action: { UIPasteboard.general.string = item.wrappedValue.input }) {
Label(Strings.Wallet.copyToPasteboard, braveSystemImage: "leo.copy.plain-text")
}
}
}
} else {
NetworkTextField(
placeholder: placeholder,
item: item
)
} else {
NetworkTextField(
placeholder: placeholder,
item: item
)
}
}
}

Expand Down Expand Up @@ -491,12 +514,13 @@ struct CustomNetworkDetailsView: View {
return nil
}
})
let activeRpcEndpointIndex = model.rpcUrls.firstIndex(where: { $0.isSelected }) ?? 0
let network: BraveWallet.NetworkInfo = .init(
chainId: chainIdInHex,
chainName: model.networkName.input,
blockExplorerUrls: blockExplorerUrls,
iconUrls: iconUrls,
activeRpcEndpointIndex: 0,
activeRpcEndpointIndex: Int32(activeRpcEndpointIndex),
rpcEndpoints: rpcEndpoints,
symbol: model.networkSymbol.input,
symbolName: model.networkSymbol.input,
Expand All @@ -514,6 +538,25 @@ struct CustomNetworkDetailsView: View {
}
}

struct NetworkRadioButton: View {
@Binding var checked: Bool
@Binding var isDisabled: Bool
var onTapped: () -> Void

var body: some View {
Image(uiImage: UIImage(braveSystemNamed: checked ? "leo.check.circle-outline" : "leo.radio.unchecked")!)
.renderingMode(.template)
.foregroundColor(Color(checked ? .braveBlurpleTint : .braveDisabled))
.font(.title3)
.onTapGesture {
if !self.isDisabled && !checked {
self.checked = true
self.onTapped()
}
}
}
}

#if DEBUG
struct CustomNetworkDetailsView_Previews: PreviewProvider {
static var previews: some View {
Expand Down
4 changes: 2 additions & 2 deletions Sources/BraveWallet/Settings/CustomNetworkListView.swift
Original file line number Diff line number Diff line change
Expand Up @@ -46,14 +46,14 @@ struct CustomNetworkListView: View {
if sizeCategory.isAccessibilityCategory {
VStack(alignment: .leading) {
Text(network.id)
if let rpcEndpoint = network.rpcEndpoints.first?.absoluteString {
if let rpcEndpoint = network.rpcEndpoints[safe: Int(network.activeRpcEndpointIndex)]?.absoluteString {
Text(rpcEndpoint)
}
}
} else {
HStack {
Text(network.id)
if let rpcEndpoint = network.rpcEndpoints.first?.absoluteString {
if let rpcEndpoint = network.rpcEndpoints[safe: Int(network.activeRpcEndpointIndex)]?.absoluteString {
Text(rpcEndpoint)
}
}
Expand Down

0 comments on commit d922283

Please sign in to comment.