secant-ios-wallet/modules/Sources/Features/Root/RootShieldingProcessor.swift

80 lines
2.7 KiB
Swift

//
// RootTransactions.swift
// Zashi
//
// Created by Lukáš Korba on 29.01.2025.
//
import Combine
import ComposableArchitecture
import Foundation
import MessageUI
import ZcashLightClientKit
import Generated
import Models
import SupportDataGenerator
extension Root {
public func shieldingProcessorReduce() -> Reduce<Root.State, Root.Action> {
Reduce { state, action in
switch action {
case .observeShieldingProcessor:
return .publisher {
shieldingProcessor.observe()
.map(Action.shieldingProcessorStateChanged)
}
.cancellable(id: state.shieldingProcessorCancelId, cancelInFlight: true)
case .shieldingProcessorStateChanged(let shieldingProcessorState):
switch shieldingProcessorState {
case .failed(let error):
state.messageToBeShared = error.detailedMessage
state.alert = AlertState.shieldFundsFailure(error)
case .grpc:
state.alert = AlertState.shieldFundsGrpc()
case .proposal(let proposal):
state.signWithKeystoneCoordFlowState = .initial
state.signWithKeystoneCoordFlowState.sendConfirmationState.proposal = proposal
state.signWithKeystoneCoordFlowState.sendConfirmationState.isShielding = true
//state.homeState.balancesBinding = false
return .run { send in
try? await mainQueue.sleep(for: .seconds(0.8))
await send(.signWithKeystoneRequested)
}
case .requested:
break
case .succeeded:
break
case .unknown:
break
}
return .none
case .reportShieldingFailure:
var supportData = SupportDataGenerator.generate()
supportData.message =
"""
code: -3000
\(state.messageToBeShared)
\(supportData.message)
"""
if MFMailComposeViewController.canSendMail() {
state.supportData = supportData
} else {
state.messageShareBinding = supportData.message
}
return .none
case .shareFinished:
state.messageShareBinding = nil
state.messageToBeShared = ""
return .none
default: return .none
}
}
}
}