Skip to content

Commit

Permalink
Merge pull request #15 from WalletConnect/feat/blockchain-api
Browse files Browse the repository at this point in the history
  • Loading branch information
radeknovis authored Oct 7, 2023
2 parents e17da3d + c1ac10b commit 24602e2
Show file tree
Hide file tree
Showing 6 changed files with 154 additions and 6 deletions.
40 changes: 40 additions & 0 deletions Sources/Web3Modal/Core/BlockchainAPIInteractor.swift
Original file line number Diff line number Diff line change
@@ -0,0 +1,40 @@
import Foundation
import HTTPClient

final class BlockchainAPIInteractor: ObservableObject {

private let store: Store

init(store: Store = .shared) {
self.store = store
}

func getIdentity() async throws {

let account = store.session?.accounts.first
let address = account?.address
let chainId = account?.blockchainIdentifier

let httpClient = HTTPNetworkClient(host: "rpc.walletconnect.com", session: URLSession(configuration: .ephemeral))
let response = try await httpClient.request(
Identity.self,
at: BlockchainAPI.getIdentity(
params: .init(
address: address ?? "",
chainId: chainId ?? "",
projectId: Web3Modal.config.projectId
)
)
)

DispatchQueue.main.async { [self] in
self.store.identity = response
}
}
}


struct Identity: Codable {
let name: String?
let avatar: String?
}
30 changes: 27 additions & 3 deletions Sources/Web3Modal/Core/SignInteractor.swift
Original file line number Diff line number Diff line change
@@ -1,12 +1,36 @@
import Foundation
import Combine
import WalletConnectSign

final class SignInteractor: ObservableObject {
class SignInteractor: ObservableObject {

private let store: Store

lazy var sessionsPublisher: AnyPublisher<[Session], Never> = Web3Modal.instance.sessionsPublisher
lazy var sessionSettlePublisher: AnyPublisher<Session, Never> = Web3Modal.instance.sessionSettlePublisher
lazy var sessionResponsePublisher: AnyPublisher<Response, Never> = Web3Modal.instance.sessionResponsePublisher
lazy var sessionRejectionPublisher: AnyPublisher<(Session.Proposal, Reason), Never> = Web3Modal.instance.sessionRejectionPublisher
lazy var sessionDeletePublisher: AnyPublisher<(String, Reason), Never> = Web3Modal.instance.sessionDeletePublisher

init(store: Store = .shared) {
self.store = store
}

func createPairingAndConnect() async throws {
let uri = try await Web3Modal.instance.connect(topic: nil)

DispatchQueue.main.async {
self.store.uri = uri
}
}

func createPairingAndConnect() async throws -> WalletConnectURI? {
try await Web3Modal.instance.connect(topic: nil)
func disconnect() async throws {
defer {
DispatchQueue.main.async {
self.store.session = nil
}
}

try await Web3Modal.instance.disconnect(topic: store.session?.topic ?? "")
}
}
32 changes: 30 additions & 2 deletions Sources/Web3Modal/Core/W3MAPIInteractor.swift
Original file line number Diff line number Diff line change
Expand Up @@ -2,20 +2,22 @@ import UIKit
import HTTPClient

final class W3MAPIInteractor: ObservableObject {

@Published var isLoading: Bool = false

private let store: Store

private let entriesPerPage: Int = 40

var page: Int = 0
var totalPage: Int = .max
var totalEntries: Int = 0

init(store: Store) {
init(store: Store = .shared) {
self.store = store
}

func getWallets(search: String = "") async throws {
func fetchWallets(search: String = "") async throws {
DispatchQueue.main.async {
self.isLoading = true
}
Expand Down Expand Up @@ -56,6 +58,32 @@ final class W3MAPIInteractor: ObservableObject {
}
}

func fetchFeaturedWallets() async throws {

let httpClient = HTTPNetworkClient(host: "api.web3modal.com", session: URLSession(configuration: .ephemeral))
let response = try await httpClient.request(
GetWalletsResponse.self,
at: Web3ModalAPI.getWallets(
params: .init(
page: 1,
entries: 4,
search: "",
projectId: Web3Modal.config.projectId,
metadata: Web3Modal.config.metadata,
recommendedIds: Web3Modal.config.recommendedWalletIds,
excludedIds: Web3Modal.config.excludedWalletIds
)
)
)

try await fetchWalletImages(for: response.data)

DispatchQueue.main.async { [self] in
self.store.totalNumberOfWallets = response.count
self.store.featuredWallets = response.data
}
}

func fetchWalletImages(for wallets: [Wallet]) async throws {
var walletImages: [String: UIImage] = [:]

Expand Down
46 changes: 46 additions & 0 deletions Sources/Web3Modal/Networking/BlockchainAPI.swift
Original file line number Diff line number Diff line change
@@ -0,0 +1,46 @@
import Foundation
import HTTPClient

enum BlockchainAPI: HTTPService {
struct GetIdentityParams {
let address: String
let chainId: String
let projectId: String
}

case getIdentity(params: GetIdentityParams)

var path: String {
switch self {
case let .getIdentity(params): return "/v1/identity/\(params.address)"
}
}

var method: HTTPMethod {
switch self {
case .getIdentity: return .get
}
}

var body: Data? {
nil
}

var queryParameters: [String: String]? {
switch self {
case let .getIdentity(params):
return [
"projectId": params.projectId,
"chainId": params.chainId,
]
}
}

var scheme: String {
return "https"
}

var additionalHeaderFields: [String: String]? {
nil
}
}
2 changes: 1 addition & 1 deletion Sources/Web3Modal/Screens/AllWalletsView.swift
Original file line number Diff line number Diff line change
Expand Up @@ -130,7 +130,7 @@ struct AllWalletsView: View {
private func fetchWallets(search: String = "") {
Task {
do {
try await interactor.getWallets(search: search)
try await interactor.fetchWallets(search: search)
} catch {
print(error.localizedDescription)
// TODO: Handle error
Expand Down
10 changes: 10 additions & 0 deletions Sources/Web3Modal/Store.swift
Original file line number Diff line number Diff line change
@@ -1,8 +1,18 @@
import Combine
import SwiftUI
import WalletConnectSign

class Store: ObservableObject {

public static var shared: Store = Store()

@Published var identity: Identity?
@Published var session: Session?
@Published var uri: WalletConnectURI?

@Published var wallets: [Wallet] = []
@Published var featuredWallets: [Wallet] = []
@Published var searchedWallets: [Wallet] = []
@Published var totalNumberOfWallets: Int = 0
@Published var walletImages: [String: UIImage] = [:]
}

0 comments on commit 24602e2

Please sign in to comment.