Wallet improvements

This commit is contained in:
Ilya Laktyushin 2019-09-27 18:40:08 +03:00
parent 64f54c625c
commit 92d19dd772
5 changed files with 56 additions and 24 deletions

View File

@ -3,10 +3,10 @@ import UIKit
import Display
import AccountContext
public func textAlertController(context: AccountContext, title: String?, text: String, actions: [TextAlertAction], actionLayout: TextAlertContentActionLayout = .horizontal) -> AlertController {
public func textAlertController(context: AccountContext, title: String?, text: String, actions: [TextAlertAction], actionLayout: TextAlertContentActionLayout = .horizontal, allowInputInset: Bool = true) -> AlertController {
let presentationData = context.sharedContext.currentPresentationData.with { $0 }
let controller = standardTextAlertController(theme: AlertControllerTheme(presentationTheme: presentationData.theme), title: title, text: text, actions: actions, actionLayout: actionLayout)
let controller = standardTextAlertController(theme: AlertControllerTheme(presentationTheme: presentationData.theme), title: title, text: text, actions: actions, actionLayout: actionLayout, allowInputInset: allowInputInset)
let presentationDataDisposable = context.sharedContext.presentationData.start(next: { [weak controller] presentationData in
controller?.theme = AlertControllerTheme(presentationTheme: presentationData.theme)
})
@ -17,7 +17,7 @@ public func textAlertController(context: AccountContext, title: String?, text: S
return controller
}
public func richTextAlertController(context: AccountContext, title: NSAttributedString?, text: NSAttributedString, actions: [TextAlertAction], actionLayout: TextAlertContentActionLayout = .horizontal, dismissAutomatically: Bool = true) -> AlertController {
public func richTextAlertController(context: AccountContext, title: NSAttributedString?, text: NSAttributedString, actions: [TextAlertAction], actionLayout: TextAlertContentActionLayout = .horizontal, allowInputInset: Bool = true, dismissAutomatically: Bool = true) -> AlertController {
let presentationData = context.sharedContext.currentPresentationData.with { $0 }
let theme = AlertControllerTheme(presentationTheme: presentationData.theme)
@ -29,7 +29,7 @@ public func richTextAlertController(context: AccountContext, title: NSAttributed
}
action.action()
})
}, actionLayout: actionLayout))
}, actionLayout: actionLayout), allowInputInset: allowInputInset)
dismissImpl = { [weak controller] in
controller?.dismissAnimated()
}

View File

@ -354,14 +354,14 @@ public func textAlertController(theme: AlertControllerTheme, title: NSAttributed
return AlertController(theme: theme, contentNode: TextAlertContentNode(theme: theme, title: title, text: text, actions: actions, actionLayout: actionLayout))
}
public func standardTextAlertController(theme: AlertControllerTheme, title: String?, text: String, actions: [TextAlertAction], actionLayout: TextAlertContentActionLayout = .horizontal) -> AlertController {
public func standardTextAlertController(theme: AlertControllerTheme, title: String?, text: String, actions: [TextAlertAction], actionLayout: TextAlertContentActionLayout = .horizontal, allowInputInset: Bool = true) -> AlertController {
var dismissImpl: (() -> Void)?
let controller = AlertController(theme: theme, contentNode: TextAlertContentNode(theme: theme, title: title != nil ? NSAttributedString(string: title!, font: Font.semibold(17.0), textColor: theme.primaryColor, paragraphAlignment: .center) : nil, text: NSAttributedString(string: text, font: title == nil ? Font.semibold(17.0) : Font.regular(13.0), textColor: theme.primaryColor, paragraphAlignment: .center), actions: actions.map { action in
return TextAlertAction(type: action.type, title: action.title, action: {
dismissImpl?()
action.action()
})
}, actionLayout: actionLayout))
}, actionLayout: actionLayout), allowInputInset: allowInputInset)
dismissImpl = { [weak controller] in
controller?.dismissAnimated()
}

View File

@ -236,6 +236,8 @@ private enum WalletReceiveScreenEntry: ItemListNodeEntry {
case let .comment(theme, placeholder, value):
return ItemListMultilineInputItem(theme: theme, text: value, placeholder: placeholder, maxLength: ItemListMultilineInputItemTextLimit(value: 128, display: true), sectionId: self.section, style: .blocks, returnKeyType: .done, textUpdated: { text in
arguments.updateText(WalletReceiveScreenEntryTag.comment, text)
}, shouldUpdateText: { text in
return text.count <= 128
}, updatedFocus: { focus in
arguments.updateState { state in
var state = state

View File

@ -22,15 +22,17 @@ private final class WalletSendScreenArguments {
let updateState: ((WalletSendScreenState) -> WalletSendScreenState) -> Void
let updateText: (WalletSendScreenEntryTag, String) -> Void
let selectNextInputItem: (WalletSendScreenEntryTag) -> Void
let scrollToBottom: () -> Void
let dismissInput: () -> Void
let openQrScanner: () -> Void
let proceed: () -> Void
init(context: AccountContext, updateState: @escaping ((WalletSendScreenState) -> WalletSendScreenState) -> Void, updateText: @escaping (WalletSendScreenEntryTag, String) -> Void, selectNextInputItem: @escaping (WalletSendScreenEntryTag) -> Void, dismissInput: @escaping () -> Void, openQrScanner: @escaping () -> Void, proceed: @escaping () -> Void) {
init(context: AccountContext, updateState: @escaping ((WalletSendScreenState) -> WalletSendScreenState) -> Void, updateText: @escaping (WalletSendScreenEntryTag, String) -> Void, selectNextInputItem: @escaping (WalletSendScreenEntryTag) -> Void, scrollToBottom: @escaping () -> Void, dismissInput: @escaping () -> Void, openQrScanner: @escaping () -> Void, proceed: @escaping () -> Void) {
self.context = context
self.updateState = updateState
self.updateText = updateText
self.selectNextInputItem = selectNextInputItem
self.scrollToBottom = scrollToBottom
self.dismissInput = dismissInput
self.openQrScanner = openQrScanner
self.proceed = proceed
@ -231,6 +233,10 @@ private enum WalletSendScreenEntry: ItemListNodeEntry {
case let .comment(theme, placeholder, value):
return ItemListMultilineInputItem(theme: theme, text: value, placeholder: placeholder, maxLength: ItemListMultilineInputItemTextLimit(value: 128, display: true), sectionId: self.section, style: .blocks, returnKeyType: .send, textUpdated: { text in
arguments.updateText(WalletSendScreenEntryTag.comment, text)
}, updatedFocus: { focus in
if focus {
arguments.scrollToBottom()
}
}, tag: WalletSendScreenEntryTag.comment, action: {
arguments.proceed()
})
@ -285,7 +291,7 @@ public func walletSendScreen(context: AccountContext, tonContext: TonContext, wa
var dismissImpl: (() -> Void)?
var dismissInputImpl: (() -> Void)?
var selectNextInputItemImpl: ((WalletSendScreenEntryTag) -> Void)?
var ensureItemVisibleImpl: ((WalletSendScreenEntryTag) -> Void)?
var ensureItemVisibleImpl: ((WalletSendScreenEntryTag, Bool) -> Void)?
let arguments = WalletSendScreenArguments(context: context, updateState: { f in
updateState(f)
@ -302,9 +308,11 @@ public func walletSendScreen(context: AccountContext, tonContext: TonContext, wa
}
return state
}
ensureItemVisibleImpl?(tag)
ensureItemVisibleImpl?(tag, false)
}, selectNextInputItem: { tag in
selectNextInputItemImpl?(tag)
}, scrollToBottom: {
ensureItemVisibleImpl?(WalletSendScreenEntryTag.comment, true)
}, dismissInput: {
dismissInputImpl?()
}, openQrScanner: {
@ -368,8 +376,9 @@ public func walletSendScreen(context: AccountContext, tonContext: TonContext, wa
dismissAlertImpl?(true)
}), TextAlertAction(type: .defaultAction, title: "Confirm", action: {
dismissAlertImpl?(false)
dismissInputImpl?()
pushImpl?(WalletSplashScreen(context: context, tonContext: tonContext, mode: .sending(walletInfo, state.address, amount, state.comment)))
})], dismissAutomatically: false)
})], allowInputInset: false, dismissAutomatically: false)
presentInGlobalOverlayImpl?(controller, nil)
dismissAlertImpl = { [weak controller] animated in
@ -467,7 +476,7 @@ public func walletSendScreen(context: AccountContext, tonContext: TonContext, wa
resultItemNode.focus()
}
}
ensureItemVisibleImpl = { [weak controller] targetTag in
ensureItemVisibleImpl = { [weak controller] targetTag, animated in
controller?.afterLayout({
guard let controller = controller else {
return
@ -486,7 +495,7 @@ public func walletSendScreen(context: AccountContext, tonContext: TonContext, wa
})
if let resultItemNode = resultItemNode {
controller.ensureItemNodeVisible(resultItemNode)
controller.ensureItemNodeVisible(resultItemNode, animated: animated)
}
})
}

View File

@ -77,20 +77,17 @@ public final class WalletSplashScreen: ViewController {
return
}
if let navigationController = strongSelf.navigationController as? NavigationController {
var controllers = navigationController.viewControllers
controllers = controllers.filter { controller in
if controller is WalletSplashScreen {
return false
}
if controller is WalletSendScreen {
return false
}
var controllers: [UIViewController] = []
for controller in navigationController.viewControllers {
if controller is WalletInfoScreen {
return false
controllers.append(WalletInfoScreen(context: strongSelf.context, tonContext: strongSelf.tonContext, walletInfo: walletInfo, address: address))
} else {
controllers.append(controller)
}
return true
}
controllers.append(WalletSplashScreen(context: strongSelf.context, tonContext: strongSelf.tonContext, mode: .sent(walletInfo, amount)))
let controller = WalletSplashScreen(context: strongSelf.context, tonContext: strongSelf.tonContext, mode: .sent(walletInfo, amount))
controllers.append(controller)
strongSelf.view.endEditing(true)
navigationController.setViewControllers(controllers, animated: true)
}
@ -144,7 +141,7 @@ public final class WalletSplashScreen: ViewController {
})
case let .created(walletInfo, wordList):
strongSelf.push(WalletWordDisplayScreen(context: strongSelf.context, tonContext: strongSelf.tonContext, walletInfo: walletInfo, wordList: wordList, mode: .check))
case let .success(walletInfo), let .sent(walletInfo, _):
case let .success(walletInfo):
let _ = (walletAddress(publicKey: walletInfo.publicKey, tonInstance: strongSelf.tonContext.instance)
|> deliverOnMainQueue).start(next: { address in
guard let strongSelf = self else {
@ -159,6 +156,9 @@ public final class WalletSplashScreen: ViewController {
if controller is WalletWordDisplayScreen {
return false
}
if controller is WalletInfoScreen {
return false
}
if controller is WalletWordCheckScreen {
return false
}
@ -169,6 +169,27 @@ public final class WalletSplashScreen: ViewController {
navigationController.setViewControllers(controllers, animated: true)
}
})
case let .sent(walletInfo, _):
if let navigationController = strongSelf.navigationController as? NavigationController {
var controllers = navigationController.viewControllers
controllers = controllers.filter { controller in
if controller is WalletSendScreen {
return false
}
if controller is WalletSplashScreen {
return false
}
if controller is WalletWordDisplayScreen {
return false
}
if controller is WalletWordCheckScreen {
return false
}
return true
}
strongSelf.view.endEditing(true)
navigationController.setViewControllers(controllers, animated: true)
}
case .restoreFailed:
if let navigationController = strongSelf.navigationController as? NavigationController {
var controllers = navigationController.viewControllers