Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

[PWN-9260] [WIP] Withdrawal #1479

Merged
merged 3 commits into from
Jul 20, 2023
Merged
Show file tree
Hide file tree
Changes from 1 commit
Commits
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
Original file line number Diff line number Diff line change
@@ -0,0 +1,15 @@
import Foundation

//Can't come up with a good name
public protocol WithdrawalInfoType {
var IBAN: String? { get }
var BIC: String? { get }
var receiver: String { get }
}

public protocol WithdrawProvider {
associatedtype WithdrawalInfo: WithdrawalInfoType

func withdrawalInfo() async throws -> WithdrawalInfo
func save(IBAN: String, BIC: String, receiver: String) async throws
}
Original file line number Diff line number Diff line change
Expand Up @@ -88,6 +88,14 @@ public actor MockStrigaLocalProvider: StrigaLocalProvider {
fatalError()
}

public func getCachedWithdrawalInfo() async -> StrigaWithdrawalInfo? {
fatalError()
}

public func save(withdrawalInfo: StrigaWithdrawalInfo) async throws {
fatalError()
}

public func clear() async {
self.cachedRegistrationData = nil
self.useCase = .unregisteredUser
Expand Down
Original file line number Diff line number Diff line change
@@ -0,0 +1,13 @@
import Foundation

public struct StrigaWithdrawalInfo: WithdrawalInfoType, Codable {
public var IBAN: String?
public var BIC: String?
public var receiver: String
Copy link
Collaborator

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

let maybe


public init(IBAN: String? = nil, BIC: String? = nil, receiver: String) {
self.IBAN = IBAN
self.BIC = BIC
self.receiver = receiver
}
}
Original file line number Diff line number Diff line change
Expand Up @@ -10,6 +10,9 @@ public protocol StrigaLocalProvider {
func getWhitelistedUserDestinations() async throws -> [StrigaWhitelistAddressResponse]
func save(whitelisted: [StrigaWhitelistAddressResponse]) async throws

func getCachedWithdrawalInfo() async -> StrigaWithdrawalInfo?
func save(withdrawalInfo: StrigaWithdrawalInfo) async throws

func clear() async
}

Expand Down Expand Up @@ -39,6 +42,14 @@ public actor StrigaLocalProviderImpl {

extension StrigaLocalProviderImpl: StrigaLocalProvider {

public func getCachedWithdrawalInfo() async -> StrigaWithdrawalInfo? {
return get(from: cacheFileFor(.withdrawalInfo))
}

public func save(withdrawalInfo: StrigaWithdrawalInfo) async throws {
try await save(model: withdrawalInfo, in: cacheFileFor(.withdrawalInfo))
}

public func getCachedRegistrationData() -> StrigaUserDetailsResponse? {
return get(from: cacheFileFor(.registration))
}
Expand Down Expand Up @@ -88,6 +99,8 @@ extension StrigaLocalProviderImpl: StrigaLocalProvider {
case registration
case account
case whitelisted
case withdrawalInfo

Copy link
Collaborator

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

space

}

private func cacheFileFor(_ name: CacheFileName) -> URL {
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -412,3 +412,23 @@ private extension UserWallet {
self.accounts = UserAccounts(eur: eur, usdc: usdc)
}
}

extension StrigaBankTransferUserDataRepository: WithdrawProvider {
public typealias WithdrawalInfo = StrigaWithdrawalInfo

public func withdrawalInfo() async throws -> WithdrawalInfo {
await localProvider.getCachedWithdrawalInfo() ??
/// GetAccountStatement here
WithdrawalInfo(IBAN: "IBAN", BIC: "BIC", receiver: "Receiver")
}

public func save(IBAN: String, BIC: String, receiver: String) async throws {
try await localProvider.save(
withdrawalInfo: .init(
IBAN: IBAN,
BIC: BIC,
receiver: receiver
)
)
}
}
89 changes: 63 additions & 26 deletions p2p_wallet/Injection/Resolver+registerAllServices.swift
Original file line number Diff line number Diff line change
Expand Up @@ -424,6 +424,68 @@ extension Resolver: ResolverRegistering {
}
.scope(.session)

register {
StrigaBankTransferUserDataRepository(
Copy link
Collaborator

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

what has changed here?

localProvider: GlobalAppState.shared.strigaMockingEnabled ?
MockStrigaLocalProvider(
useCase: .unregisteredUser,
hasCachedInput: true
) :
StrigaLocalProviderImpl(),
remoteProvider: GlobalAppState.shared.strigaMockingEnabled ?
MockStrigaRemoteProvider(
useCase: .unregisteredUser,
mockUserId: "user-id",
mockKYCToken: "kyc-token"
) :
StrigaRemoteProviderImpl(
baseURL: GlobalAppState.shared.strigaEndpoint,
solanaKeyPair: Resolver.resolve(UserWalletManager.self).wallet?.account
),
metadataProvider: GlobalAppState.shared.strigaMockingEnabled ?
MockStrigaMetadataProvider(
useCase: .unregisteredUser,
mockUserId: "user-id"
) :
Resolver.resolve(StrigaMetadataProvider.self),
commonInfoProvider: CommonInfoLocalProviderImpl(),
solanaKeyPair: Resolver.resolve(UserWalletManager.self).wallet?.account
)
}
.implements(BankTransferUserDataRepository.self)
.scope(.session)

register {
StrigaBankTransferUserDataRepository(
localProvider: GlobalAppState.shared.strigaMockingEnabled ?
MockStrigaLocalProvider(
useCase: .unregisteredUser,
hasCachedInput: true
) :
StrigaLocalProviderImpl(),
remoteProvider: GlobalAppState.shared.strigaMockingEnabled ?
MockStrigaRemoteProvider(
useCase: .unregisteredUser,
mockUserId: "user-id",
mockKYCToken: "kyc-token"
) :
StrigaRemoteProviderImpl(
baseURL: GlobalAppState.shared.strigaEndpoint,
solanaKeyPair: Resolver.resolve(UserWalletManager.self).wallet?.account
),
metadataProvider: GlobalAppState.shared.strigaMockingEnabled ?
MockStrigaMetadataProvider(
useCase: .unregisteredUser,
mockUserId: "user-id"
) :
Resolver.resolve(StrigaMetadataProvider.self),
commonInfoProvider: CommonInfoLocalProviderImpl(),
solanaKeyPair: Resolver.resolve(UserWalletManager.self).wallet?.account
)
}
.implements((any WithdrawProvider).self)
.scope(.session)

register { RelayServiceImpl(
contextManager: resolve(),
orcaSwap: resolve(),
Expand Down Expand Up @@ -611,32 +673,7 @@ extension Resolver: ResolverRegistering {

register {
BankTransferServiceImpl<StrigaBankTransferUserDataRepository>(
repository: StrigaBankTransferUserDataRepository(
localProvider: GlobalAppState.shared.strigaMockingEnabled ?
MockStrigaLocalProvider(
useCase: .unregisteredUser,
hasCachedInput: true
) :
StrigaLocalProviderImpl(),
remoteProvider: GlobalAppState.shared.strigaMockingEnabled ?
MockStrigaRemoteProvider(
useCase: .unregisteredUser,
mockUserId: "user-id",
mockKYCToken: "kyc-token"
) :
StrigaRemoteProviderImpl(
baseURL: GlobalAppState.shared.strigaEndpoint,
solanaKeyPair: Resolver.resolve(UserWalletManager.self).wallet?.account
),
metadataProvider: GlobalAppState.shared.strigaMockingEnabled ?
MockStrigaMetadataProvider(
useCase: .unregisteredUser,
mockUserId: "user-id"
) :
Resolver.resolve(StrigaMetadataProvider.self),
commonInfoProvider: CommonInfoLocalProviderImpl(),
solanaKeyPair: Resolver.resolve(UserWalletManager.self).wallet?.account
)
repository: resolve()
)
}
.implements((any BankTransferService).self)
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -50,3 +50,42 @@ struct StrigaClaimTransaction: StrigaClaimTransactionType {
return .fakeTransactionSignature(id: UUID().uuidString)
}
}

protocol StrigaWithdrawTransactionType {
var IBAN: String { get }
var BIC: String { get }
var feeAmount: FeeAmount { get }
var amount: Double { get }
}

/// Default implemetation of `StrigaClaimTransactionType`
struct StrigaWithdrawTransaction: StrigaWithdrawTransactionType {

// MARK: - Properties
var IBAN: String

var BIC: String

var amount: Double

let token: Token = .usdc
let feeAmount: FeeAmount
let fromAddress: String
let receivingAddress: String

var mainDescription: String {
""
}

// MARK: - Methods

func createRequest() async throws -> String {
// get transaction from proxy api

// sign transaction

// TODO: - send to blockchain
try? await Task.sleep(seconds: 1)
return .fakeTransactionSignature(id: UUID().uuidString)
}
}
Original file line number Diff line number Diff line change
Expand Up @@ -3,7 +3,7 @@ import KeyAppUI
import CountriesAPI

fileprivate typealias TextField = StrigaRegistrationTextField
fileprivate typealias Cell = StrigaRegistrationCell
fileprivate typealias Cell = StrigaFormCell
fileprivate typealias DetailedButton = StrigaRegistrationDetailedButton

struct StrigaRegistrationFirstStepView: View {
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -40,7 +40,7 @@ final class StrigaRegistrationFirstStepViewModel: BaseViewModel, ObservableObjec
let choosePhoneCountryCode = PassthroughSubject<Country?, Never>()
let back = PassthroughSubject<Void, Never>()

var fieldsStatuses = [StrigaRegistrationField: StrigaRegistrationTextFieldStatus]()
var fieldsStatuses = [StrigaRegistrationField: StrigaFormTextFieldStatus]()

@Published var selectedCountryOfBirth: Country?
@Published private var dateOfBirthModel: StrigaUserDetailsResponse.DateOfBirth?
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -2,7 +2,7 @@ import SwiftUI
import KeyAppUI

fileprivate typealias TextField = StrigaRegistrationTextField
fileprivate typealias Cell = StrigaRegistrationCell
fileprivate typealias Cell = StrigaFormCell
fileprivate typealias DetailedButton = StrigaRegistrationDetailedButton

struct StrigaRegistrationSecondStepView: View {
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -41,7 +41,7 @@ final class StrigaRegistrationSecondStepViewModel: BaseViewModel, ObservableObje
let chooseCountry = PassthroughSubject<Country?, Never>()
let openHardError = PassthroughSubject<Void, Never>()

var fieldsStatuses = [StrigaRegistrationField: StrigaRegistrationTextFieldStatus]()
var fieldsStatuses = [StrigaRegistrationField: StrigaFormTextFieldStatus]()

@Published var selectedCountry: Country?
@Published var selectedIndustry: Industry?
Expand Down
Original file line number Diff line number Diff line change
@@ -1,25 +1,25 @@
import SwiftUI
import KeyAppUI

struct StrigaRegistrationTextField: View {
struct StrigaRegistrationTextField<TextFieldType: Identifiable & Hashable>: View {

let field: StrigaRegistrationField
let field: TextFieldType
let placeholder: String
let isEnabled: Bool
let onSubmit: () -> Void
let submitLabel: SubmitLabel

@Binding var text: String
@Binding var focus: StrigaRegistrationField?
@Binding var focus: TextFieldType?

@FocusState private var isFocused: StrigaRegistrationField?
@FocusState private var isFocused: TextFieldType?

init(
field: StrigaRegistrationField,
field: TextFieldType,
placeholder: String,
text: Binding<String>,
isEnabled: Bool = true,
focus: Binding<StrigaRegistrationField?>,
focus: Binding<TextFieldType?>,
onSubmit: @escaping () -> Void,
submitLabel: SubmitLabel
) {
Expand Down Expand Up @@ -58,17 +58,17 @@ struct StrigaRegistrationTextField: View {
struct StrigaRegistrationTextField_Previews: PreviewProvider {
static var previews: some View {
VStack {
StrigaRegistrationTextField(
field: .email,
StrigaRegistrationTextField<StrigaRegistrationField>(
field: StrigaRegistrationField.email,
placeholder: "Enter email",
text: .constant(""),
focus: .constant(nil),
onSubmit: { },
submitLabel: .next
)

StrigaRegistrationTextField(
field: .phoneNumber,
StrigaRegistrationTextField<StrigaRegistrationField>(
field: StrigaRegistrationField.phoneNumber,
placeholder: "Enter phone",
text: .constant(""),
focus: .constant(nil),
Expand Down
Original file line number Diff line number Diff line change
@@ -1,19 +1,19 @@
import SwiftUI
import KeyAppUI

enum StrigaRegistrationTextFieldStatus: Equatable {
enum StrigaFormTextFieldStatus: Equatable {
case valid
case invalid(error: String)
}

struct StrigaRegistrationCell<Content: View>: View {
struct StrigaFormCell<Content: View>: View {
let title: String
let status: StrigaRegistrationTextFieldStatus
let status: StrigaFormTextFieldStatus
@ViewBuilder private var content: () -> Content

init(
title: String,
status: StrigaRegistrationTextFieldStatus? = .valid,
status: StrigaFormTextFieldStatus? = .valid,
@ViewBuilder content: @escaping () -> Content
) {
self.title = title
Expand Down
Loading
Loading