From 9747f70d5b0f09192eddff418eafbddc037cae3f Mon Sep 17 00:00:00 2001 From: Andrei Ashikhmin Date: Fri, 12 Jul 2024 14:56:14 +0700 Subject: [PATCH 1/6] chore: fix DashPay build errors by refactoring DashPaySetupFlowController to Swift --- .../DashPaySetupFlowController.swift | 258 ++++++++++++++ .../Setup/DWDashPaySetupFlowController.h | 49 --- .../Setup/DWDashPaySetupFlowController.m | 331 ------------------ .../DWUsernamePendingViewController.m | 2 +- DashWallet.xcodeproj/project.pbxproj | 12 +- .../DWContactsPlaceholderViewController.m | 3 +- .../Children/DWSearchStateViewController.m | 2 +- .../Invitation/Views/InvitationTopView.swift | 2 +- .../Views/DWUserProfileSendRequestCell.m | 6 +- .../Usernames/VotingInfoViewController.swift | 2 +- .../Home/HomeViewController+Shortcuts.swift | 2 +- .../Sources/UI/Home/HomeViewController.swift | 4 +- .../UI/Menu/Main/DWMainMenuViewController.m | 2 +- DashWallet/dashwallet-Bridging-Header.h | 8 + 14 files changed, 285 insertions(+), 398 deletions(-) create mode 100644 DashPay/Presentation/DashPaySetupFlowController.swift delete mode 100644 DashPay/Presentation/Setup/DWDashPaySetupFlowController.h delete mode 100644 DashPay/Presentation/Setup/DWDashPaySetupFlowController.m diff --git a/DashPay/Presentation/DashPaySetupFlowController.swift b/DashPay/Presentation/DashPaySetupFlowController.swift new file mode 100644 index 000000000..94a2b7597 --- /dev/null +++ b/DashPay/Presentation/DashPaySetupFlowController.swift @@ -0,0 +1,258 @@ +// +// Created by Andrew Podkovyrin +// Copyright © 2020 Dash Core Group. All rights reserved. +// +// Licensed under the MIT License (the "License"); +// you may not use this file except in compliance with the License. +// You may obtain a copy of the License at +// +// https://opensource.org/licenses/MIT +// +// Unless required by applicable law or agreed to in writing, software +// distributed under the License is distributed on an "AS IS" BASIS, +// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +// See the License for the specific language governing permissions and +// limitations under the License. +// + +import UIKit + +protocol DWDashPaySetupFlowControllerDelegate: AnyObject { + func dashPaySetupFlowController(_ controller: DashPaySetupFlowController, didConfirmUsername username: String) +} + +@objc(DWDashPaySetupFlowController) +class DashPaySetupFlowController: UIViewController, NavigationFullscreenable, DWCreateUsernameViewControllerDelegate, DWConfirmUsernameViewControllerDelegate, DWUsernamePendingViewControllerDelegate, DWRegistrationCompletedViewControllerDelegate { + + private(set) var dashPayModel: DWDashPayProtocol + private(set) var invitationURL: URL? + private(set) var definedUsername: String? + weak var confirmationDelegate: DWDashPaySetupFlowControllerDelegate? + + private var headerView: DWUsernameHeaderView! + private var contentView: UIView! + private var headerHeightConstraint: NSLayoutConstraint! + + private var containerController: DWContainerViewController! + private var createUsernameViewController: DWCreateUsernameViewController! + + @objc + init(dashPayModel: DWDashPayProtocol, invitationURL: URL?, definedUsername: String?) { + self.dashPayModel = dashPayModel + self.invitationURL = invitationURL + self.definedUsername = definedUsername + super.init(nibName: nil, bundle: nil) + } + + init(confirmationDelegate: DWDashPaySetupFlowControllerDelegate) { + self.dashPayModel = DWDashPaySetupModel() + self.confirmationDelegate = confirmationDelegate + super.init(nibName: nil, bundle: nil) + } + + required init?(coder: NSCoder) { + fatalError("init(coder:) has not been implemented") + } + + override func viewDidLoad() { + super.viewDidLoad() + + view.clipsToBounds = true + view.backgroundColor = UIColor.dw_secondaryBackground() + + view.addSubview(contentView) + view.addSubview(headerView) + + let isLandscape = view.bounds.width > view.bounds.height + let headerHeight = isLandscape ? LandscapeHeaderHeight() : HeaderHeight() + headerView.landscapeMode = isLandscape + headerHeightConstraint = headerView.heightAnchor.constraint(equalToConstant: headerHeight) + + NSLayoutConstraint.activate([ + headerView.topAnchor.constraint(equalTo: view.topAnchor), + headerView.leadingAnchor.constraint(equalTo: view.leadingAnchor), + view.trailingAnchor.constraint(equalTo: headerView.trailingAnchor), + headerHeightConstraint, + contentView.topAnchor.constraint(equalTo: headerView.bottomAnchor), + contentView.leadingAnchor.constraint(equalTo: view.leadingAnchor), + view.trailingAnchor.constraint(equalTo: contentView.trailingAnchor), + view.bottomAnchor.constraint(equalTo: contentView.bottomAnchor), + contentView.widthAnchor.constraint(equalTo: view.widthAnchor) + ]) + + containerController = DWContainerViewController() + embedChild(containerController, in: contentView) + + NotificationCenter.default.addObserver(self, selector: #selector(registrationStatusUpdatedNotification), name: NSNotification.Name.DWDashPayRegistrationStatusUpdated, object: nil) + + setCurrentStateController() + } + + override func viewWillTransition(to size: CGSize, with coordinator: UIViewControllerTransitionCoordinator) { + super.viewWillTransition(to: size, with: coordinator) + + coordinator.animate(alongsideTransition: { _ in + let isLandscape = size.width > size.height + self.headerView.landscapeMode = isLandscape + self.headerHeightConstraint.constant = isLandscape ? LandscapeHeaderHeight() : HeaderHeight() + }) + } + + override var preferredStatusBarStyle: UIStatusBarStyle { + return .default + } + + override func viewDidAppear(_ animated: Bool) { + super.viewDidAppear(animated) + headerView.showInitialAnimation() + } + + // MARK: - DWNavigationFullscreenable + + var requiresNoNavigationBar: Bool { + return true + } + + // MARK: - Private + + @objc private func registrationStatusUpdatedNotification() { + if MOCK_DASHPAY.boolValue { + setCurrentStateController() + return + } + + if let lastRegistrationError = dashPayModel.lastRegistrationError { + dw_displayErrorModally(lastRegistrationError) + } + + setCurrentStateController() + } + + private func setCurrentStateController() { + if let definedUsername = definedUsername { + createUsername(definedUsername) + return + } + + if dashPayModel.registrationStatus == nil || dashPayModel.registrationStatus?.failed == true { + showCreateUsernameController() + return + } + + if dashPayModel.registrationStatus?.state != .done { + showPendingController(dashPayModel.username) + } else { + showRegistrationCompletedController(dashPayModel.username) + } + } + + private func createUsername(_ username: String) { + guard let invitationURL = invitationURL else { return } + + dashPayModel.createUsername(username, invitation: invitationURL) + showPendingController(username) + } + + private func showPendingController(_ username: String?) { + guard let username = username else { return } + + if MOCK_DASHPAY.boolValue { + DWGlobalOptions.sharedInstance().dashpayUsername = username + showRegistrationCompletedController(username) + return + } + + let controller = DWUsernamePendingViewController() + controller.username = username + controller.delegate = self + headerView.titleBuilder = { controller.attributedTitle() } + containerController.transition(to: controller) + } + + private func showCreateUsernameController() { + createUsernameViewController = DWCreateUsernameViewController(dashPayModel: dashPayModel) + createUsernameViewController.delegate = self + headerView.titleBuilder = { self.createUsernameViewController.attributedTitle() } + containerController.transition(to: createUsernameViewController) + } + + private func showRegistrationCompletedController(_ username: String?) { + guard let username = username else { return } + assert(username.count > 1, "Invalid username") + + headerView.configurePlanetsView(withUsername: username) + + let controller = DWRegistrationCompletedViewController() + controller.username = username + controller.delegate = self + headerView.titleBuilder = { NSAttributedString() } + containerController.transition(to: controller) + } + + // MARK: - Actions + + @objc private func cancelButtonAction() { + if containerController.currentController is DWRegistrationCompletedViewController { + dashPayModel.completeRegistration() + } + + dismiss(animated: true, completion: nil) + } + + // MARK: - DWCreateUsernameViewControllerDelegate + + func createUsernameViewController(_ controller: DWCreateUsernameViewController, registerUsername username: String) { + if dashPayModel.shouldPresentRegistrationPaymentConfirmation() { + let confirmController = DWConfirmUsernameViewController(username: username) + confirmController.delegate = self + present(confirmController, animated: true, completion: nil) + } else { + createUsername(username) + } + } + + // MARK: - DWConfirmUsernameViewControllerDelegate + + func confirmUsernameViewControllerDidConfirm(_ controller: DWConfirmUsernameViewController) { + let username = controller.username + controller.dismiss(animated: true) { + if let delegate = self.confirmationDelegate { + delegate.dashPaySetupFlowController(self, didConfirmUsername: username) + } else { + self.createUsername(username) + } + } + } + + // MARK: - DWUsernamePendingViewControllerDelegate + + func usernamePendingViewControllerAction(_ controller: UIViewController) { + dismiss(animated: true, completion: nil) + } + + // MARK: - DWRegistrationCompletedViewControllerDelegate + + func registrationCompletedViewControllerAction(_ controller: UIViewController) { + dashPayModel.completeRegistration() + dismiss(animated: true, completion: nil) + } + + // MARK: - Helper Methods + + private func embedChild(_ viewController: UIViewController, in containerView: UIView) { + addChild(viewController) + containerView.addSubview(viewController.view) + viewController.view.frame = containerView.bounds + viewController.view.autoresizingMask = [.flexibleWidth, .flexibleHeight] + viewController.didMove(toParent: self) + } +} + +// Helper functions +private func HeaderHeight() -> CGFloat { + return 231.0 +} + +private func LandscapeHeaderHeight() -> CGFloat { + return 158.0 +} diff --git a/DashPay/Presentation/Setup/DWDashPaySetupFlowController.h b/DashPay/Presentation/Setup/DWDashPaySetupFlowController.h deleted file mode 100644 index 181377b05..000000000 --- a/DashPay/Presentation/Setup/DWDashPaySetupFlowController.h +++ /dev/null @@ -1,49 +0,0 @@ -// -// Created by Andrew Podkovyrin -// Copyright © 2020 Dash Core Group. All rights reserved. -// -// Licensed under the MIT License (the "License"); -// you may not use this file except in compliance with the License. -// You may obtain a copy of the License at -// -// https://opensource.org/licenses/MIT -// -// Unless required by applicable law or agreed to in writing, software -// distributed under the License is distributed on an "AS IS" BASIS, -// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. -// See the License for the specific language governing permissions and -// limitations under the License. -// - -#import - -#import "DWDashPayProtocol.h" -#import "dashwallet-Swift.h" - -NS_ASSUME_NONNULL_BEGIN - -@class DWDashPaySetupFlowController; - -@protocol DWDashPaySetupFlowControllerDelegate - -- (void)dashPaySetupFlowController:(DWDashPaySetupFlowController *)controller - didConfirmUsername:(NSString *)username; - -@end - -@interface DWDashPaySetupFlowController : UIViewController - -- (instancetype)initWithDashPayModel:(id)dashPayModel - invitation:(nullable NSURL *)invitationURL - definedUsername:(nullable NSString *)definedUsername; - -- (instancetype)initWithConfirmationDelegate:(id)delegate; - -- (instancetype)initWithNibName:(nullable NSString *)nibNameOrNil bundle:(nullable NSBundle *)nibBundleOrNil NS_UNAVAILABLE; -- (instancetype)init NS_UNAVAILABLE; -- (instancetype)initWithCoder:(NSCoder *)coder NS_UNAVAILABLE; -+ (instancetype)new NS_UNAVAILABLE; - -@end - -NS_ASSUME_NONNULL_END diff --git a/DashPay/Presentation/Setup/DWDashPaySetupFlowController.m b/DashPay/Presentation/Setup/DWDashPaySetupFlowController.m deleted file mode 100644 index b703e0233..000000000 --- a/DashPay/Presentation/Setup/DWDashPaySetupFlowController.m +++ /dev/null @@ -1,331 +0,0 @@ -// -// Created by Andrew Podkovyrin -// Copyright © 2020 Dash Core Group. All rights reserved. -// -// Licensed under the MIT License (the "License"); -// you may not use this file except in compliance with the License. -// You may obtain a copy of the License at -// -// https://opensource.org/licenses/MIT -// -// Unless required by applicable law or agreed to in writing, software -// distributed under the License is distributed on an "AS IS" BASIS, -// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. -// See the License for the specific language governing permissions and -// limitations under the License. -// - -#import "DWDashPaySetupFlowController.h" - -#import "DWConfirmUsernameViewController.h" -#import "DWContainerViewController.h" -#import "DWCreateUsernameViewController.h" -#import "DWDPRegistrationStatus.h" -#import "DWDashPaySetupModel.h" -#import "DWRegistrationCompletedViewController.h" -#import "DWUIKit.h" -#import "DWUsernameHeaderView.h" -#import "DWUsernamePendingViewController.h" -#import "UIViewController+DWDisplayError.h" -#import "UIViewController+DWEmbedding.h" - -static CGFloat const HeaderHeight(void) { - if (IS_IPHONE_6 || IS_IPHONE_5_OR_LESS) { - return 135.0; - } - else { - return 231.0; - } -} - -static CGFloat const LandscapeHeaderHeight(void) { - return 158.0; -} - -NS_ASSUME_NONNULL_BEGIN - -@interface DWDashPaySetupFlowController () - -@property (readonly, nonatomic, strong) id dashPayModel; -@property (nullable, nonatomic, readonly, strong) NSURL *invitationURL; -@property (nullable, nonatomic, readonly, copy) NSString *definedUsername; -@property (nullable, nonatomic, weak) id confirmationDelegate; - -@property (null_resettable, nonatomic, strong) DWUsernameHeaderView *headerView; -@property (null_resettable, nonatomic, strong) UIView *contentView; -@property (nonatomic, strong) NSLayoutConstraint *headerHeightConstraint; - -@property (nonatomic, strong) DWContainerViewController *containerController; -@property (null_resettable, nonatomic, strong) DWCreateUsernameViewController *createUsernameViewController; - -@end - -NS_ASSUME_NONNULL_END - -@implementation DWDashPaySetupFlowController - -- (instancetype)initWithDashPayModel:(id)dashPayModel - invitation:(NSURL *)invitationURL - definedUsername:(NSString *)definedUsername { - self = [super initWithNibName:nil bundle:nil]; - if (self) { - _dashPayModel = dashPayModel; - _invitationURL = invitationURL; - _definedUsername = definedUsername; - } - return self; -} - -- (instancetype)initWithConfirmationDelegate:(id)delegate { - self = [super initWithNibName:nil bundle:nil]; - if (self) { - _dashPayModel = [[DWDashPaySetupModel alloc] init]; - _invitationURL = nil; - _confirmationDelegate = delegate; - } - return self; -} - -- (void)viewDidLoad { - [super viewDidLoad]; - - self.view.clipsToBounds = YES; - self.view.backgroundColor = [UIColor dw_secondaryBackgroundColor]; - - [self.view addSubview:self.contentView]; - [self.view addSubview:self.headerView]; - - const BOOL isLandscape = CGRectGetWidth(self.view.bounds) > CGRectGetHeight(self.view.bounds); - const CGFloat headerHeight = isLandscape ? LandscapeHeaderHeight() : HeaderHeight(); - self.headerView.landscapeMode = isLandscape; - - [NSLayoutConstraint activateConstraints:@[ - [self.headerView.topAnchor constraintEqualToAnchor:self.view.topAnchor], - [self.headerView.leadingAnchor constraintEqualToAnchor:self.view.leadingAnchor], - [self.view.trailingAnchor constraintEqualToAnchor:self.headerView.trailingAnchor], - (self.headerHeightConstraint = [self.headerView.heightAnchor constraintEqualToConstant:headerHeight]), - - [self.contentView.topAnchor constraintEqualToAnchor:self.headerView.bottomAnchor], - [self.contentView.leadingAnchor constraintEqualToAnchor:self.view.leadingAnchor], - [self.view.trailingAnchor constraintEqualToAnchor:self.contentView.trailingAnchor], - [self.view.bottomAnchor constraintEqualToAnchor:self.contentView.bottomAnchor], - [self.contentView.widthAnchor constraintEqualToAnchor:self.view.widthAnchor], - ]]; - - self.containerController = [[DWContainerViewController alloc] init]; - [self dw_embedChild:self.containerController inContainer:self.contentView]; - - [[NSNotificationCenter defaultCenter] addObserver:self - selector:@selector(registrationStatusUpdatedNotification) - name:DWDashPayRegistrationStatusUpdatedNotification - object:nil]; - - [self setCurrentStateController]; -} - -- (void)viewWillTransitionToSize:(CGSize)size withTransitionCoordinator:(id)coordinator { - [super viewWillTransitionToSize:size withTransitionCoordinator:coordinator]; - - [coordinator - animateAlongsideTransition:^(id context) { - BOOL isLandscape = size.width > size.height; - self.headerView.landscapeMode = isLandscape; - if (isLandscape) { - self.headerHeightConstraint.constant = LandscapeHeaderHeight(); - } - else { - self.headerHeightConstraint.constant = HeaderHeight(); - } - } - completion:^(id _Nonnull context){ - - }]; -} - -- (UIStatusBarStyle)preferredStatusBarStyle { - return UIStatusBarStyleDefault; -} - -- (void)viewDidAppear:(BOOL)animated { - [super viewDidAppear:animated]; - - [self.headerView showInitialAnimation]; -} - -#pragma mark - DWNavigationFullscreenable - -- (BOOL)requiresNoNavigationBar { - return YES; -} - -#pragma mark - Private - -- (void)registrationStatusUpdatedNotification { - if (MOCK_DASHPAY) { - [self setCurrentStateController]; - return; - } - - if (self.dashPayModel.lastRegistrationError) { - [self dw_displayErrorModally:self.dashPayModel.lastRegistrationError]; - } - - [self setCurrentStateController]; -} - -- (void)setCurrentStateController { - if (self.definedUsername != nil) { - [self createUsername:self.definedUsername]; - return; - } - - if (self.dashPayModel.registrationStatus == nil || self.dashPayModel.registrationStatus.failed) { - [self showCreateUsernameController]; - - return; - } - - if (self.dashPayModel.registrationStatus.state != DWDPRegistrationState_Done) { - [self showPendingController:self.dashPayModel.username]; - } - else { - [self showRegistrationCompletedController:self.dashPayModel.username]; - } -} - -- (void)createUsername:(NSString *)username { - __weak typeof(self) weakSelf = self; - [self.dashPayModel createUsername:username invitation:self.invitationURL]; - [self showPendingController:username]; -} - -- (UIView *)contentView { - if (_contentView == nil) { - _contentView = [[UIView alloc] initWithFrame:CGRectZero]; - _contentView.translatesAutoresizingMaskIntoConstraints = NO; - } - return _contentView; -} - -- (DWUsernameHeaderView *)headerView { - if (_headerView == nil) { - _headerView = [[DWUsernameHeaderView alloc] initWithFrame:CGRectZero]; - _headerView.translatesAutoresizingMaskIntoConstraints = NO; - _headerView.preservesSuperviewLayoutMargins = YES; - _headerView.cancelButton.hidden = self.confirmationDelegate != nil; - [_headerView.cancelButton addTarget:self - action:@selector(cancelButtonAction) - forControlEvents:UIControlEventTouchUpInside]; - } - - return _headerView; -} - -- (DWCreateUsernameViewController *)createUsernameViewController { - if (_createUsernameViewController == nil) { - DWCreateUsernameViewController *controller = - [[DWCreateUsernameViewController alloc] initWithDashPayModel:self.dashPayModel]; - controller.delegate = self; - _createUsernameViewController = controller; - } - return _createUsernameViewController; -} - -- (void)showPendingController:(NSString *)username { - if (MOCK_DASHPAY) { - [DWGlobalOptions sharedInstance].dashpayUsername = username; - [self showRegistrationCompletedController:username]; - return; - } - - DWUsernamePendingViewController *controller = [[DWUsernamePendingViewController alloc] init]; - controller.username = username; - controller.delegate = self; - __weak DWUsernamePendingViewController *weakController = controller; - self.headerView.titleBuilder = ^NSAttributedString *_Nonnull { - return [weakController attributedTitle]; - }; - [self.containerController transitionToController:controller]; -} - -- (void)showCreateUsernameController { - DWCreateUsernameViewController *controller = self.createUsernameViewController; - __weak DWCreateUsernameViewController *weakController = controller; - self.headerView.titleBuilder = ^NSAttributedString *_Nonnull { - return [weakController attributedTitle]; - }; - [self.containerController transitionToController:controller]; -} - -- (void)showRegistrationCompletedController:(NSString *)username { - NSAssert(username.length > 1, @"Invalid username"); - - [self.headerView configurePlanetsViewWithUsername:username]; - - DWRegistrationCompletedViewController *controller = [[DWRegistrationCompletedViewController alloc] init]; - controller.username = username; - controller.delegate = self; - self.headerView.titleBuilder = ^NSAttributedString *_Nonnull { - return [[NSAttributedString alloc] init]; - }; - [self.containerController transitionToController:controller]; -} - -#pragma mark - Actions - -- (void)cancelButtonAction { - if ([_containerController.currentController isKindOfClass:[DWRegistrationCompletedViewController class]]) { - [self.dashPayModel completeRegistration]; - } - - [self dismissViewControllerAnimated:YES completion:nil]; -} - -#pragma mark - DWCreateUsernameViewControllerDelegate - -- (void)createUsernameViewController:(DWCreateUsernameViewController *)controller - registerUsername:(NSString *)username { - if ([self.dashPayModel shouldPresentRegistrationPaymentConfirmation]) { - DWConfirmUsernameViewController *confirmController = [[DWConfirmUsernameViewController alloc] initWithUsername:username]; - confirmController.delegate = self; - [self presentViewController:confirmController animated:YES completion:nil]; - } - else { - [self createUsername:username]; - } -} - -#pragma mark - DWConfirmUsernameViewControllerDelegate - -- (void)confirmUsernameViewControllerDidConfirm:(DWConfirmUsernameViewController *)controller { - NSString *username = controller.username; - [controller dismissViewControllerAnimated:YES - completion:^{ - if (self.confirmationDelegate) { - [self.confirmationDelegate dashPaySetupFlowController:self didConfirmUsername:username]; - } - else { - // initiate creation process once confirmation is dismissed because - // DashSync will be showing pin request modally - [self createUsername:username]; - } - }]; -} - -#pragma mark - DWUsernamePendingViewControllerDelegate - -- (void)usernamePendingViewControllerAction:(UIViewController *)controller { - [self dismissViewControllerAnimated:YES completion:nil]; -} - -#pragma mark - DWRegistrationCompletedViewControllerDelegate - -- (void)registrationCompletedViewControllerAction:(UIViewController *)controller { - [self.dashPayModel completeRegistration]; - [self dismissViewControllerAnimated:YES completion:nil]; -} - -@end diff --git a/DashPay/Presentation/Setup/UsernamePending/DWUsernamePendingViewController.m b/DashPay/Presentation/Setup/UsernamePending/DWUsernamePendingViewController.m index bc148f7df..4b8124dcf 100644 --- a/DashPay/Presentation/Setup/UsernamePending/DWUsernamePendingViewController.m +++ b/DashPay/Presentation/Setup/UsernamePending/DWUsernamePendingViewController.m @@ -155,7 +155,7 @@ - (UILabel *)detailLabel { - (UIButton *)actionButton { if (_actionButton == nil) { - DashButton *actionButton = [[DashButton alloc] init]; + DWDashButton *actionButton = [[DWDashButton alloc] init]; actionButton.translatesAutoresizingMaskIntoConstraints = NO; actionButton.layer.cornerRadius = 8; actionButton.titleLabel.font = [UIFont dw_fontForTextStyle:UIFontTextStyleSubheadline]; diff --git a/DashWallet.xcodeproj/project.pbxproj b/DashWallet.xcodeproj/project.pbxproj index 3750feefe..1bccab562 100644 --- a/DashWallet.xcodeproj/project.pbxproj +++ b/DashWallet.xcodeproj/project.pbxproj @@ -588,6 +588,8 @@ 758CE59C2BC566DE0062AF53 /* PrivacyInfo.xcprivacy in Resources */ = {isa = PBXBuildFile; fileRef = 758CE59B2BC566DE0062AF53 /* PrivacyInfo.xcprivacy */; }; 758CE59D2BC566DE0062AF53 /* PrivacyInfo.xcprivacy in Resources */ = {isa = PBXBuildFile; fileRef = 758CE59B2BC566DE0062AF53 /* PrivacyInfo.xcprivacy */; }; 758CE59E2BC566DE0062AF53 /* PrivacyInfo.xcprivacy in Resources */ = {isa = PBXBuildFile; fileRef = 758CE59B2BC566DE0062AF53 /* PrivacyInfo.xcprivacy */; }; + 759063E82C411029002F2AA9 /* DashPaySetupFlowController.swift in Sources */ = {isa = PBXBuildFile; fileRef = 759063E72C411029002F2AA9 /* DashPaySetupFlowController.swift */; }; + 759063E92C411673002F2AA9 /* ZenLedgerInfoSheet.swift in Sources */ = {isa = PBXBuildFile; fileRef = 75EBAA1C2BBA71D9004488E3 /* ZenLedgerInfoSheet.swift */; }; 7592AA7C2B9B08C000417F9E /* SupportedTopperPaymentMethods.swift in Sources */ = {isa = PBXBuildFile; fileRef = 7592AA7B2B9B08C000417F9E /* SupportedTopperPaymentMethods.swift */; }; 7592AA7D2B9B08C000417F9E /* SupportedTopperPaymentMethods.swift in Sources */ = {isa = PBXBuildFile; fileRef = 7592AA7B2B9B08C000417F9E /* SupportedTopperPaymentMethods.swift */; }; 759ADD572BF3447400767ACD /* Button.swift in Sources */ = {isa = PBXBuildFile; fileRef = 759ADD562BF3447400767ACD /* Button.swift */; }; @@ -872,7 +874,6 @@ C943B5582A40DA3700AF23C5 /* DWFullScreenModalControllerViewController.m in Sources */ = {isa = PBXBuildFile; fileRef = C943B5572A40DA3700AF23C5 /* DWFullScreenModalControllerViewController.m */; }; C943B55B2A40DD4000AF23C5 /* NSArray+DWFlatten.m in Sources */ = {isa = PBXBuildFile; fileRef = C943B55A2A40DD4000AF23C5 /* NSArray+DWFlatten.m */; }; C943B55E2A40E6F200AF23C5 /* DWFilterHeaderView.m in Sources */ = {isa = PBXBuildFile; fileRef = C943B55C2A40E6F200AF23C5 /* DWFilterHeaderView.m */; }; - C943B5892A40ED5A00AF23C5 /* DWDashPaySetupFlowController.m in Sources */ = {isa = PBXBuildFile; fileRef = C943B5612A40ED4000AF23C5 /* DWDashPaySetupFlowController.m */; }; C943B58A2A40ED5F00AF23C5 /* DWUsernamePendingViewController.m in Sources */ = {isa = PBXBuildFile; fileRef = C943B5632A40ED4000AF23C5 /* DWUsernamePendingViewController.m */; }; C943B58B2A40ED6F00AF23C5 /* DWInputUsernameViewController.m in Sources */ = {isa = PBXBuildFile; fileRef = C943B56F2A40ED4200AF23C5 /* DWInputUsernameViewController.m */; }; C943B58C2A40ED6F00AF23C5 /* DWUsernameValidationRule.m in Sources */ = {isa = PBXBuildFile; fileRef = C943B5882A40ED4500AF23C5 /* DWUsernameValidationRule.m */; }; @@ -2453,6 +2454,7 @@ 75889B752AD296E700C17F5D /* CoinJoinInfoViewController.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = CoinJoinInfoViewController.swift; sourceTree = ""; }; 75889B802AD2D7F800C17F5D /* Base */ = {isa = PBXFileReference; lastKnownFileType = file.storyboard; name = Base; path = Base.lproj/CoinJoin.storyboard; sourceTree = ""; }; 758CE59B2BC566DE0062AF53 /* PrivacyInfo.xcprivacy */ = {isa = PBXFileReference; lastKnownFileType = text.xml; path = PrivacyInfo.xcprivacy; sourceTree = ""; }; + 759063E72C411029002F2AA9 /* DashPaySetupFlowController.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = DashPaySetupFlowController.swift; sourceTree = ""; }; 7592AA7B2B9B08C000417F9E /* SupportedTopperPaymentMethods.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = SupportedTopperPaymentMethods.swift; sourceTree = ""; }; 759816E519357D6F005060EA /* BRBubbleView.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = BRBubbleView.h; sourceTree = ""; }; 759816E619357D6F005060EA /* BRBubbleView.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; path = BRBubbleView.m; sourceTree = ""; }; @@ -2921,8 +2923,6 @@ C943B55A2A40DD4000AF23C5 /* NSArray+DWFlatten.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; path = "NSArray+DWFlatten.m"; sourceTree = ""; }; C943B55C2A40E6F200AF23C5 /* DWFilterHeaderView.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; path = DWFilterHeaderView.m; sourceTree = ""; }; C943B55D2A40E6F200AF23C5 /* DWFilterHeaderView.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = DWFilterHeaderView.h; sourceTree = ""; }; - C943B5602A40ED4000AF23C5 /* DWDashPaySetupFlowController.h */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; path = DWDashPaySetupFlowController.h; sourceTree = ""; }; - C943B5612A40ED4000AF23C5 /* DWDashPaySetupFlowController.m */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.objc; path = DWDashPaySetupFlowController.m; sourceTree = ""; }; C943B5632A40ED4000AF23C5 /* DWUsernamePendingViewController.m */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.objc; path = DWUsernamePendingViewController.m; sourceTree = ""; }; C943B5642A40ED4000AF23C5 /* DWUsernamePendingViewController.h */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; path = DWUsernamePendingViewController.h; sourceTree = ""; }; C943B5662A40ED4100AF23C5 /* DWConfirmUsernameViewController.h */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; path = DWConfirmUsernameViewController.h; sourceTree = ""; }; @@ -7356,6 +7356,7 @@ C943B33D2A408DB900AF23C5 /* Menu */, C943B2B22A408CAF00AF23C5 /* Profile */, C9D2C96D2A38777A00D15901 /* Setup */, + 759063E72C411029002F2AA9 /* DashPaySetupFlowController.swift */, C9D2C9592A386A6700D15901 /* Home */, C9D2C95A2A386D5200D15901 /* Shared */, ); @@ -7440,8 +7441,6 @@ C943B5622A40ED4000AF23C5 /* UsernamePending */, C943B56B2A40ED4100AF23C5 /* CreateUsername */, C943B5682A40ED4100AF23C5 /* RegistrationCompleted */, - C943B5612A40ED4000AF23C5 /* DWDashPaySetupFlowController.m */, - C943B5602A40ED4000AF23C5 /* DWDashPaySetupFlowController.h */, C943B5652A40ED4000AF23C5 /* ConfirmUsername */, C9D2C96E2A38778400D15901 /* Model */, ); @@ -9286,6 +9285,7 @@ C943B3192A408CED00AF23C5 /* DWDPUpdateProfileModel.m in Sources */, C9D2C7702A320AA000D15901 /* CrowdNodeModel.swift in Sources */, 75889B792AD2A04900C17F5D /* CoinJoinInfoViewController.swift in Sources */, + 759063E92C411673002F2AA9 /* ZenLedgerInfoSheet.swift in Sources */, C9D2C7712A320AA000D15901 /* UIDevice+Compatibility.swift in Sources */, C9D2C7722A320AA000D15901 /* DWSeedWordView.m in Sources */, C9D2C7732A320AA000D15901 /* DWSecurityStatusView.m in Sources */, @@ -9371,7 +9371,6 @@ C9D2C7B42A320AA000D15901 /* DWUpholdTransactionObject+DWView.m in Sources */, C9D2C7B52A320AA000D15901 /* DWBackupSeedPhraseViewController.m in Sources */, C943B54A2A40B52F00AF23C5 /* NSLayoutConstraint+DWAutolayout.m in Sources */, - C943B5892A40ED5A00AF23C5 /* DWDashPaySetupFlowController.m in Sources */, C9D2C7B62A320AA000D15901 /* CrowdNodeDepositTx.swift in Sources */, C943B5962A40EDC400AF23C5 /* DWRegistrationCompletedViewController.m in Sources */, C9D2C7B92A320AA000D15901 /* DWIntrinsicTableView.m in Sources */, @@ -9752,6 +9751,7 @@ 7573C2E52B01120B00F4C347 /* MasternodeKey.swift in Sources */, C9D2C8F02A320AA000D15901 /* DWProgressView.m in Sources */, C9D2C8F12A320AA000D15901 /* TxDetailCells.swift in Sources */, + 759063E82C411029002F2AA9 /* DashPaySetupFlowController.swift in Sources */, C9D2C8F22A320AA000D15901 /* BaseViewController+NetworkReachability.swift in Sources */, C9D2C8F32A320AA000D15901 /* main.m in Sources */, C9D2C8F42A320AA000D15901 /* DWQuickReceiveViewController.m in Sources */, diff --git a/DashWallet/Sources/UI/DashPay/Contacts/DWContactsPlaceholderViewController.m b/DashWallet/Sources/UI/DashPay/Contacts/DWContactsPlaceholderViewController.m index cfd292a55..b7f1a0555 100644 --- a/DashWallet/Sources/UI/DashPay/Contacts/DWContactsPlaceholderViewController.m +++ b/DashWallet/Sources/UI/DashPay/Contacts/DWContactsPlaceholderViewController.m @@ -20,6 +20,7 @@ #import "DWDashPayModel.h" #import "DWDashPaySetupFlowController.h" #import "DWUIKit.h" +#import "dashwallet-Swift.h" @interface DWContactsPlaceholderViewController () @@ -112,7 +113,7 @@ - (void)actionButtonAction:(id)sender { DWDashPaySetupFlowController *controller = [[DWDashPaySetupFlowController alloc] initWithDashPayModel:self.dashPayModel - invitation:nil + invitationURL:nil definedUsername:nil]; controller.modalPresentationStyle = UIModalPresentationFullScreen; [self presentViewController:controller animated:YES completion:nil]; diff --git a/DashWallet/Sources/UI/DashPay/Contacts/GlobalSearch/Children/DWSearchStateViewController.m b/DashWallet/Sources/UI/DashPay/Contacts/GlobalSearch/Children/DWSearchStateViewController.m index 8909825f2..d43e5845c 100644 --- a/DashWallet/Sources/UI/DashPay/Contacts/GlobalSearch/Children/DWSearchStateViewController.m +++ b/DashWallet/Sources/UI/DashPay/Contacts/GlobalSearch/Children/DWSearchStateViewController.m @@ -171,7 +171,7 @@ - (UILabel *)descriptionLabel { - (UIButton *)actionButton { if (_actionButton == nil) { - DashButton *button = [[DashButton alloc] init]; + DWDashButton *button = [[DWDashButton alloc] init]; button.translatesAutoresizingMaskIntoConstraints = NO; [button addTarget:self action:@selector(actionButtonAction:) forControlEvents:UIControlEventTouchUpInside]; _actionButton = button; diff --git a/DashWallet/Sources/UI/DashPay/Invites/Invitation/Views/InvitationTopView.swift b/DashWallet/Sources/UI/DashPay/Invites/Invitation/Views/InvitationTopView.swift index 93aaa6008..7396244f8 100644 --- a/DashWallet/Sources/UI/DashPay/Invites/Invitation/Views/InvitationTopView.swift +++ b/DashWallet/Sources/UI/DashPay/Invites/Invitation/Views/InvitationTopView.swift @@ -94,7 +94,7 @@ class InvitationTopView: BaseInvitationTopView { let now = chain.timestamp(forBlockHeight: UInt32(TX_UNCONFIRMED)) let txTime = (transaction.timestamp > 1) ? transaction.timestamp : now let txDate = Date(timeIntervalSince1970: txTime) - let dateString = DWDateFormatter.sharedInstance.shortString(from: txDate) + let dateString = DWDateFormatter.sharedInstance.dateOnly(from: txDate) dateLabel.text = dateString } } diff --git a/DashWallet/Sources/UI/DashPay/Profile/Views/DWUserProfileSendRequestCell.m b/DashWallet/Sources/UI/DashPay/Profile/Views/DWUserProfileSendRequestCell.m index 61e6cadc9..c5c98c2cd 100644 --- a/DashWallet/Sources/UI/DashPay/Profile/Views/DWUserProfileSendRequestCell.m +++ b/DashWallet/Sources/UI/DashPay/Profile/Views/DWUserProfileSendRequestCell.m @@ -26,7 +26,7 @@ @interface DWUserProfileSendRequestCell () @property (readonly, nonatomic, strong) UILabel *textLabel; -@property (readonly, nonatomic, strong) DWActionButton *sendRequestButton; +@property (readonly, nonatomic, strong) DWDashButton *sendRequestButton; @property (readonly, nonatomic, strong) UIActivityIndicatorView *activityIndicatorView; @property (nullable, nonatomic, strong) NSLayoutConstraint *contentWidthConstraint; @@ -64,7 +64,7 @@ - (instancetype)initWithFrame:(CGRect)frame { textLabel.textAlignment = NSTextAlignmentCenter; _textLabel = textLabel; - DashButton *sendRequestButton = [[DashButton alloc] init]; + DWDashButton *sendRequestButton = [[DWDashButton alloc] init]; sendRequestButton.translatesAutoresizingMaskIntoConstraints = NO; [sendRequestButton setImage:[UIImage imageNamed:@"dp_send_request"] forState:UIControlStateNormal]; [sendRequestButton setTitle:NSLocalizedString(@"Send Contact Request", nil) forState:UIControlStateNormal]; @@ -74,7 +74,7 @@ - (instancetype)initWithFrame:(CGRect)frame { _sendRequestButton = sendRequestButton; // fire up activity indicator in advance to fix reuse issue - UIActivityIndicatorView *activityIndicatorView = [[UIActivityIndicatorView alloc] initWithActivityIndicatorStyle:UIActivityIndicatorViewStyleWhite]; + UIActivityIndicatorView *activityIndicatorView = [[UIActivityIndicatorView alloc] initWithActivityIndicatorStyle:UIActivityIndicatorViewStyleMedium]; activityIndicatorView.translatesAutoresizingMaskIntoConstraints = NO; activityIndicatorView.color = [UIColor dw_dashBlueColor]; [activityIndicatorView startAnimating]; diff --git a/DashWallet/Sources/UI/DashPay/Usernames/VotingInfoViewController.swift b/DashWallet/Sources/UI/DashPay/Usernames/VotingInfoViewController.swift index fbb58ed0f..c679f588a 100644 --- a/DashWallet/Sources/UI/DashPay/Usernames/VotingInfoViewController.swift +++ b/DashWallet/Sources/UI/DashPay/Usernames/VotingInfoViewController.swift @@ -65,7 +65,7 @@ extension VotingInfoViewController { timelineTitle.text = NSLocalizedString("Voting will not be required forever", comment: "Usernames") let endDate = Date(timeIntervalSince1970: VotingConstants.votingEndTime) - timelineSubtitle.text = String.localizedStringWithFormat(NSLocalizedString("After voting is completed on %@ you can create any username that has not already been created", comment: "Usernames"), DWDateFormatter.sharedInstance.shortString(from: endDate)) + timelineSubtitle.text = String.localizedStringWithFormat(NSLocalizedString("After voting is completed on %@ you can create any username that has not already been created", comment: "Usernames"), DWDateFormatter.sharedInstance.dateOnly(from: endDate)) notApprovedTitle.text = NSLocalizedString("In case your request is not approved", comment: "Usernames") notApprovedSubtitle.text = NSLocalizedString("Pay now and if not approved, you can create a different name without paying again", comment: "Usernames") diff --git a/DashWallet/Sources/UI/Home/HomeViewController+Shortcuts.swift b/DashWallet/Sources/UI/Home/HomeViewController+Shortcuts.swift index 9705979f4..b51c2194b 100644 --- a/DashWallet/Sources/UI/Home/HomeViewController+Shortcuts.swift +++ b/DashWallet/Sources/UI/Home/HomeViewController+Shortcuts.swift @@ -102,7 +102,7 @@ extension HomeViewController: DWLocalCurrencyViewControllerDelegate, DWExploreTe func showCreateUsername(withInvitation invitationURL: URL?, definedUsername: String?) { #if DASHPAY - let controller = DWDashPaySetupFlowController(dashPayModel: model.dashPayModel, invitation: nil, definedUsername: nil) + let controller = DashPaySetupFlowController(dashPayModel: model.dashPayModel, invitationURL: nil, definedUsername: nil) controller.modalPresentationStyle = .fullScreen present(controller, animated: true, completion: nil) #endif diff --git a/DashWallet/Sources/UI/Home/HomeViewController.swift b/DashWallet/Sources/UI/Home/HomeViewController.swift index 525ed1913..e7f21ff24 100644 --- a/DashWallet/Sources/UI/Home/HomeViewController.swift +++ b/DashWallet/Sources/UI/Home/HomeViewController.swift @@ -232,11 +232,11 @@ class HomeViewController: DWBasePayViewController { extension HomeViewController: DWRootEditProfileViewControllerDelegate { func editProfileViewController(_ controller: DWRootEditProfileViewController, updateDisplayName rawDisplayName: String, aboutMe rawAboutMe: String, avatarURLString: String?) { model.dashPayModel.userProfile.updateModel.update(withDisplayName: rawDisplayName, aboutMe: rawAboutMe, avatarURLString: avatarURLString) - controller.navigateBack(animated: true, completion: nil) + controller.dismiss(animated: true, completion: nil) } func editProfileViewControllerDidCancel(_ controller: DWRootEditProfileViewController) { - controller.navigateBack(animated: true, completion: nil) + controller.dismiss(animated: true, completion: nil) } } #endif diff --git a/DashWallet/Sources/UI/Menu/Main/DWMainMenuViewController.m b/DashWallet/Sources/UI/Menu/Main/DWMainMenuViewController.m index 955310a66..b2320092d 100644 --- a/DashWallet/Sources/UI/Menu/Main/DWMainMenuViewController.m +++ b/DashWallet/Sources/UI/Menu/Main/DWMainMenuViewController.m @@ -232,7 +232,7 @@ - (void)mainMenuContentView:(DWMainMenuContentView *)view joinDashPayAction:(UIB DWDashPaySetupFlowController *controller = [[DWDashPaySetupFlowController alloc] initWithDashPayModel:self.dashPayModel - invitation:nil + invitationURL:nil definedUsername:nil]; controller.modalPresentationStyle = UIModalPresentationFullScreen; [self presentViewController:controller animated:YES completion:nil]; diff --git a/DashWallet/dashwallet-Bridging-Header.h b/DashWallet/dashwallet-Bridging-Header.h index 92bf619d4..082326e85 100644 --- a/DashWallet/dashwallet-Bridging-Header.h +++ b/DashWallet/dashwallet-Bridging-Header.h @@ -119,6 +119,14 @@ static const bool _SNAPSHOT = 0; #import "DWRootContactsViewController.h" #import "DWNotificationsProvider.h" #import "DWContactsViewController.h" +#import "DWCreateUsernameViewController.h" +#import "DWConfirmUsernameViewController.h" +#import "DWUsernamePendingViewController.h" +#import "DWRegistrationCompletedViewController.h" +#import "DWUsernameHeaderView.h" +#import "DWContainerViewController.h" +#import "DWDashPaySetupModel.h" +#import "UIViewController+DWDisplayError.h" #endif //MARK: CrowdNode From cd3e11222936594a04fc74ba3e5644681114dc3f Mon Sep 17 00:00:00 2001 From: Andrei Ashikhmin Date: Fri, 12 Jul 2024 19:48:30 +0700 Subject: [PATCH 2/6] fix: DashPaySetupFlowController crash --- .../DashPaySetupFlowController.swift | 29 ++++++++++++------- .../Setup/Model/DWDashPaySetupModel.m | 2 +- DashWallet.xcodeproj/project.pbxproj | 2 +- .../DWContactsPlaceholderViewController.m | 1 - .../Sources/UI/Home/Models/DWDashPayModel.m | 2 +- .../UI/Home/Protocols/DWDashPayProtocol.h | 2 +- .../UI/Menu/Main/DWMainMenuViewController.m | 1 - 7 files changed, 22 insertions(+), 17 deletions(-) rename DashPay/Presentation/{ => Setup}/DashPaySetupFlowController.swift (91%) diff --git a/DashPay/Presentation/DashPaySetupFlowController.swift b/DashPay/Presentation/Setup/DashPaySetupFlowController.swift similarity index 91% rename from DashPay/Presentation/DashPaySetupFlowController.swift rename to DashPay/Presentation/Setup/DashPaySetupFlowController.swift index 94a2b7597..ce668e916 100644 --- a/DashPay/Presentation/DashPaySetupFlowController.swift +++ b/DashPay/Presentation/Setup/DashPaySetupFlowController.swift @@ -28,14 +28,25 @@ class DashPaySetupFlowController: UIViewController, NavigationFullscreenable, DW private(set) var invitationURL: URL? private(set) var definedUsername: String? weak var confirmationDelegate: DWDashPaySetupFlowControllerDelegate? - - private var headerView: DWUsernameHeaderView! - private var contentView: UIView! private var headerHeightConstraint: NSLayoutConstraint! - private var containerController: DWContainerViewController! private var createUsernameViewController: DWCreateUsernameViewController! + private let contentView: UIView = { + let view = UIView(frame: .zero) + view.translatesAutoresizingMaskIntoConstraints = false + return view + }() + + private(set) lazy var headerView: DWUsernameHeaderView = { + let view = DWUsernameHeaderView(frame: .zero) + view.translatesAutoresizingMaskIntoConstraints = false + view.preservesSuperviewLayoutMargins = true + view.cancelButton.isHidden = self.confirmationDelegate != nil + view.cancelButton.addTarget(self, action: #selector(cancelButtonAction), for: .touchUpInside) + return view + }() + @objc init(dashPayModel: DWDashPayProtocol, invitationURL: URL?, definedUsername: String?) { self.dashPayModel = dashPayModel @@ -139,23 +150,19 @@ class DashPaySetupFlowController: UIViewController, NavigationFullscreenable, DW return } - if dashPayModel.registrationStatus?.state != .done { - showPendingController(dashPayModel.username) + if dashPayModel.registrationStatus?.state != .done, let username = dashPayModel.username { + showPendingController(username) } else { showRegistrationCompletedController(dashPayModel.username) } } private func createUsername(_ username: String) { - guard let invitationURL = invitationURL else { return } - dashPayModel.createUsername(username, invitation: invitationURL) showPendingController(username) } - private func showPendingController(_ username: String?) { - guard let username = username else { return } - + private func showPendingController(_ username: String) { if MOCK_DASHPAY.boolValue { DWGlobalOptions.sharedInstance().dashpayUsername = username showRegistrationCompletedController(username) diff --git a/DashPay/Presentation/Setup/Model/DWDashPaySetupModel.m b/DashPay/Presentation/Setup/Model/DWDashPaySetupModel.m index 1b9a6c8dd..44e30f0f4 100644 --- a/DashPay/Presentation/Setup/Model/DWDashPaySetupModel.m +++ b/DashPay/Presentation/Setup/Model/DWDashPaySetupModel.m @@ -41,7 +41,7 @@ - (void)completeRegistration { // nop } -- (void)createUsername:(nonnull NSString *)username invitation:(nonnull NSURL *)invitation { +- (void)createUsername:(nonnull NSString *)username invitation:(nullable NSURL *)invitation { NSAssert(NO, @"Should not be called"); // nop } diff --git a/DashWallet.xcodeproj/project.pbxproj b/DashWallet.xcodeproj/project.pbxproj index 846717d3f..76f0e7006 100644 --- a/DashWallet.xcodeproj/project.pbxproj +++ b/DashWallet.xcodeproj/project.pbxproj @@ -7354,7 +7354,6 @@ C943B33D2A408DB900AF23C5 /* Menu */, C943B2B22A408CAF00AF23C5 /* Profile */, C9D2C96D2A38777A00D15901 /* Setup */, - 759063E72C411029002F2AA9 /* DashPaySetupFlowController.swift */, C9D2C9592A386A6700D15901 /* Home */, C9D2C95A2A386D5200D15901 /* Shared */, ); @@ -7441,6 +7440,7 @@ C943B5682A40ED4100AF23C5 /* RegistrationCompleted */, C943B5652A40ED4000AF23C5 /* ConfirmUsername */, C9D2C96E2A38778400D15901 /* Model */, + 759063E72C411029002F2AA9 /* DashPaySetupFlowController.swift */, ); path = Setup; sourceTree = ""; diff --git a/DashWallet/Sources/UI/DashPay/Contacts/DWContactsPlaceholderViewController.m b/DashWallet/Sources/UI/DashPay/Contacts/DWContactsPlaceholderViewController.m index b7f1a0555..9005d4ef9 100644 --- a/DashWallet/Sources/UI/DashPay/Contacts/DWContactsPlaceholderViewController.m +++ b/DashWallet/Sources/UI/DashPay/Contacts/DWContactsPlaceholderViewController.m @@ -18,7 +18,6 @@ #import "DWContactsPlaceholderViewController.h" #import "DWDashPayModel.h" -#import "DWDashPaySetupFlowController.h" #import "DWUIKit.h" #import "dashwallet-Swift.h" diff --git a/DashWallet/Sources/UI/Home/Models/DWDashPayModel.m b/DashWallet/Sources/UI/Home/Models/DWDashPayModel.m index 866f9ef9b..462f9cb64 100644 --- a/DashWallet/Sources/UI/Home/Models/DWDashPayModel.m +++ b/DashWallet/Sources/UI/Home/Models/DWDashPayModel.m @@ -119,7 +119,7 @@ - (BOOL)shouldPresentRegistrationPaymentConfirmation { return blockchainIdentity == nil; } -- (void)createUsername:(NSString *)username invitation:(NSURL *)invitationURL { +- (void)createUsername:(NSString *)username invitation:(nullable NSURL *)invitationURL { self.invitation = invitationURL; self.lastRegistrationError = nil; [DWGlobalOptions sharedInstance].dashpayUsername = username; diff --git a/DashWallet/Sources/UI/Home/Protocols/DWDashPayProtocol.h b/DashWallet/Sources/UI/Home/Protocols/DWDashPayProtocol.h index 40556481f..084f90a5d 100644 --- a/DashWallet/Sources/UI/Home/Protocols/DWDashPayProtocol.h +++ b/DashWallet/Sources/UI/Home/Protocols/DWDashPayProtocol.h @@ -39,7 +39,7 @@ extern NSNotificationName const DWDashPaySentContactRequestToInviter; @property (readonly, nonatomic, assign) NSUInteger unreadNotificationsCount; - (BOOL)shouldPresentRegistrationPaymentConfirmation; -- (void)createUsername:(NSString *)username invitation:(NSURL *)invitation; +- (void)createUsername:(NSString *)username invitation:(nullable NSURL *)invitation; - (BOOL)canRetry; - (void)retry; - (void)completeRegistration; diff --git a/DashWallet/Sources/UI/Menu/Main/DWMainMenuViewController.m b/DashWallet/Sources/UI/Menu/Main/DWMainMenuViewController.m index b2320092d..abec433d7 100644 --- a/DashWallet/Sources/UI/Menu/Main/DWMainMenuViewController.m +++ b/DashWallet/Sources/UI/Menu/Main/DWMainMenuViewController.m @@ -33,7 +33,6 @@ #ifdef DASHPAY #import "DWMainMenuViewController+DashPay.h" #import "DWUserProfileModalQRViewController.h" -#import "DWDashPaySetupFlowController.h" #import "DWInvitationHistoryViewController.h" #endif From cea92e8d06f0f472bb82fc5467f8e618b6ae9c29 Mon Sep 17 00:00:00 2001 From: Andrei Ashikhmin Date: Tue, 16 Jul 2024 21:29:38 +0700 Subject: [PATCH 3/6] feat: credits topup screen --- .../Menu/DWMainMenuViewController+DashPay.h | 26 ---- .../Menu/DWMainMenuViewController+DashPay.m | 39 ------ .../DWRootEditProfileViewController.h | 42 ------- .../DWRootEditProfileViewController.m | 117 ----------------- DashWallet.xcodeproj/project.pbxproj | 118 ++++++++++++------ .../Credits/BuyCreditsViewController.swift | 69 ++++++++++ .../DWMainMenuViewController+DashPay.swift | 54 ++++++++ .../RootEditProfileViewController.swift | 112 +++++++++++++++++ .../User Profile}/DPWelcomeMenuView.swift | 0 .../UI/DashPay/Setup/DWDashPaySetupModel.h | 26 ---- .../UI/DashPay/Setup/DWDashPaySetupModel.m | 71 ----------- .../Setup/DashPaySetupFlowController.swift | 0 .../Setup/Model/DWDashPaySetupModel.h | 0 .../Setup/Model/DWDashPaySetupModel.m | 0 .../Sources/UI/Home/HomeViewController.swift | 23 ++-- .../UI/Menu/Main/DWMainMenuViewController.m | 3 - .../Amount/SendAmountViewController.swift | 10 +- .../PaymentModels/DWPaymentInputBuilder.m | 1 + .../PaymentModels/DWPaymentProcessor.m | 10 ++ .../Seed/BackupSeedPhraseViewController.swift | 2 +- .../UI/SwiftUI Components/ModalDialog.swift | 19 +-- .../UI/SwiftUI Components/SendIntro.swift | 57 +++++++++ .../DWBaseActionButtonViewController.h | 2 +- DashWallet/dashwallet-Bridging-Header.h | 4 +- 24 files changed, 411 insertions(+), 394 deletions(-) delete mode 100644 DashPay/Presentation/Menu/DWMainMenuViewController+DashPay.h delete mode 100644 DashPay/Presentation/Menu/DWMainMenuViewController+DashPay.m delete mode 100644 DashPay/Presentation/Profile/EditProfile/DWRootEditProfileViewController.h delete mode 100644 DashPay/Presentation/Profile/EditProfile/DWRootEditProfileViewController.m create mode 100644 DashWallet/Sources/UI/DashPay/Credits/BuyCreditsViewController.swift create mode 100644 DashWallet/Sources/UI/DashPay/Menu/DWMainMenuViewController+DashPay.swift create mode 100644 DashWallet/Sources/UI/DashPay/Profile/Edit Profile/RootEditProfileViewController.swift rename {DashPay/Presentation/Profile/UserProfile => DashWallet/Sources/UI/DashPay/Profile/User Profile}/DPWelcomeMenuView.swift (100%) delete mode 100644 DashWallet/Sources/UI/DashPay/Setup/DWDashPaySetupModel.h delete mode 100644 DashWallet/Sources/UI/DashPay/Setup/DWDashPaySetupModel.m rename {DashPay/Presentation => DashWallet/Sources/UI/DashPay}/Setup/DashPaySetupFlowController.swift (100%) rename {DashPay/Presentation => DashWallet/Sources/UI/DashPay}/Setup/Model/DWDashPaySetupModel.h (100%) rename {DashPay/Presentation => DashWallet/Sources/UI/DashPay}/Setup/Model/DWDashPaySetupModel.m (100%) create mode 100644 DashWallet/Sources/UI/SwiftUI Components/SendIntro.swift diff --git a/DashPay/Presentation/Menu/DWMainMenuViewController+DashPay.h b/DashPay/Presentation/Menu/DWMainMenuViewController+DashPay.h deleted file mode 100644 index 798c45290..000000000 --- a/DashPay/Presentation/Menu/DWMainMenuViewController+DashPay.h +++ /dev/null @@ -1,26 +0,0 @@ -// -// Created by PT -// Copyright © 2023 Dash Core Group. All rights reserved. -// -// Licensed under the MIT License (the "License"); -// you may not use this file except in compliance with the License. -// You may obtain a copy of the License at -// -// https://opensource.org/licenses/MIT -// -// Unless required by applicable law or agreed to in writing, software -// distributed under the License is distributed on an "AS IS" BASIS, -// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. -// See the License for the specific language governing permissions and -// limitations under the License. -// - -#import "DWMainMenuViewController.h" - -NS_ASSUME_NONNULL_BEGIN - -@interface DWMainMenuViewController (DashPay) - -@end - -NS_ASSUME_NONNULL_END diff --git a/DashPay/Presentation/Menu/DWMainMenuViewController+DashPay.m b/DashPay/Presentation/Menu/DWMainMenuViewController+DashPay.m deleted file mode 100644 index 3eb77931f..000000000 --- a/DashPay/Presentation/Menu/DWMainMenuViewController+DashPay.m +++ /dev/null @@ -1,39 +0,0 @@ -// -// Created by PT -// Copyright © 2023 Dash Core Group. All rights reserved. -// -// Licensed under the MIT License (the "License"); -// you may not use this file except in compliance with the License. -// You may obtain a copy of the License at -// -// https://opensource.org/licenses/MIT -// -// Unless required by applicable law or agreed to in writing, software -// distributed under the License is distributed on an "AS IS" BASIS, -// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. -// See the License for the specific language governing permissions and -// limitations under the License. -// - -#import "DWMainMenuViewController+DashPay.h" -#import "DWRootEditProfileViewController.h" -#import "DWMainMenuContentView.h" - -@implementation DWMainMenuViewController (DashPay) - -#pragma mark - DWRootEditProfileViewControllerDelegate - -- (void)editProfileViewController:(DWRootEditProfileViewController *)controller - updateDisplayName:(NSString *)rawDisplayName - aboutMe:(NSString *)rawAboutMe - avatarURLString:(nullable NSString *)avatarURLString { - DWMainMenuContentView *view = (DWMainMenuContentView *) self.view; - [view.userModel.updateModel updateWithDisplayName:rawDisplayName aboutMe:rawAboutMe avatarURLString:avatarURLString]; - [controller dismissViewControllerAnimated:YES completion:nil]; -} - -- (void)editProfileViewControllerDidCancel:(DWRootEditProfileViewController *)controller { - [controller dismissViewControllerAnimated:YES completion:nil]; -} - -@end diff --git a/DashPay/Presentation/Profile/EditProfile/DWRootEditProfileViewController.h b/DashPay/Presentation/Profile/EditProfile/DWRootEditProfileViewController.h deleted file mode 100644 index 7c13b95e8..000000000 --- a/DashPay/Presentation/Profile/EditProfile/DWRootEditProfileViewController.h +++ /dev/null @@ -1,42 +0,0 @@ -// -// Created by Andrew Podkovyrin -// Copyright © 2020 Dash Core Group. All rights reserved. -// -// Licensed under the MIT License (the "License"); -// you may not use this file except in compliance with the License. -// You may obtain a copy of the License at -// -// https://opensource.org/licenses/MIT -// -// Unless required by applicable law or agreed to in writing, software -// distributed under the License is distributed on an "AS IS" BASIS, -// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. -// See the License for the specific language governing permissions and -// limitations under the License. -// - -#import "DWBaseActionButtonViewController.h" - -NS_ASSUME_NONNULL_BEGIN - -@class DWRootEditProfileViewController; - -@protocol DWRootEditProfileViewControllerDelegate - -- (void)editProfileViewController:(DWRootEditProfileViewController *)controller - updateDisplayName:(NSString *)rawDisplayName - aboutMe:(NSString *)rawAboutMe - avatarURLString:(nullable NSString *)avatarURLString; - -- (void)editProfileViewControllerDidCancel:(DWRootEditProfileViewController *)controller; - -@end - - -@interface DWRootEditProfileViewController : DWBaseActionButtonViewController - -@property (nullable, nonatomic, weak) id delegate; - -@end - -NS_ASSUME_NONNULL_END diff --git a/DashPay/Presentation/Profile/EditProfile/DWRootEditProfileViewController.m b/DashPay/Presentation/Profile/EditProfile/DWRootEditProfileViewController.m deleted file mode 100644 index f3b45ee94..000000000 --- a/DashPay/Presentation/Profile/EditProfile/DWRootEditProfileViewController.m +++ /dev/null @@ -1,117 +0,0 @@ -// -// Created by Andrew Podkovyrin -// Copyright © 2020 Dash Core Group. All rights reserved. -// -// Licensed under the MIT License (the "License"); -// you may not use this file except in compliance with the License. -// You may obtain a copy of the License at -// -// https://opensource.org/licenses/MIT -// -// Unless required by applicable law or agreed to in writing, software -// distributed under the License is distributed on an "AS IS" BASIS, -// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. -// See the License for the specific language governing permissions and -// limitations under the License. -// - -#import "DWRootEditProfileViewController.h" - -#import "DWEditProfileViewController.h" -#import "DWEnvironment.h" -#import "DWSaveAlertViewController.h" -#import "UIViewController+DWEmbedding.h" - -NS_ASSUME_NONNULL_BEGIN - -@interface DWRootEditProfileViewController () - -@property (nonatomic, strong) DWEditProfileViewController *editController; -@property (readonly, nonatomic, strong) DSBlockchainIdentity *blockchainIdentity; - -@end - -NS_ASSUME_NONNULL_END - -@implementation DWRootEditProfileViewController - -- (NSString *)actionButtonTitle { - return NSLocalizedString(@"Save", nil); -} - -- (DSBlockchainIdentity *)blockchainIdentity { - return self.editController.blockchainIdentity; -} - -- (void)viewDidLoad { - [super viewDidLoad]; - - self.title = NSLocalizedString(@"Edit Profile", nil); - - UIBarButtonItem *cancel = [[UIBarButtonItem alloc] initWithBarButtonSystemItem:UIBarButtonSystemItemCancel - target:self - action:@selector(cancelButtonAction)]; - self.navigationItem.leftBarButtonItem = cancel; - - UIView *contentView = [[UIView alloc] init]; - contentView.translatesAutoresizingMaskIntoConstraints = NO; - [self setupContentView:contentView]; - - self.editController = [[DWEditProfileViewController alloc] init]; - self.editController.delegate = self; - [self dw_embedChild:self.editController inContainer:contentView]; - - [self editProfileViewControllerDidUpdate:self.editController]; -} - -- (UIStatusBarStyle)preferredStatusBarStyle { - return UIStatusBarStyleLightContent; -} - -- (void)performSave { - [self.delegate editProfileViewController:self - updateDisplayName:self.editController.displayName - aboutMe:self.editController.aboutMe - avatarURLString:self.editController.avatarURLString]; -} - -#pragma mark - DWEditProfileViewControllerDelegate - -- (void)editProfileViewControllerDidUpdate:(DWEditProfileViewController *)controller { - self.actionButton.enabled = controller.isValid; -} - -#pragma mark - DWSaveAlertViewController - -- (void)saveAlertViewControllerCancelAction:(DWSaveAlertViewController *)controller { - [controller dismissViewControllerAnimated:YES - completion:^{ - [self.delegate editProfileViewControllerDidCancel:self]; - }]; -} - -- (void)saveAlertViewControllerOKAction:(DWSaveAlertViewController *)controller { - [controller dismissViewControllerAnimated:YES - completion:^{ - [self performSave]; - }]; -} - -#pragma mark - Actions - -- (void)cancelButtonAction { - if ([self.editController hasChanges]) { - DWSaveAlertViewController *saveAlert = [[DWSaveAlertViewController alloc] init]; - saveAlert.delegate = self; - [self presentViewController:saveAlert animated:YES completion:nil]; - } - else { - [self.delegate editProfileViewControllerDidCancel:self]; - } -} - -- (void)actionButtonAction:(id)sender { - [self performSave]; -} - -@end diff --git a/DashWallet.xcodeproj/project.pbxproj b/DashWallet.xcodeproj/project.pbxproj index 76f0e7006..f65821f98 100644 --- a/DashWallet.xcodeproj/project.pbxproj +++ b/DashWallet.xcodeproj/project.pbxproj @@ -591,8 +591,14 @@ 758CE59E2BC566DE0062AF53 /* PrivacyInfo.xcprivacy in Resources */ = {isa = PBXBuildFile; fileRef = 758CE59B2BC566DE0062AF53 /* PrivacyInfo.xcprivacy */; }; 759063E82C411029002F2AA9 /* DashPaySetupFlowController.swift in Sources */ = {isa = PBXBuildFile; fileRef = 759063E72C411029002F2AA9 /* DashPaySetupFlowController.swift */; }; 759063E92C411673002F2AA9 /* ZenLedgerInfoSheet.swift in Sources */ = {isa = PBXBuildFile; fileRef = 75EBAA1C2BBA71D9004488E3 /* ZenLedgerInfoSheet.swift */; }; + 759063ED2C42687F002F2AA9 /* RootEditProfileViewController.swift in Sources */ = {isa = PBXBuildFile; fileRef = 759063EC2C42687F002F2AA9 /* RootEditProfileViewController.swift */; }; + 759063EF2C427324002F2AA9 /* DWMainMenuViewController+DashPay.swift in Sources */ = {isa = PBXBuildFile; fileRef = 759063EE2C427324002F2AA9 /* DWMainMenuViewController+DashPay.swift */; }; 7592AA7C2B9B08C000417F9E /* SupportedTopperPaymentMethods.swift in Sources */ = {isa = PBXBuildFile; fileRef = 7592AA7B2B9B08C000417F9E /* SupportedTopperPaymentMethods.swift */; }; 7592AA7D2B9B08C000417F9E /* SupportedTopperPaymentMethods.swift in Sources */ = {isa = PBXBuildFile; fileRef = 7592AA7B2B9B08C000417F9E /* SupportedTopperPaymentMethods.swift */; }; + 7596091A2C4550F500F3BF04 /* DWDashPaySetupModel.m in Sources */ = {isa = PBXBuildFile; fileRef = 759609182C4550F400F3BF04 /* DWDashPaySetupModel.m */; }; + 759609212C4553A400F3BF04 /* BuyCreditsViewController.swift in Sources */ = {isa = PBXBuildFile; fileRef = 759609202C4553A400F3BF04 /* BuyCreditsViewController.swift */; }; + 759609232C455B2000F3BF04 /* SendIntro.swift in Sources */ = {isa = PBXBuildFile; fileRef = 759609222C455B2000F3BF04 /* SendIntro.swift */; }; + 759609242C455B2000F3BF04 /* SendIntro.swift in Sources */ = {isa = PBXBuildFile; fileRef = 759609222C455B2000F3BF04 /* SendIntro.swift */; }; 759ADD572BF3447400767ACD /* Button.swift in Sources */ = {isa = PBXBuildFile; fileRef = 759ADD562BF3447400767ACD /* Button.swift */; }; 759ADD582BF3447400767ACD /* Button.swift in Sources */ = {isa = PBXBuildFile; fileRef = 759ADD562BF3447400767ACD /* Button.swift */; }; 759C8F9F2B593589004B1305 /* CrowdNodeAPYView.swift in Sources */ = {isa = PBXBuildFile; fileRef = 759C8F9E2B593589004B1305 /* CrowdNodeAPYView.swift */; }; @@ -718,7 +724,6 @@ C943B3212A408CED00AF23C5 /* DWImgurItemView.m in Sources */ = {isa = PBXBuildFile; fileRef = C943B2D62A408CEC00AF23C5 /* DWImgurItemView.m */; }; C943B3222A408CED00AF23C5 /* DWImgurInfoViewController.m in Sources */ = {isa = PBXBuildFile; fileRef = C943B2D72A408CEC00AF23C5 /* DWImgurInfoViewController.m */; }; C943B3232A408CED00AF23C5 /* DWFaceDetector.m in Sources */ = {isa = PBXBuildFile; fileRef = C943B2DC2A408CEC00AF23C5 /* DWFaceDetector.m */; }; - C943B3242A408CED00AF23C5 /* DWRootEditProfileViewController.m in Sources */ = {isa = PBXBuildFile; fileRef = C943B2DD2A408CEC00AF23C5 /* DWRootEditProfileViewController.m */; }; C943B3252A408CED00AF23C5 /* DWEditProfileViewController.m in Sources */ = {isa = PBXBuildFile; fileRef = C943B2DE2A408CEC00AF23C5 /* DWEditProfileViewController.m */; }; C943B3262A408CED00AF23C5 /* DWCropAvatarViewController.m in Sources */ = {isa = PBXBuildFile; fileRef = C943B2DF2A408CEC00AF23C5 /* DWCropAvatarViewController.m */; }; C943B3272A408CED00AF23C5 /* DWAvatarEditSelectorViewController.m in Sources */ = {isa = PBXBuildFile; fileRef = C943B2E12A408CEC00AF23C5 /* DWAvatarEditSelectorViewController.m */; }; @@ -743,7 +748,6 @@ C943B33A2A408CED00AF23C5 /* DWUploadAvatarModel.m in Sources */ = {isa = PBXBuildFile; fileRef = C943B3102A408CEC00AF23C5 /* DWUploadAvatarModel.m */; }; C943B33B2A408CED00AF23C5 /* DWUploadAvatarChildView.m in Sources */ = {isa = PBXBuildFile; fileRef = C943B3152A408CEC00AF23C5 /* DWUploadAvatarChildView.m */; }; C943B33C2A408CED00AF23C5 /* DWHourGlassAnimationView.m in Sources */ = {isa = PBXBuildFile; fileRef = C943B3162A408CEC00AF23C5 /* DWHourGlassAnimationView.m */; }; - C943B3402A408E5500AF23C5 /* DWMainMenuViewController+DashPay.m in Sources */ = {isa = PBXBuildFile; fileRef = C943B33F2A408E5500AF23C5 /* DWMainMenuViewController+DashPay.m */; }; C943B3432A409F9E00AF23C5 /* UIImageView+DWDPAvatar.m in Sources */ = {isa = PBXBuildFile; fileRef = C943B3422A409F9E00AF23C5 /* UIImageView+DWDPAvatar.m */; }; C943B3462A409FFA00AF23C5 /* DWDPAvatarView.m in Sources */ = {isa = PBXBuildFile; fileRef = C943B3442A409FFA00AF23C5 /* DWDPAvatarView.m */; }; C943B34D2A40A4C500AF23C5 /* DWInfoPopupViewController.m in Sources */ = {isa = PBXBuildFile; fileRef = C943B34A2A40A4C500AF23C5 /* DWInfoPopupViewController.m */; }; @@ -1499,7 +1503,6 @@ C9D2C95E2A386D7E00D15901 /* DWBasePressableControl.m in Sources */ = {isa = PBXBuildFile; fileRef = C9D2C95D2A386D7E00D15901 /* DWBasePressableControl.m */; }; C9D2C9652A38733B00D15901 /* DPAssets.xcassets in Resources */ = {isa = PBXBuildFile; fileRef = C9D2C9642A38733B00D15901 /* DPAssets.xcassets */; }; C9D2C9692A3875BA00D15901 /* DWCurrentUserProfileModel.m in Sources */ = {isa = PBXBuildFile; fileRef = C9D2C9672A3875BA00D15901 /* DWCurrentUserProfileModel.m */; }; - C9D2C9712A38778E00D15901 /* DWDashPaySetupModel.m in Sources */ = {isa = PBXBuildFile; fileRef = C9D2C9702A38778E00D15901 /* DWDashPaySetupModel.m */; }; C9F067F229E4576D0022D958 /* HomeBalanceView.swift in Sources */ = {isa = PBXBuildFile; fileRef = C9F067F129E4576D0022D958 /* HomeBalanceView.swift */; }; C9F067F429E543630022D958 /* HomeBalanceView.xib in Resources */ = {isa = PBXBuildFile; fileRef = C9F067F329E457790022D958 /* HomeBalanceView.xib */; }; C9F42F9F29DA82E5001BC549 /* PayableViewController.swift in Sources */ = {isa = PBXBuildFile; fileRef = C9F42F9E29DA82E5001BC549 /* PayableViewController.swift */; }; @@ -2454,7 +2457,13 @@ 75889B802AD2D7F800C17F5D /* Base */ = {isa = PBXFileReference; lastKnownFileType = file.storyboard; name = Base; path = Base.lproj/CoinJoin.storyboard; sourceTree = ""; }; 758CE59B2BC566DE0062AF53 /* PrivacyInfo.xcprivacy */ = {isa = PBXFileReference; lastKnownFileType = text.xml; path = PrivacyInfo.xcprivacy; sourceTree = ""; }; 759063E72C411029002F2AA9 /* DashPaySetupFlowController.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = DashPaySetupFlowController.swift; sourceTree = ""; }; + 759063EC2C42687F002F2AA9 /* RootEditProfileViewController.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = RootEditProfileViewController.swift; sourceTree = ""; }; + 759063EE2C427324002F2AA9 /* DWMainMenuViewController+DashPay.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = "DWMainMenuViewController+DashPay.swift"; sourceTree = ""; }; 7592AA7B2B9B08C000417F9E /* SupportedTopperPaymentMethods.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = SupportedTopperPaymentMethods.swift; sourceTree = ""; }; + 759609172C4550F400F3BF04 /* DWDashPaySetupModel.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = DWDashPaySetupModel.h; sourceTree = ""; }; + 759609182C4550F400F3BF04 /* DWDashPaySetupModel.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; path = DWDashPaySetupModel.m; sourceTree = ""; }; + 759609202C4553A400F3BF04 /* BuyCreditsViewController.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = BuyCreditsViewController.swift; sourceTree = ""; }; + 759609222C455B2000F3BF04 /* SendIntro.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = SendIntro.swift; sourceTree = ""; }; 759816E519357D6F005060EA /* BRBubbleView.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = BRBubbleView.h; sourceTree = ""; }; 759816E619357D6F005060EA /* BRBubbleView.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; path = BRBubbleView.m; sourceTree = ""; }; 759ADD562BF3447400767ACD /* Button.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = Button.swift; sourceTree = ""; }; @@ -2587,7 +2596,6 @@ C943B2CE2A408CEC00AF23C5 /* DWUserProfileModalQRViewController.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; path = DWUserProfileModalQRViewController.m; sourceTree = ""; }; C943B2D02A408CEC00AF23C5 /* DWCropAvatarViewController.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = DWCropAvatarViewController.h; sourceTree = ""; }; C943B2D12A408CEC00AF23C5 /* DWEditProfileViewController.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = DWEditProfileViewController.h; sourceTree = ""; }; - C943B2D22A408CEC00AF23C5 /* DWRootEditProfileViewController.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = DWRootEditProfileViewController.h; sourceTree = ""; }; C943B2D42A408CEC00AF23C5 /* DWImgurInfoChildView.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; path = DWImgurInfoChildView.m; sourceTree = ""; }; C943B2D52A408CEC00AF23C5 /* DWImgurInfoViewController.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = DWImgurInfoViewController.h; sourceTree = ""; }; C943B2D62A408CEC00AF23C5 /* DWImgurItemView.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; path = DWImgurItemView.m; sourceTree = ""; }; @@ -2596,7 +2604,6 @@ C943B2D92A408CEC00AF23C5 /* DWImgurItemView.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = DWImgurItemView.h; sourceTree = ""; }; C943B2DB2A408CEC00AF23C5 /* DWFaceDetector.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = DWFaceDetector.h; sourceTree = ""; }; C943B2DC2A408CEC00AF23C5 /* DWFaceDetector.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; path = DWFaceDetector.m; sourceTree = ""; }; - C943B2DD2A408CEC00AF23C5 /* DWRootEditProfileViewController.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; path = DWRootEditProfileViewController.m; sourceTree = ""; }; C943B2DE2A408CEC00AF23C5 /* DWEditProfileViewController.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; path = DWEditProfileViewController.m; sourceTree = ""; }; C943B2DF2A408CEC00AF23C5 /* DWCropAvatarViewController.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; path = DWCropAvatarViewController.m; sourceTree = ""; }; C943B2E12A408CEC00AF23C5 /* DWAvatarEditSelectorViewController.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; path = DWAvatarEditSelectorViewController.m; sourceTree = ""; }; @@ -2644,8 +2651,6 @@ C943B3142A408CEC00AF23C5 /* DWUploadAvatarModel.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = DWUploadAvatarModel.h; sourceTree = ""; }; C943B3152A408CEC00AF23C5 /* DWUploadAvatarChildView.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; path = DWUploadAvatarChildView.m; sourceTree = ""; }; C943B3162A408CEC00AF23C5 /* DWHourGlassAnimationView.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; path = DWHourGlassAnimationView.m; sourceTree = ""; }; - C943B33E2A408E0500AF23C5 /* DWMainMenuViewController+DashPay.h */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; path = "DWMainMenuViewController+DashPay.h"; sourceTree = ""; }; - C943B33F2A408E5500AF23C5 /* DWMainMenuViewController+DashPay.m */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.objc; path = "DWMainMenuViewController+DashPay.m"; sourceTree = ""; }; C943B3412A409F9E00AF23C5 /* UIImageView+DWDPAvatar.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = "UIImageView+DWDPAvatar.h"; sourceTree = ""; }; C943B3422A409F9E00AF23C5 /* UIImageView+DWDPAvatar.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; path = "UIImageView+DWDPAvatar.m"; sourceTree = ""; }; C943B3442A409FFA00AF23C5 /* DWDPAvatarView.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; path = DWDPAvatarView.m; sourceTree = ""; }; @@ -2997,8 +3002,6 @@ C9D2C9642A38733B00D15901 /* DPAssets.xcassets */ = {isa = PBXFileReference; lastKnownFileType = folder.assetcatalog; path = DPAssets.xcassets; sourceTree = ""; }; C9D2C9672A3875BA00D15901 /* DWCurrentUserProfileModel.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; path = DWCurrentUserProfileModel.m; sourceTree = ""; }; C9D2C9682A3875BA00D15901 /* DWCurrentUserProfileModel.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = DWCurrentUserProfileModel.h; sourceTree = ""; }; - C9D2C96F2A38778E00D15901 /* DWDashPaySetupModel.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = DWDashPaySetupModel.h; sourceTree = ""; }; - C9D2C9702A38778E00D15901 /* DWDashPaySetupModel.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; path = DWDashPaySetupModel.m; sourceTree = ""; }; C9F067F129E4576D0022D958 /* HomeBalanceView.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = HomeBalanceView.swift; sourceTree = ""; }; C9F067F329E457790022D958 /* HomeBalanceView.xib */ = {isa = PBXFileReference; lastKnownFileType = file.xib; path = HomeBalanceView.xib; sourceTree = ""; }; C9F42F9E29DA82E5001BC549 /* PayableViewController.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = PayableViewController.swift; sourceTree = ""; }; @@ -6030,6 +6033,7 @@ 75CDD77F2C0898E400F433D2 /* Shape.swift */, 75CDD7822C0898FA00F433D2 /* Wrapper.swift */, 75CDD7852C08D61300F433D2 /* DashAmount.swift */, + 759609222C455B2000F3BF04 /* SendIntro.swift */, ); path = "SwiftUI Components"; sourceTree = ""; @@ -6045,6 +6049,56 @@ path = CoinJoin; sourceTree = ""; }; + 759609192C4550F400F3BF04 /* Setup */ = { + isa = PBXGroup; + children = ( + 7596091B2C45511A00F3BF04 /* Model */, + 759063E72C411029002F2AA9 /* DashPaySetupFlowController.swift */, + ); + path = Setup; + sourceTree = ""; + }; + 7596091B2C45511A00F3BF04 /* Model */ = { + isa = PBXGroup; + children = ( + 759609172C4550F400F3BF04 /* DWDashPaySetupModel.h */, + 759609182C4550F400F3BF04 /* DWDashPaySetupModel.m */, + ); + path = Model; + sourceTree = ""; + }; + 7596091C2C45516D00F3BF04 /* Edit Profile */ = { + isa = PBXGroup; + children = ( + 759063EC2C42687F002F2AA9 /* RootEditProfileViewController.swift */, + ); + path = "Edit Profile"; + sourceTree = ""; + }; + 7596091D2C4551A700F3BF04 /* User Profile */ = { + isa = PBXGroup; + children = ( + 757514E42B1735370026AD8E /* DPWelcomeMenuView.swift */, + ); + path = "User Profile"; + sourceTree = ""; + }; + 7596091E2C4551E100F3BF04 /* Menu */ = { + isa = PBXGroup; + children = ( + 759063EE2C427324002F2AA9 /* DWMainMenuViewController+DashPay.swift */, + ); + path = Menu; + sourceTree = ""; + }; + 7596091F2C45530B00F3BF04 /* Credits */ = { + isa = PBXGroup; + children = ( + 759609202C4553A400F3BF04 /* BuyCreditsViewController.swift */, + ); + path = Credits; + sourceTree = ""; + }; 75A8C1612AE571E30042256E /* Voting */ = { isa = PBXGroup; children = ( @@ -6326,7 +6380,6 @@ C943B2C52A408CEC00AF23C5 /* DWCurrentUserProfileView.m */, C943B2C62A408CEC00AF23C5 /* DWUpdatingUserProfileView.m */, C943B2C82A408CEC00AF23C5 /* DWUserProfileContainerView.m */, - 757514E42B1735370026AD8E /* DPWelcomeMenuView.swift */, ); path = UserProfile; sourceTree = ""; @@ -6359,10 +6412,8 @@ children = ( C943B2D02A408CEC00AF23C5 /* DWCropAvatarViewController.h */, C943B2D12A408CEC00AF23C5 /* DWEditProfileViewController.h */, - C943B2D22A408CEC00AF23C5 /* DWRootEditProfileViewController.h */, C943B2D32A408CEC00AF23C5 /* Imgur */, C943B2DA2A408CEC00AF23C5 /* Utils */, - C943B2DD2A408CEC00AF23C5 /* DWRootEditProfileViewController.m */, C943B2DE2A408CEC00AF23C5 /* DWEditProfileViewController.m */, C943B2DF2A408CEC00AF23C5 /* DWCropAvatarViewController.m */, C943B2E02A408CEC00AF23C5 /* Avatar */, @@ -6516,15 +6567,6 @@ path = Upload; sourceTree = ""; }; - C943B33D2A408DB900AF23C5 /* Menu */ = { - isa = PBXGroup; - children = ( - C943B33E2A408E0500AF23C5 /* DWMainMenuViewController+DashPay.h */, - C943B33F2A408E5500AF23C5 /* DWMainMenuViewController+DashPay.m */, - ); - path = Menu; - sourceTree = ""; - }; C943B3482A40A4C500AF23C5 /* InfoPopup */ = { isa = PBXGroup; children = ( @@ -6539,8 +6581,10 @@ C943B34F2A40A54500AF23C5 /* DashPay */ = { isa = PBXGroup; children = ( + 7596091E2C4551E100F3BF04 /* Menu */, + 759609192C4550F400F3BF04 /* Setup */, C943B3502A40A54500AF23C5 /* Contacts */, - C943B3C82A40A54600AF23C5 /* DWDashPayConstants.h */, + 7596091F2C45530B00F3BF04 /* Credits */, C943B3C92A40A54600AF23C5 /* Welcome */, C943B3E82A40A54600AF23C5 /* Profile */, C943B4032A40A54600AF23C5 /* Items */, @@ -6549,9 +6593,10 @@ 75D656182B0792AB00D1A902 /* Usernames */, 75889B742AD296D500C17F5D /* CoinJoin */, C943B47F2A40A54600AF23C5 /* Views */, - C943B48D2A40A54600AF23C5 /* DWDashPayConstants.m */, C943B48E2A40A54600AF23C5 /* Global */, C943B49E2A40A54600AF23C5 /* Notifications */, + C943B3C82A40A54600AF23C5 /* DWDashPayConstants.h */, + C943B48D2A40A54600AF23C5 /* DWDashPayConstants.m */, ); path = DashPay; sourceTree = ""; @@ -6768,12 +6813,14 @@ C943B3E82A40A54600AF23C5 /* Profile */ = { isa = PBXGroup; children = ( + 7596091D2C4551A700F3BF04 /* User Profile */, + 7596091C2C45516D00F3BF04 /* Edit Profile */, + C943B3EB2A40A54600AF23C5 /* Model */, + C943B3F62A40A54600AF23C5 /* Views */, C943B3E92A40A54600AF23C5 /* DWUserProfileViewController.h */, C943B3EA2A40A54600AF23C5 /* DWModalUserProfileViewController.h */, - C943B3EB2A40A54600AF23C5 /* Model */, C943B3F42A40A54600AF23C5 /* DWUserProfileViewController.m */, C943B3F52A40A54600AF23C5 /* DWModalUserProfileViewController.m */, - C943B3F62A40A54600AF23C5 /* Views */, ); path = Profile; sourceTree = ""; @@ -7351,7 +7398,6 @@ C943B54F2A40C21A00AF23C5 /* Filter View */, C943B5402A40AFC400AF23C5 /* Tx Details */, C943B3482A40A4C500AF23C5 /* InfoPopup */, - C943B33D2A408DB900AF23C5 /* Menu */, C943B2B22A408CAF00AF23C5 /* Profile */, C9D2C96D2A38777A00D15901 /* Setup */, C9D2C9592A386A6700D15901 /* Home */, @@ -7439,21 +7485,10 @@ C943B56B2A40ED4100AF23C5 /* CreateUsername */, C943B5682A40ED4100AF23C5 /* RegistrationCompleted */, C943B5652A40ED4000AF23C5 /* ConfirmUsername */, - C9D2C96E2A38778400D15901 /* Model */, - 759063E72C411029002F2AA9 /* DashPaySetupFlowController.swift */, ); path = Setup; sourceTree = ""; }; - C9D2C96E2A38778400D15901 /* Model */ = { - isa = PBXGroup; - children = ( - C9D2C96F2A38778E00D15901 /* DWDashPaySetupModel.h */, - C9D2C9702A38778E00D15901 /* DWDashPaySetupModel.m */, - ); - path = Model; - sourceTree = ""; - }; C9F42FA729DC09C6001BC549 /* Style */ = { isa = PBXGroup; children = ( @@ -8634,6 +8669,7 @@ 2A913EA823A79AD2006A2A59 /* DWTransactionListDataProviderStub.m in Sources */, 47AE8BFF28C1306000490F5E /* DWExploreHeaderView.m in Sources */, 0F6EDFC628C896BD000427E7 /* CoinbaseBaseIDForCurrencyResponse.swift in Sources */, + 759609232C455B2000F3BF04 /* SendIntro.swift in Sources */, 47AC8413297822E000BD1B49 /* SpecifyAmountViewController.swift in Sources */, 2AFCB9C423BE76EC00FF59A6 /* DWUpholdTransactionObject+DWView.m in Sources */, 75CDD7862C08D61300F433D2 /* DashAmount.swift in Sources */, @@ -8993,6 +9029,7 @@ 757118DC2B0F189D000AE391 /* VerifyIdenityViewController.swift in Sources */, C9D2C6A12A320AA000D15901 /* AmountInputControl.swift in Sources */, C9D2C6A22A320AA000D15901 /* DWSegmentSliderFormTableViewCell.m in Sources */, + 759609212C4553A400F3BF04 /* BuyCreditsViewController.swift in Sources */, C9D2C6A32A320AA000D15901 /* ApiCode.swift in Sources */, C9D2C6A42A320AA000D15901 /* CoinbaseEntryPointModel.swift in Sources */, C943B4F02A40A54600AF23C5 /* DWUserProfileNavigationTitleView.m in Sources */, @@ -9184,7 +9221,6 @@ C9D2C7302A320AA000D15901 /* DWOnboardingViewController.m in Sources */, C9D2C7322A320AA000D15901 /* CrowdNode+UserDefaults.swift in Sources */, C9D2C7342A320AA000D15901 /* DWPinView.m in Sources */, - C943B3242A408CED00AF23C5 /* DWRootEditProfileViewController.m in Sources */, C9D2C7362A320AA000D15901 /* DWBaseReceiveModel.m in Sources */, C943B52E2A40A54600AF23C5 /* DWNotificationsProvider.m in Sources */, C943B4F12A40A54600AF23C5 /* DWUserProfileContactActionsCell.m in Sources */, @@ -9283,6 +9319,7 @@ C943B3192A408CED00AF23C5 /* DWDPUpdateProfileModel.m in Sources */, C9D2C7702A320AA000D15901 /* CrowdNodeModel.swift in Sources */, 75889B792AD2A04900C17F5D /* CoinJoinInfoViewController.swift in Sources */, + 7596091A2C4550F500F3BF04 /* DWDashPaySetupModel.m in Sources */, 759063E92C411673002F2AA9 /* ZenLedgerInfoSheet.swift in Sources */, C9D2C7712A320AA000D15901 /* UIDevice+Compatibility.swift in Sources */, C9D2C7722A320AA000D15901 /* DWSeedWordView.m in Sources */, @@ -9360,6 +9397,7 @@ C943B33A2A408CED00AF23C5 /* DWUploadAvatarModel.m in Sources */, C943B3392A408CED00AF23C5 /* DWUploadAvatarViewController.m in Sources */, C9D2C7B02A320AA000D15901 /* DWExploreHeaderView.m in Sources */, + 759609242C455B2000F3BF04 /* SendIntro.swift in Sources */, C9D2C7B12A320AA000D15901 /* CoinbaseBaseIDForCurrencyResponse.swift in Sources */, C9D2C7B22A320AA000D15901 /* (null) in Sources */, C9D2C7B32A320AA000D15901 /* SpecifyAmountViewController.swift in Sources */, @@ -9512,7 +9550,6 @@ C9D2C8292A320AA000D15901 /* DWTransactionStub.m in Sources */, C9D2C82A2A320AA000D15901 /* OnlineAccountEmailController.swift in Sources */, C9D2C82B2A320AA000D15901 /* DWBaseActionButtonViewController.m in Sources */, - C943B3402A408E5500AF23C5 /* DWMainMenuViewController+DashPay.m in Sources */, C9D2C82C2A320AA000D15901 /* CoinbasePaymentMethodsResponse.swift in Sources */, C9D2C82D2A320AA000D15901 /* UIView+DWEmbedding.m in Sources */, C9D2C82E2A320AA000D15901 /* DWLockActionButton.m in Sources */, @@ -9613,7 +9650,6 @@ C9D2C87F2A320AA000D15901 /* AddressUserInfoDAO.swift in Sources */, 75D66D332B05E7AE00A8DDA6 /* QuickVoteViewController.swift in Sources */, C943B5112A40A54600AF23C5 /* DWInvitationHistoryViewController.m in Sources */, - C9D2C9712A38778E00D15901 /* DWDashPaySetupModel.m in Sources */, C9D2C8812A320AA000D15901 /* DWModalTransition.m in Sources */, C943B4E12A40A54600AF23C5 /* DWGetStartedItemView.m in Sources */, 756188212B1EE78A00B778E3 /* DPVotingResultView.swift in Sources */, @@ -9635,6 +9671,7 @@ C943B5082A40A54600AF23C5 /* DWDPTxListCell.m in Sources */, 75FFD6BC2BF48DF80032879E /* HomeViewController+JailbreakCheck.swift in Sources */, C9D2C8942A320AA000D15901 /* DerivationPathKeysHeaderView.swift in Sources */, + 759063ED2C42687F002F2AA9 /* RootEditProfileViewController.swift in Sources */, C9D2C8952A320AA000D15901 /* ConvertCryptoOrderPreviewModel.swift in Sources */, 75CDD7872C08D61300F433D2 /* DashAmount.swift in Sources */, C9D2C8972A320AA000D15901 /* RatesProvider.swift in Sources */, @@ -9669,6 +9706,7 @@ C9D2C8AD2A320AA000D15901 /* PointOfUseDetailsView.swift in Sources */, C9D2C8AE2A320AA000D15901 /* DSChain+DashWallet.m in Sources */, C9D2C8AF2A320AA000D15901 /* FromLabel.swift in Sources */, + 759063EF2C427324002F2AA9 /* DWMainMenuViewController+DashPay.swift in Sources */, C9D2C8B02A320AA000D15901 /* DWPhraseRepairChildViewController.m in Sources */, C9D2C8B12A320AA000D15901 /* SingleInputAddressSelector.swift in Sources */, C943B5382A40A65B00AF23C5 /* DWScrollingViewController.m in Sources */, diff --git a/DashWallet/Sources/UI/DashPay/Credits/BuyCreditsViewController.swift b/DashWallet/Sources/UI/DashPay/Credits/BuyCreditsViewController.swift new file mode 100644 index 000000000..c89502445 --- /dev/null +++ b/DashWallet/Sources/UI/DashPay/Credits/BuyCreditsViewController.swift @@ -0,0 +1,69 @@ +// +// Created by Andrei Ashikhmin +// Copyright © 2024 Dash Core Group. All rights reserved. +// +// Licensed under the MIT License (the "License"); +// you may not use this file except in compliance with the License. +// You may obtain a copy of the License at +// +// https://opensource.org/licenses/MIT +// +// Unless required by applicable law or agreed to in writing, software +// distributed under the License is distributed on an "AS IS" BASIS, +// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +// See the License for the specific language governing permissions and +// limitations under the License. +// + +import SwiftUI + +final class BuyCreditsViewController: SendAmountViewController, NavigationBarDisplayable { +// override init() { +// super.init(model: SendAmountModel()) +// } + + var isBackButtonHidden: Bool = false + + override func configureHierarchy() { + super.configureHierarchy() + + let stackView = UIStackView() + stackView.axis = .vertical + stackView.spacing = 26 + stackView.translatesAutoresizingMaskIntoConstraints = false + contentView.addSubview(stackView) + + let intro = SendIntro(title: NSLocalizedString("Send", comment: "")) + let swiftUIController = UIHostingController(rootView: intro) + swiftUIController.view.backgroundColor = UIColor.dw_secondaryBackground() + + addChild(swiftUIController) + stackView.addArrangedSubview(swiftUIController.view) + swiftUIController.view.translatesAutoresizingMaskIntoConstraints = false + swiftUIController.didMove(toParent: self) + + amountView.removeFromSuperview() + stackView.addArrangedSubview(amountView) + + NSLayoutConstraint.activate([ + stackView.topAnchor.constraint(equalTo: contentView.topAnchor), + stackView.leadingAnchor.constraint(equalTo: contentView.layoutMarginsGuide.leadingAnchor), + stackView.trailingAnchor.constraint(equalTo: contentView.layoutMarginsGuide.trailingAnchor), + ]) + +// let backButton = UIBarButtonItem( +// title: "Back", +// style: .plain, +// target: self, +// action: #selector(backButtonTapped) +// ) +// navigationItem.leftBarButtonItem = backButton +// +// // Additional setup if needed +// view.backgroundColor = .red // Example setup + } + + @objc private func backButtonTapped() { + dismiss(animated: true, completion: nil) + } +} diff --git a/DashWallet/Sources/UI/DashPay/Menu/DWMainMenuViewController+DashPay.swift b/DashWallet/Sources/UI/DashPay/Menu/DWMainMenuViewController+DashPay.swift new file mode 100644 index 000000000..c45bdb575 --- /dev/null +++ b/DashWallet/Sources/UI/DashPay/Menu/DWMainMenuViewController+DashPay.swift @@ -0,0 +1,54 @@ +// +// Created by PT +// Copyright © 2023 Dash Core Group. All rights reserved. +// +// Licensed under the MIT License (the "License"); +// you may not use this file except in compliance with the License. +// You may obtain a copy of the License at +// +// https://opensource.org/licenses/MIT +// +// Unless required by applicable law or agreed to in writing, software +// distributed under the License is distributed on an "AS IS" BASIS, +// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +// See the License for the specific language governing permissions and +// limitations under the License. +// + +import UIKit + +extension DWMainMenuViewController: RootEditProfileViewControllerDelegate { + func editProfileViewController(_ controller: RootEditProfileViewController, updateDisplayName rawDisplayName: String, aboutMe rawAboutMe: String, avatarURLString: String?) { + guard let view = self.view as? DWMainMenuContentView else { return } + view.userModel.updateModel.update(withDisplayName: rawDisplayName, aboutMe: rawAboutMe, avatarURLString: avatarURLString) + controller.dismiss(animated: true, completion: nil) + + if MOCK_DASHPAY.boolValue { + RootEditProfileViewController.currentCredits -= 0.25 + let heading: String + let message: String + + if RootEditProfileViewController.currentCredits <= 0 { + heading = NSLocalizedString("Your credit balance has been fully depleted", comment: "") + message = NSLocalizedString("You can continue to use DashPay for payments but you cannot update your profile or add more contacts until you top up your credit balance", comment: "") + } else if RootEditProfileViewController.currentCredits <= 0.25 { + heading = NSLocalizedString("Your credit balance is low", comment: "") + message = NSLocalizedString("Top-up your credits to continue making changes to your profile and adding contacts", comment: "") + } else { + return + } + + showModalDialog(style: .warning, icon: .system("exclamationmark.triangle.fill"), heading: heading, textBlock1: message, positiveButtonText: NSLocalizedString("Buy credits", comment: ""), positiveButtonAction: { + + let vc = BuyCreditsViewController.init() + let navigationController = BaseNavigationController(rootViewController: vc) + navigationController.isModalInPresentation = true + self.present(navigationController, animated: true) + }, negativeButtonText: NSLocalizedString("Maybe later", comment: "")) + } + } + + func editProfileViewControllerDidCancel(_ controller: RootEditProfileViewController) { + controller.dismiss(animated: true, completion: nil) + } +} diff --git a/DashWallet/Sources/UI/DashPay/Profile/Edit Profile/RootEditProfileViewController.swift b/DashWallet/Sources/UI/DashPay/Profile/Edit Profile/RootEditProfileViewController.swift new file mode 100644 index 000000000..02df66847 --- /dev/null +++ b/DashWallet/Sources/UI/DashPay/Profile/Edit Profile/RootEditProfileViewController.swift @@ -0,0 +1,112 @@ +// +// Created by Andrew Podkovyrin +// Copyright © 2020 Dash Core Group. All rights reserved. +// +// Licensed under the MIT License (the "License"); +// you may not use this file except in compliance with the License. +// You may obtain a copy of the License at +// +// https://opensource.org/licenses/MIT +// +// Unless required by applicable law or agreed to in writing, software +// distributed under the License is distributed on an "AS IS" BASIS, +// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +// See the License for the specific language governing permissions and +// limitations under the License. +// + +import UIKit + +@objc(DWRootEditProfileViewControllerDelegate) +protocol RootEditProfileViewControllerDelegate: AnyObject { + func editProfileViewController(_ controller: RootEditProfileViewController, updateDisplayName rawDisplayName: String, aboutMe rawAboutMe: String, avatarURLString: String?) + func editProfileViewControllerDidCancel(_ controller: RootEditProfileViewController) +} + +@objc(DWRootEditProfileViewController) +class RootEditProfileViewController: DWBaseActionButtonViewController, DWEditProfileViewControllerDelegate, DWSaveAlertViewControllerDelegate, NavigationBarDisplayable { + + static var currentCredits: Double = 0.5 // TODO: temp MOCK_DASHPAY + + var isBackButtonHidden: Bool = false + + @objc + weak var delegate: RootEditProfileViewControllerDelegate? + private var editController: DWEditProfileViewController! + var blockchainIdentity: DSBlockchainIdentity? { + return editController.blockchainIdentity + } + + override func viewDidLoad() { + super.viewDidLoad() + + self.title = NSLocalizedString("Edit Profile", comment: "") + + let cancel = UIBarButtonItem(barButtonSystemItem: .cancel, target: self, action: #selector(cancelButtonAction)) + self.navigationItem.leftBarButtonItem = cancel + + let contentView = UIView() + contentView.translatesAutoresizingMaskIntoConstraints = false + setupContentView(contentView) + + self.editController = DWEditProfileViewController() + self.editController.delegate = self + self.dw_embedChild(self.editController, inContainer: contentView) + + self.editProfileViewControllerDidUpdate(self.editController) + } + + override var preferredStatusBarStyle: UIStatusBarStyle { + return .lightContent + } + + override var actionButtonTitle: String { + return NSLocalizedString("Save", comment: "") + } + + @objc private func cancelButtonAction() { + if self.editController.hasChanges() { + let saveAlert = DWSaveAlertViewController() + saveAlert.delegate = self + self.present(saveAlert, animated: true, completion: nil) + } else { + self.delegate?.editProfileViewControllerDidCancel(self) + } + } + + @objc override func actionButtonAction(_ sender: Any) { + performSave() + } + + private func performSave() { + self.delegate?.editProfileViewController(self, updateDisplayName: self.editController.displayName, aboutMe: self.editController.aboutMe, avatarURLString: self.editController.avatarURLString) + } + + // MARK: - DWEditProfileViewControllerDelegate + + func editProfileViewControllerDidUpdate(_ controller: DWEditProfileViewController) { + self.actionButton?.isEnabled = controller.isValid + } + + // MARK: - DWSaveAlertViewControllerDelegate + + func saveAlertViewControllerCancelAction(_ controller: DWSaveAlertViewController) { + controller.dismiss(animated: true) { + self.delegate?.editProfileViewControllerDidCancel(self) + } + } + + func saveAlertViewControllerOKAction(_ controller: DWSaveAlertViewController) { + controller.dismiss(animated: true) { + self.performSave() + } + } + + private func dw_embedChild(_ child: UIViewController, inContainer container: UIView) { + addChild(child) + container.addSubview(child.view) + child.view.frame = container.bounds + child.view.autoresizingMask = [.flexibleWidth, .flexibleHeight] + child.didMove(toParent: self) + } +} diff --git a/DashPay/Presentation/Profile/UserProfile/DPWelcomeMenuView.swift b/DashWallet/Sources/UI/DashPay/Profile/User Profile/DPWelcomeMenuView.swift similarity index 100% rename from DashPay/Presentation/Profile/UserProfile/DPWelcomeMenuView.swift rename to DashWallet/Sources/UI/DashPay/Profile/User Profile/DPWelcomeMenuView.swift diff --git a/DashWallet/Sources/UI/DashPay/Setup/DWDashPaySetupModel.h b/DashWallet/Sources/UI/DashPay/Setup/DWDashPaySetupModel.h deleted file mode 100644 index ac876f39d..000000000 --- a/DashWallet/Sources/UI/DashPay/Setup/DWDashPaySetupModel.h +++ /dev/null @@ -1,26 +0,0 @@ -// -// Created by Andrew Podkovyrin -// Copyright © 2021 Dash Core Group. All rights reserved. -// -// Licensed under the MIT License (the "License"); -// you may not use this file except in compliance with the License. -// You may obtain a copy of the License at -// -// https://opensource.org/licenses/MIT -// -// Unless required by applicable law or agreed to in writing, software -// distributed under the License is distributed on an "AS IS" BASIS, -// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. -// See the License for the specific language governing permissions and -// limitations under the License. -// - -#import "DWDashPayProtocol.h" - -NS_ASSUME_NONNULL_BEGIN - -@interface DWDashPaySetupModel : NSObject - -@end - -NS_ASSUME_NONNULL_END diff --git a/DashWallet/Sources/UI/DashPay/Setup/DWDashPaySetupModel.m b/DashWallet/Sources/UI/DashPay/Setup/DWDashPaySetupModel.m deleted file mode 100644 index 1b9a6c8dd..000000000 --- a/DashWallet/Sources/UI/DashPay/Setup/DWDashPaySetupModel.m +++ /dev/null @@ -1,71 +0,0 @@ -// -// Created by Andrew Podkovyrin -// Copyright © 2021 Dash Core Group. All rights reserved. -// -// Licensed under the MIT License (the "License"); -// you may not use this file except in compliance with the License. -// You may obtain a copy of the License at -// -// https://opensource.org/licenses/MIT -// -// Unless required by applicable law or agreed to in writing, software -// distributed under the License is distributed on an "AS IS" BASIS, -// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. -// See the License for the specific language governing permissions and -// limitations under the License. -// - -#import "DWDashPaySetupModel.h" - -@implementation DWDashPaySetupModel - -@synthesize blockchainIdentity; - -@synthesize lastRegistrationError; - -@synthesize registrationCompleted; - -@synthesize registrationStatus; - -@synthesize unreadNotificationsCount; - -@synthesize username; - -@synthesize userProfile; - -- (BOOL)canRetry { - return NO; -} - -- (void)completeRegistration { - // nop -} - -- (void)createUsername:(nonnull NSString *)username invitation:(nonnull NSURL *)invitation { - NSAssert(NO, @"Should not be called"); - // nop -} - -- (void)retry { - NSAssert(NO, @"Should not be called"); - // nop -} - -- (void)setHasEnoughBalanceForInvitationNotification:(BOOL)value { - // nop -} - -- (BOOL)shouldPresentRegistrationPaymentConfirmation { - return YES; -} - -- (void)updateUsernameStatus { - // nop -} - -- (void)verifyDeeplink:(nonnull NSURL *)url completion:(nonnull void (^)(BOOL, NSString *_Nullable, NSString *_Nullable))completion { - NSAssert(NO, @"Should not be called"); - // nop -} - -@end diff --git a/DashPay/Presentation/Setup/DashPaySetupFlowController.swift b/DashWallet/Sources/UI/DashPay/Setup/DashPaySetupFlowController.swift similarity index 100% rename from DashPay/Presentation/Setup/DashPaySetupFlowController.swift rename to DashWallet/Sources/UI/DashPay/Setup/DashPaySetupFlowController.swift diff --git a/DashPay/Presentation/Setup/Model/DWDashPaySetupModel.h b/DashWallet/Sources/UI/DashPay/Setup/Model/DWDashPaySetupModel.h similarity index 100% rename from DashPay/Presentation/Setup/Model/DWDashPaySetupModel.h rename to DashWallet/Sources/UI/DashPay/Setup/Model/DWDashPaySetupModel.h diff --git a/DashPay/Presentation/Setup/Model/DWDashPaySetupModel.m b/DashWallet/Sources/UI/DashPay/Setup/Model/DWDashPaySetupModel.m similarity index 100% rename from DashPay/Presentation/Setup/Model/DWDashPaySetupModel.m rename to DashWallet/Sources/UI/DashPay/Setup/Model/DWDashPaySetupModel.m diff --git a/DashWallet/Sources/UI/Home/HomeViewController.swift b/DashWallet/Sources/UI/Home/HomeViewController.swift index e7f21ff24..65cb49879 100644 --- a/DashWallet/Sources/UI/Home/HomeViewController.swift +++ b/DashWallet/Sources/UI/Home/HomeViewController.swift @@ -18,10 +18,11 @@ import UIKit import SwiftUI -class HomeViewController: DWBasePayViewController { +class HomeViewController: DWBasePayViewController, NavigationBarDisplayable { var model: DWHomeProtocol! private var homeView: HomeView! weak var delegate: (DWHomeViewControllerDelegate & DWWipeDelegate)? + var isBackButtonHidden: Bool = false #if DASHPAY private var invitationSetup: DWInvitationSetupState? @@ -139,15 +140,9 @@ class HomeViewController: DWBasePayViewController { return } - let notificationsImage: UIImage? - if hasNotifications { - notificationsImage = UIImage(named: "icon_bell_active") - } else { - notificationsImage = UIImage(named: "icon_bell") - } - - notificationsImage?.withRenderingMode(.alwaysOriginal) + let notificationsImage = UIImage(named: hasNotifications ? "icon_bell_active" : "icon_bell")!.withRenderingMode(.alwaysOriginal) let notificationButton = UIBarButtonItem(image: notificationsImage, style: .plain, target: self, action: #selector(notificationAction)) + notificationButton.tintColor = .white navigationItem.rightBarButtonItem = notificationButton } @@ -157,7 +152,7 @@ class HomeViewController: DWBasePayViewController { } @objc func profileAction() { - let controller = DWRootEditProfileViewController() + let controller = RootEditProfileViewController() controller.delegate = self let navigation = BaseNavigationController(rootViewController: controller) navigation.modalPresentationStyle = .fullScreen @@ -227,15 +222,15 @@ class HomeViewController: DWBasePayViewController { #if DASHPAY -// MARK: - DWRootEditProfileViewControllerDelegate +// MARK: - RootEditProfileViewControllerDelegate -extension HomeViewController: DWRootEditProfileViewControllerDelegate { - func editProfileViewController(_ controller: DWRootEditProfileViewController, updateDisplayName rawDisplayName: String, aboutMe rawAboutMe: String, avatarURLString: String?) { +extension HomeViewController: RootEditProfileViewControllerDelegate { + func editProfileViewController(_ controller: RootEditProfileViewController, updateDisplayName rawDisplayName: String, aboutMe rawAboutMe: String, avatarURLString: String?) { model.dashPayModel.userProfile.updateModel.update(withDisplayName: rawDisplayName, aboutMe: rawAboutMe, avatarURLString: avatarURLString) controller.dismiss(animated: true, completion: nil) } - func editProfileViewControllerDidCancel(_ controller: DWRootEditProfileViewController) { + func editProfileViewControllerDidCancel(_ controller: RootEditProfileViewController) { controller.dismiss(animated: true, completion: nil) } } diff --git a/DashWallet/Sources/UI/Menu/Main/DWMainMenuViewController.m b/DashWallet/Sources/UI/Menu/Main/DWMainMenuViewController.m index abec433d7..deebf02c4 100644 --- a/DashWallet/Sources/UI/Menu/Main/DWMainMenuViewController.m +++ b/DashWallet/Sources/UI/Menu/Main/DWMainMenuViewController.m @@ -28,10 +28,8 @@ #import "DWSettingsMenuViewController.h" #import "SFSafariViewController+DashWallet.h" #import "dashwallet-Swift.h" -#import "DWRootEditProfileViewController.h" #ifdef DASHPAY -#import "DWMainMenuViewController+DashPay.h" #import "DWUserProfileModalQRViewController.h" #import "DWInvitationHistoryViewController.h" #endif @@ -280,5 +278,4 @@ - (void)editProfileViewControllerDidCancel:(DWRootEditProfileViewController *)co @end - NS_ASSUME_NONNULL_END diff --git a/DashWallet/Sources/UI/Payments/Amount/SendAmountViewController.swift b/DashWallet/Sources/UI/Payments/Amount/SendAmountViewController.swift index f3edffe76..dc2124c0a 100644 --- a/DashWallet/Sources/UI/Payments/Amount/SendAmountViewController.swift +++ b/DashWallet/Sources/UI/Payments/Amount/SendAmountViewController.swift @@ -64,14 +64,12 @@ class SendAmountViewController: BaseAmountViewController { .localizedStringWithFormat(NSLocalizedString("Please note, you will not be able to withdraw your funds from CowdNode to this wallet until you increase your balance to %@ Dash.", comment: "Leftover balance warning"), CrowdNode.minimumLeftoverBalance.formattedDashAmountWithoutCurrencySymbol) - let alert = UIAlertController(title: title, message: message, preferredStyle: .alert) - alert.addAction(UIAlertAction(title: NSLocalizedString("Continue", comment: "Leftover balance warning"), style: .default, handler: { _ in + + showModalDialog(icon: .system("info"), heading: title, textBlock1: message, positiveButtonText: NSLocalizedString("Continue", comment: "Leftover balance warning"), positiveButtonAction: { completion(true) - })) - alert.addAction(UIAlertAction(title: NSLocalizedString("Cancel", comment: "Leftover balance warning"), style: .cancel, handler: { _ in + }, negativeButtonText: NSLocalizedString("Cancel", comment: "Leftover balance warning")) { completion(false) - })) - present(alert, animated: true, completion: nil) + } } else { completion(true) } diff --git a/DashWallet/Sources/UI/Payments/PaymentModels/DWPaymentInputBuilder.m b/DashWallet/Sources/UI/Payments/PaymentModels/DWPaymentInputBuilder.m index f6be46933..85655e625 100644 --- a/DashWallet/Sources/UI/Payments/PaymentModels/DWPaymentInputBuilder.m +++ b/DashWallet/Sources/UI/Payments/PaymentModels/DWPaymentInputBuilder.m @@ -152,6 +152,7 @@ - (DWPaymentInput *)paymentInputWithUserItem:(id)userItem { paymentInput.userItem = userItem; paymentInput.canChangeAmount = YES; paymentInput.request = paymentRequest; + paymentInput.request.dashpayUsername = userItem.username; return paymentInput; } diff --git a/DashWallet/Sources/UI/Payments/PaymentModels/DWPaymentProcessor.m b/DashWallet/Sources/UI/Payments/PaymentModels/DWPaymentProcessor.m index 99d460b76..99aeee9ed 100644 --- a/DashWallet/Sources/UI/Payments/PaymentModels/DWPaymentProcessor.m +++ b/DashWallet/Sources/UI/Payments/PaymentModels/DWPaymentProcessor.m @@ -27,6 +27,8 @@ #if DASHPAY #import "DWDPUserObject.h" +// if MOCK_DASHPAY +#import "DWDashPayConstants.h" #endif NS_ASSUME_NONNULL_BEGIN @@ -125,6 +127,14 @@ - (void)processPaymentInput:(DWPaymentInput *)paymentInput { if (requestUsername) { DSWallet *wallet = [DWEnvironment sharedInstance].currentWallet; DSBlockchainIdentity *myBlockchainIdentity = wallet.defaultBlockchainIdentity; + + if (MOCK_DASHPAY && myBlockchainIdentity == NULL) { + NSString *username = [DWGlobalOptions sharedInstance].dashpayUsername; + + if (username != nil) { + myBlockchainIdentity = [[DWEnvironment sharedInstance].currentWallet createBlockchainIdentityForUsername:username]; + } + } if (myBlockchainIdentity) { NSManagedObjectContext *context = NSManagedObjectContext.viewContext; diff --git a/DashWallet/Sources/UI/Setup/SecureWallet/Seed/BackupSeedPhraseViewController.swift b/DashWallet/Sources/UI/Setup/SecureWallet/Seed/BackupSeedPhraseViewController.swift index 60b700898..a59b70cda 100644 --- a/DashWallet/Sources/UI/Setup/SecureWallet/Seed/BackupSeedPhraseViewController.swift +++ b/DashWallet/Sources/UI/Setup/SecureWallet/Seed/BackupSeedPhraseViewController.swift @@ -36,7 +36,7 @@ class BackupSeedPhraseViewController: DWPreviewSeedPhraseViewController { #endif } - var actionButtonTitle: String { + override var actionButtonTitle: String { return NSLocalizedString("Continue", comment: "") } diff --git a/DashWallet/Sources/UI/SwiftUI Components/ModalDialog.swift b/DashWallet/Sources/UI/SwiftUI Components/ModalDialog.swift index 2b3ff7788..f00c91ce4 100644 --- a/DashWallet/Sources/UI/SwiftUI Components/ModalDialog.swift +++ b/DashWallet/Sources/UI/SwiftUI Components/ModalDialog.swift @@ -43,14 +43,19 @@ struct ModalDialog: View { VStack { if let icon = icon { switch icon { - case .custom(_): - Icon(name: icon) + case .custom(let name): + Image(name) + .resizable() + .scaledToFit() .frame(width: 48, height: 48) .padding(.top, 12) .padding(.bottom, 16) - case .system(_): - Icon(name: icon) - .frame(width: 22, height: 22) + case .system(let name): + Image(systemName: name) + .resizable() + .scaledToFit() + .imageScale(.medium) + .frame(width: 20, height: 20) .frame(width: 48, height: 48) .foregroundColor(.white) .background(iconBackgroundColor(for: style)) @@ -155,13 +160,13 @@ extension UIViewController { smallButtonAction: smallButtonAction, positiveButtonText: positiveButtonText, positiveButtonAction: { - positiveButtonAction?() self.dismiss(animated: true) + positiveButtonAction?() }, negativeButtonText: negativeButtonText, negativeButtonAction: { - negativeButtonAction?() self.dismiss(animated: true) + negativeButtonAction?() }, buttonsOrientation: buttonsOrientation, buttonsStyle: buttonsStyle diff --git a/DashWallet/Sources/UI/SwiftUI Components/SendIntro.swift b/DashWallet/Sources/UI/SwiftUI Components/SendIntro.swift new file mode 100644 index 000000000..7a0bd97ec --- /dev/null +++ b/DashWallet/Sources/UI/SwiftUI Components/SendIntro.swift @@ -0,0 +1,57 @@ +// +// Created by Andrei Ashikhmin +// Copyright © 2024 Dash Core Group. All rights reserved. +// +// Licensed under the MIT License (the "License"); +// you may not use this file except in compliance with the License. +// You may obtain a copy of the License at +// +// https://opensource.org/licenses/MIT +// +// Unless required by applicable law or agreed to in writing, software +// distributed under the License is distributed on an "AS IS" BASIS, +// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +// See the License for the specific language governing permissions and +// limitations under the License. +// + +import SwiftUI + +struct SendIntro: View { + var title: String + var destination: String? = nil + var balance: Double = 0.00 + var usdEquivalent: Double = 0.00 + + var body: some View { + VStack(alignment: .leading, spacing: 10) { + Text(title) + .font(.title) + .fontWeight(.bold) + + if let destination = destination { + Text("to \(destination)") + .font(.subheadline) + .foregroundColor(.secondary) + } + + HStack { + Text("Balance: \(String(format: "%.2f", balance)) ") + .font(.body) + + Text(Image(systemName: "bitcoinsign.circle")) + + Text(" ~ \(String(format: "%.2f", usdEquivalent)) US$") + .font(.body) + + Button(action: { + // Action for the eye button + }) { + Image(systemName: "eye.fill") + .foregroundColor(.gray) + .padding(5) + .background(Circle().fill(Color.gray.opacity(0.2))) + } + } + } + .padding() + } +} diff --git a/DashWallet/Sources/UI/Views/BaseController/DWBaseActionButtonViewController.h b/DashWallet/Sources/UI/Views/BaseController/DWBaseActionButtonViewController.h index 1ca1f8767..b18d9be58 100644 --- a/DashWallet/Sources/UI/Views/BaseController/DWBaseActionButtonViewController.h +++ b/DashWallet/Sources/UI/Views/BaseController/DWBaseActionButtonViewController.h @@ -31,11 +31,11 @@ extern CGFloat DWBottomButtonHeight(void); @property (nonatomic, assign, getter=isKeyboardNotificationsEnabled) BOOL keyboardNotificationsEnabled; @property (readonly, nullable, nonatomic, strong) id actionButton; +@property (readonly, nonatomic) NSString *actionButtonTitle; + (BOOL)showsActionButton; + (BOOL)isActionButtonInNavigationBar; -- (NSString *)actionButtonTitle; - (NSString *)actionButtonDisabledTitle; - (void)setupContentView:(UIView *)contentView; diff --git a/DashWallet/dashwallet-Bridging-Header.h b/DashWallet/dashwallet-Bridging-Header.h index 2b67d14a0..edbaa365a 100644 --- a/DashWallet/dashwallet-Bridging-Header.h +++ b/DashWallet/dashwallet-Bridging-Header.h @@ -130,6 +130,9 @@ static const bool _SNAPSHOT = 0; #import "DWContainerViewController.h" #import "DWDashPaySetupModel.h" #import "UIViewController+DWDisplayError.h" +#import "DWEditProfileViewController.h" +#import "DWSaveAlertViewController.h" +#import "DWMainMenuContentView.h" #endif //MARK: CrowdNode @@ -150,7 +153,6 @@ static const bool _SNAPSHOT = 0; //MARK: Home #import "DWHomeModel.h" -#import "DWRootEditProfileViewController.h" #import "DWRecoverViewController.h" #import "UIViewController+DWTxFilter.h" #import "DSAuthenticationManager.h" From 316f41e64c0615f0e1f937ce3742e329c04d41d7 Mon Sep 17 00:00:00 2001 From: Andrei Ashikhmin Date: Sat, 20 Jul 2024 13:43:25 +0700 Subject: [PATCH 4/6] fix: crowdnode leftover dialog --- .../Payments/Amount/SendAmountViewController.swift | 12 +++++++----- 1 file changed, 7 insertions(+), 5 deletions(-) diff --git a/DashWallet/Sources/UI/Payments/Amount/SendAmountViewController.swift b/DashWallet/Sources/UI/Payments/Amount/SendAmountViewController.swift index dc2124c0a..34310b23b 100644 --- a/DashWallet/Sources/UI/Payments/Amount/SendAmountViewController.swift +++ b/DashWallet/Sources/UI/Payments/Amount/SendAmountViewController.swift @@ -63,13 +63,15 @@ class SendAmountViewController: BaseAmountViewController { let message = String .localizedStringWithFormat(NSLocalizedString("Please note, you will not be able to withdraw your funds from CowdNode to this wallet until you increase your balance to %@ Dash.", comment: "Leftover balance warning"), - CrowdNode.minimumLeftoverBalance.formattedDashAmountWithoutCurrencySymbol) - - showModalDialog(icon: .system("info"), heading: title, textBlock1: message, positiveButtonText: NSLocalizedString("Continue", comment: "Leftover balance warning"), positiveButtonAction: { + CrowdNode.minimumLeftoverBalance.formattedDashAmountWithoutCurrencySymbol) + let alert = UIAlertController(title: title, message: message, preferredStyle: .alert) + alert.addAction(UIAlertAction(title: NSLocalizedString("Continue", comment: "Leftover balance warning"), style: .default, handler: { _ in completion(true) - }, negativeButtonText: NSLocalizedString("Cancel", comment: "Leftover balance warning")) { + })) + alert.addAction(UIAlertAction(title: NSLocalizedString("Cancel", comment: "Leftover balance warning"), style: .cancel, handler: { _ in completion(false) - } + })) + present(alert, animated: true, completion: nil) } else { completion(true) } From 2ad0f250f2d05199d941a0783b26ec8c2f5b2de1 Mon Sep 17 00:00:00 2001 From: Andrei Ashikhmin Date: Sun, 21 Jul 2024 19:34:04 +0700 Subject: [PATCH 5/6] feat: buy credits controller and warning --- DashWallet.xcodeproj/project.pbxproj | 8 + .../NSLayoutConstraint+DashWallet.swift | 23 +++ .../CrowdNodeTransferViewController.swift | 1 - .../Credits/BuyCreditsViewController.swift | 142 +++++++++++++++--- .../DWMainMenuViewController+DashPay.swift | 11 +- .../RootEditProfileViewController.swift | 7 +- .../Amount/BaseAmountViewController.swift | 18 ++- .../Payments/Amount/Model/AmountObject.swift | 2 +- .../Amount/Model/BaseAmountModel.swift | 15 +- .../Amount/Model/Send/SendAmountModel.swift | 2 +- .../Amount/SendAmountViewController.swift | 4 - .../UI/SwiftUI Components/Color+DWStyle.swift | 4 + .../UI/SwiftUI Components/DashAmount.swift | 14 +- .../UI/SwiftUI Components/SendIntro.swift | 77 +++++++--- .../Sources/UI/SwiftUI Components/Toast.swift | 6 +- .../Transfer/Model/UpholdAmountModel.swift | 2 +- .../UpholdTransferViewController.swift | 4 - DashWallet/Sources/UI/Views/UIColor+DWStyle.h | 2 + DashWallet/Sources/UI/Views/UIColor+DWStyle.m | 6 + DashWallet/ar.lproj/Localizable.strings | 18 +++ DashWallet/bg.lproj/Localizable.strings | 18 +++ DashWallet/ca.lproj/Localizable.strings | 18 +++ DashWallet/cs.lproj/Localizable.strings | 18 +++ DashWallet/da.lproj/Localizable.strings | 18 +++ DashWallet/de.lproj/Localizable.strings | 18 +++ DashWallet/el.lproj/Localizable.strings | 18 +++ DashWallet/en.lproj/Localizable.strings | 18 +++ DashWallet/eo.lproj/Localizable.strings | 18 +++ DashWallet/es.lproj/Localizable.strings | 18 +++ DashWallet/et.lproj/Localizable.strings | 18 +++ DashWallet/fa.lproj/Localizable.strings | 18 +++ DashWallet/fi.lproj/Localizable.strings | 18 +++ DashWallet/fil.lproj/Localizable.strings | 18 +++ DashWallet/fr.lproj/Localizable.strings | 18 +++ DashWallet/hr.lproj/Localizable.strings | 18 +++ DashWallet/hu.lproj/Localizable.strings | 18 +++ DashWallet/id.lproj/Localizable.strings | 18 +++ DashWallet/it.lproj/Localizable.strings | 18 +++ DashWallet/ja.lproj/Localizable.strings | 18 +++ DashWallet/ko.lproj/Localizable.strings | 18 +++ DashWallet/mk.lproj/Localizable.strings | 18 +++ DashWallet/ms.lproj/Localizable.strings | 18 +++ DashWallet/nb.lproj/Localizable.strings | 18 +++ DashWallet/nl.lproj/Localizable.strings | 18 +++ DashWallet/pl.lproj/Localizable.strings | 18 +++ DashWallet/pt.lproj/Localizable.strings | 18 +++ DashWallet/ro.lproj/Localizable.strings | 18 +++ DashWallet/ru.lproj/Localizable.strings | 18 +++ DashWallet/sk.lproj/Localizable.strings | 18 +++ DashWallet/sl.lproj/Localizable.strings | 18 +++ DashWallet/sl_SI.lproj/Localizable.strings | 18 +++ DashWallet/sq.lproj/Localizable.strings | 18 +++ DashWallet/sr.lproj/Localizable.strings | 18 +++ DashWallet/sv.lproj/Localizable.strings | 18 +++ DashWallet/th.lproj/Localizable.strings | 18 +++ DashWallet/tr.lproj/Localizable.strings | 18 +++ DashWallet/uk.lproj/Localizable.strings | 18 +++ DashWallet/vi.lproj/Localizable.strings | 18 +++ DashWallet/zh-Hans.lproj/Localizable.strings | 18 +++ .../zh-Hant-TW.lproj/Localizable.strings | 18 +++ DashWallet/zh.lproj/Localizable.strings | 18 +++ DashWallet/zh_TW.lproj/Localizable.strings | 18 +++ .../Colors/Gray500.colorset/Contents.json | 38 +++++ 63 files changed, 1074 insertions(+), 86 deletions(-) create mode 100644 DashWallet/Sources/Categories/NSLayoutConstraint+DashWallet.swift create mode 100644 Shared/Resources/SharedAssets.xcassets/Colors/Gray500.colorset/Contents.json diff --git a/DashWallet.xcodeproj/project.pbxproj b/DashWallet.xcodeproj/project.pbxproj index f65821f98..3a12fff15 100644 --- a/DashWallet.xcodeproj/project.pbxproj +++ b/DashWallet.xcodeproj/project.pbxproj @@ -586,6 +586,8 @@ 75889B792AD2A04900C17F5D /* CoinJoinInfoViewController.swift in Sources */ = {isa = PBXBuildFile; fileRef = 75889B752AD296E700C17F5D /* CoinJoinInfoViewController.swift */; }; 75889B7F2AD2D7F800C17F5D /* CoinJoin.storyboard in Resources */ = {isa = PBXBuildFile; fileRef = 75889B812AD2D7F800C17F5D /* CoinJoin.storyboard */; }; 75889B892AD2DF0200C17F5D /* CoinJoin.storyboard in Resources */ = {isa = PBXBuildFile; fileRef = 75889B812AD2D7F800C17F5D /* CoinJoin.storyboard */; }; + 758A8F172C4D35A80012FA41 /* NSLayoutConstraint+DashWallet.swift in Sources */ = {isa = PBXBuildFile; fileRef = 758A8F162C4D35A80012FA41 /* NSLayoutConstraint+DashWallet.swift */; }; + 758A8F182C4D35A80012FA41 /* NSLayoutConstraint+DashWallet.swift in Sources */ = {isa = PBXBuildFile; fileRef = 758A8F162C4D35A80012FA41 /* NSLayoutConstraint+DashWallet.swift */; }; 758CE59C2BC566DE0062AF53 /* PrivacyInfo.xcprivacy in Resources */ = {isa = PBXBuildFile; fileRef = 758CE59B2BC566DE0062AF53 /* PrivacyInfo.xcprivacy */; }; 758CE59D2BC566DE0062AF53 /* PrivacyInfo.xcprivacy in Resources */ = {isa = PBXBuildFile; fileRef = 758CE59B2BC566DE0062AF53 /* PrivacyInfo.xcprivacy */; }; 758CE59E2BC566DE0062AF53 /* PrivacyInfo.xcprivacy in Resources */ = {isa = PBXBuildFile; fileRef = 758CE59B2BC566DE0062AF53 /* PrivacyInfo.xcprivacy */; }; @@ -660,6 +662,7 @@ 75EBAA262BBA9DC2004488E3 /* ZenLedger.swift in Sources */ = {isa = PBXBuildFile; fileRef = 75EBAA242BBA9DC2004488E3 /* ZenLedger.swift */; }; 75EBAA292BBBE385004488E3 /* ZenLedgerViewModel.swift in Sources */ = {isa = PBXBuildFile; fileRef = 75EBAA282BBBE385004488E3 /* ZenLedgerViewModel.swift */; }; 75EBAA2A2BBBE385004488E3 /* ZenLedgerViewModel.swift in Sources */ = {isa = PBXBuildFile; fileRef = 75EBAA282BBBE385004488E3 /* ZenLedgerViewModel.swift */; }; + 75F3F00D2C48F819004470EA /* RootEditProfileViewController.swift in Sources */ = {isa = PBXBuildFile; fileRef = 759063EC2C42687F002F2AA9 /* RootEditProfileViewController.swift */; }; 75F51AAD2ABD8C800057B499 /* IntegrationViewController+Uphold.swift in Sources */ = {isa = PBXBuildFile; fileRef = 75F51AAC2ABD8C800057B499 /* IntegrationViewController+Uphold.swift */; }; 75F51AAF2ABD8D070057B499 /* IntegrationViewController+Coinbase.swift in Sources */ = {isa = PBXBuildFile; fileRef = 75F51AAE2ABD8D070057B499 /* IntegrationViewController+Coinbase.swift */; }; 75F990822AFD1065006759AB /* UsernameRequestDetailsViewController.swift in Sources */ = {isa = PBXBuildFile; fileRef = 75F990812AFD1065006759AB /* UsernameRequestDetailsViewController.swift */; }; @@ -2455,6 +2458,7 @@ 757E09981ADB8EEB006FD352 /* en */ = {isa = PBXFileReference; lastKnownFileType = text.plist.strings; name = en; path = en.lproj/Localizable.strings; sourceTree = ""; }; 75889B752AD296E700C17F5D /* CoinJoinInfoViewController.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = CoinJoinInfoViewController.swift; sourceTree = ""; }; 75889B802AD2D7F800C17F5D /* Base */ = {isa = PBXFileReference; lastKnownFileType = file.storyboard; name = Base; path = Base.lproj/CoinJoin.storyboard; sourceTree = ""; }; + 758A8F162C4D35A80012FA41 /* NSLayoutConstraint+DashWallet.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = "NSLayoutConstraint+DashWallet.swift"; sourceTree = ""; }; 758CE59B2BC566DE0062AF53 /* PrivacyInfo.xcprivacy */ = {isa = PBXFileReference; lastKnownFileType = text.xml; path = PrivacyInfo.xcprivacy; sourceTree = ""; }; 759063E72C411029002F2AA9 /* DashPaySetupFlowController.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = DashPaySetupFlowController.swift; sourceTree = ""; }; 759063EC2C42687F002F2AA9 /* RootEditProfileViewController.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = RootEditProfileViewController.swift; sourceTree = ""; }; @@ -4991,6 +4995,7 @@ 474C7210298A1A9500475CA6 /* UIView+Reuse.swift */, 472D13E9299E5396006903F1 /* NSAttributedString+Builder.swift */, C9F451E82A0BDAE700825057 /* UIApplication+DashWallet.swift */, + 758A8F162C4D35A80012FA41 /* NSLayoutConstraint+DashWallet.swift */, ); path = Categories; sourceTree = ""; @@ -8473,6 +8478,7 @@ 2A8B9E7A2302E67400FF8653 /* DWReceiveModel.m in Sources */, 119E8D0A2905413F00D406C1 /* TransactionWrapper.swift in Sources */, 479DBDDD2995168C00F30AF1 /* Transactions.swift in Sources */, + 75F3F00D2C48F819004470EA /* RootEditProfileViewController.swift in Sources */, 2A74EFFB2305464C00C475EB /* DWRecoverTextView.m in Sources */, 4709C315287EA11900B4BD48 /* TxUserInfo.swift in Sources */, C91E91AE29FFC8A1003E7883 /* ExtendedPublicKeysViewController.swift in Sources */, @@ -8742,6 +8748,7 @@ 75EBAA0F2BB99036004488E3 /* TextIntro.swift in Sources */, 0F71317728F436920072F454 /* ServiceOverviewTableCell.swift in Sources */, 47838B87290670630003E8AB /* IntegrationViewController.swift in Sources */, + 758A8F172C4D35A80012FA41 /* NSLayoutConstraint+DashWallet.swift in Sources */, 2AD1CE8022DC92BF00C99324 /* NSString+DWTextSize.m in Sources */, 47AE8C0528C1F74A00490F5E /* PointOfUseListFiltersCell.swift in Sources */, 47081199298CF57D003FCA3D /* TransactionListDataSource.swift in Sources */, @@ -9635,6 +9642,7 @@ C943B3462A409FFA00AF23C5 /* DWDPAvatarView.m in Sources */, C9D2C8702A320AA000D15901 /* AmountObject.swift in Sources */, C9D2C8712A320AA000D15901 /* DerivationPathKeysViewController.swift in Sources */, + 758A8F182C4D35A80012FA41 /* NSLayoutConstraint+DashWallet.swift in Sources */, C9D2C8722A320AA000D15901 /* DSTransaction+DashWallet.m in Sources */, C943B58D2A40ED6F00AF23C5 /* DWCreateUsernameViewController.m in Sources */, C943B58E2A40ED6F00AF23C5 /* DWAllowedCharactersUsernameValidationRule.m in Sources */, diff --git a/DashWallet/Sources/Categories/NSLayoutConstraint+DashWallet.swift b/DashWallet/Sources/Categories/NSLayoutConstraint+DashWallet.swift new file mode 100644 index 000000000..022f54c7e --- /dev/null +++ b/DashWallet/Sources/Categories/NSLayoutConstraint+DashWallet.swift @@ -0,0 +1,23 @@ +// +// Created by Andrei Ashikhmin +// Copyright © 2024 Dash Core Group. All rights reserved. +// +// Licensed under the MIT License (the "License"); +// you may not use this file except in compliance with the License. +// You may obtain a copy of the License at +// +// https://opensource.org/licenses/MIT +// +// Unless required by applicable law or agreed to in writing, software +// distributed under the License is distributed on an "AS IS" BASIS, +// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +// See the License for the specific language governing permissions and +// limitations under the License. +// + +extension NSLayoutConstraint { + func withPriority(_ priority: UILayoutPriority) -> NSLayoutConstraint { + self.priority = priority + return self + } +} diff --git a/DashWallet/Sources/UI/CrowdNode/Portal/CrowdNodeTransferViewController.swift b/DashWallet/Sources/UI/CrowdNode/Portal/CrowdNodeTransferViewController.swift index b72b84eb6..8cd8e2268 100644 --- a/DashWallet/Sources/UI/CrowdNode/Portal/CrowdNodeTransferViewController.swift +++ b/DashWallet/Sources/UI/CrowdNode/Portal/CrowdNodeTransferViewController.swift @@ -22,7 +22,6 @@ import Foundation final class CrowdNodeTransferController: SendAmountViewController, NetworkReachabilityHandling { private let viewModel = CrowdNodeModel.shared - private var cancellableBag = Set() internal var mode: TransferDirection { transferModel.direction diff --git a/DashWallet/Sources/UI/DashPay/Credits/BuyCreditsViewController.swift b/DashWallet/Sources/UI/DashPay/Credits/BuyCreditsViewController.swift index c89502445..6c4916ce2 100644 --- a/DashWallet/Sources/UI/DashPay/Credits/BuyCreditsViewController.swift +++ b/DashWallet/Sources/UI/DashPay/Credits/BuyCreditsViewController.swift @@ -17,23 +17,79 @@ import SwiftUI -final class BuyCreditsViewController: SendAmountViewController, NavigationBarDisplayable { -// override init() { -// super.init(model: SendAmountModel()) -// } +final class BuyCreditsModel: SendAmountModel { + static let opCost: UInt64 = 1000000 // TODO: temp MOCK_DASHPAY + static var currentCredits: Double = 0.5 // TODO: temp MOCK_DASHPAY - var isBackButtonHidden: Bool = false + override var isAllowedToContinue: Bool { + return super.isAllowedToContinue && amount.dashAmount.plainAmount / BuyCreditsModel.opCost > 0 + } + + override func selectAllFundsWithoutAuth() { + let account = DWEnvironment.sharedInstance().currentAccount + let allAvailableFunds = account.maxOutputAmount + + if allAvailableFunds > 0 { + let maxMultiple = allAvailableFunds / BuyCreditsModel.opCost + let max = maxMultiple * BuyCreditsModel.opCost + updateCurrentAmountObject(with: max) + } + } +} + +final class BuyCreditsViewController: SendAmountViewController, ObservableObject { + private var onDismissed: (() -> ())? = nil + + init(onDismissed: (() -> ())?) { + super.init(model: BuyCreditsModel()) + self.onDismissed = onDismissed + } + + private let rateLabel: UILabel = { + let label = UILabel() + label.translatesAutoresizingMaskIntoConstraints = false + label.textAlignment = NSTextAlignment.center + label.numberOfLines = 2 + label.font = .dw_font(forTextStyle: .caption1) + label.textColor = .dw_secondaryText() + + return label + }() + + override var actionButtonTitle: String { + NSLocalizedString("Buy", comment: "Buy") + } + + override func configureModel() { + super.configureModel() + + model.$amount + .removeDuplicates() + .receive(on: DispatchQueue.main) + .sink { [weak self] amount in + self?.updateRate(amount: amount) + } + .store(in: &cancellableBag) + } override func configureHierarchy() { super.configureHierarchy() + let rootView = UIView() + rootView.translatesAutoresizingMaskIntoConstraints = false + rootView.preservesSuperviewLayoutMargins = true + let stackView = UIStackView() stackView.axis = .vertical stackView.spacing = 26 stackView.translatesAutoresizingMaskIntoConstraints = false - contentView.addSubview(stackView) + rootView.addSubview(stackView) - let intro = SendIntro(title: NSLocalizedString("Send", comment: "")) + let intro = SendIntro( + title: NSLocalizedString("Buy credits", comment: "Credits"), + dashBalance: Int64(model.walletBalance), + balanceLabel: NSLocalizedString("Dash balance", comment: "") + ":" + ) let swiftUIController = UIHostingController(rootView: intro) swiftUIController.view.backgroundColor = UIColor.dw_secondaryBackground() @@ -45,25 +101,65 @@ final class BuyCreditsViewController: SendAmountViewController, NavigationBarDis amountView.removeFromSuperview() stackView.addArrangedSubview(amountView) + let rateContainer = UIView() + rateContainer.translatesAutoresizingMaskIntoConstraints = false + rateContainer.backgroundColor = .dw_gray300().withAlphaComponent(0.2) + rateContainer.layer.cornerRadius = 8 + rateContainer.layer.masksToBounds = true + + rateContainer.addSubview(rateLabel) + rootView.addSubview(rateContainer) + contentView.addSubview(rootView) + NSLayoutConstraint.activate([ - stackView.topAnchor.constraint(equalTo: contentView.topAnchor), - stackView.leadingAnchor.constraint(equalTo: contentView.layoutMarginsGuide.leadingAnchor), - stackView.trailingAnchor.constraint(equalTo: contentView.layoutMarginsGuide.trailingAnchor), + stackView.topAnchor.constraint(equalTo: rootView.topAnchor), + stackView.leadingAnchor.constraint(equalTo: rootView.leadingAnchor), + stackView.trailingAnchor.constraint(equalTo: rootView.trailingAnchor), + + rootView.topAnchor.constraint(equalTo: contentView.topAnchor), + rootView.bottomAnchor.constraint(equalTo: keyboardContainer.topAnchor), + rootView.leadingAnchor.constraint(equalTo: contentView.layoutMarginsGuide.leadingAnchor), + rootView.trailingAnchor.constraint(equalTo: contentView.layoutMarginsGuide.trailingAnchor), + + rateContainer.bottomAnchor.constraint(equalTo: rootView.bottomAnchor, constant: -22), + rateContainer.centerXAnchor.constraint(equalTo: rootView.centerXAnchor), + + rateContainer.leadingAnchor.constraint(greaterThanOrEqualTo: rootView.leadingAnchor, constant: 10).withPriority(.defaultHigh), + rootView.trailingAnchor.constraint(greaterThanOrEqualTo: rateContainer.trailingAnchor, constant: 10).withPriority(.defaultHigh), + rateContainer.widthAnchor.constraint(lessThanOrEqualTo: rootView.widthAnchor, constant: -20), + + rateLabel.topAnchor.constraint(equalTo: rateContainer.topAnchor, constant: 4), + rateLabel.leadingAnchor.constraint(equalTo: rateContainer.leadingAnchor, constant: 8), + rateLabel.trailingAnchor.constraint(equalTo: rateContainer.trailingAnchor, constant: -8), + rateLabel.bottomAnchor.constraint(equalTo: rateContainer.bottomAnchor, constant: -4) ]) - -// let backButton = UIBarButtonItem( -// title: "Back", -// style: .plain, -// target: self, -// action: #selector(backButtonTapped) -// ) -// navigationItem.leftBarButtonItem = backButton -// -// // Additional setup if needed -// view.backgroundColor = .red // Example setup } - @objc private func backButtonTapped() { - dismiss(animated: true, completion: nil) + override func actionButtonAction(sender: UIView) { + guard validateInputAmount() else { return } + + checkLeftoverBalance { [weak self] canContinue in + guard canContinue, let self = self else { return } + + self.showActivityIndicator() + + Task { // TODO: Temp MOCK_DASHPAY + try? await Task.sleep(nanoseconds: 2_000_000_000) + self.hideActivityIndicator() + let dashAmount = self.model.amount.dashAmount.plainAmount + let opAmount = dashAmount / BuyCreditsModel.opCost + BuyCreditsModel.currentCredits += Double(opAmount) * 0.25 + self.dismiss(animated: true) + self.onDismissed?() + } } + } + + private func updateRate(amount: AmountObject?) { + guard let amount = amount else { return } + + let dashAmount = max(BuyCreditsModel.opCost, amount.dashAmount.plainAmount) + let opAmount = dashAmount / BuyCreditsModel.opCost + self.rateLabel.text = String.localizedStringWithFormat(NSLocalizedString("%@ ~ %lu contacts / %lu profile updates", comment: "Credits"), dashAmount.formattedDashAmount, opAmount, opAmount) + } } diff --git a/DashWallet/Sources/UI/DashPay/Menu/DWMainMenuViewController+DashPay.swift b/DashWallet/Sources/UI/DashPay/Menu/DWMainMenuViewController+DashPay.swift index c45bdb575..365c0cd10 100644 --- a/DashWallet/Sources/UI/DashPay/Menu/DWMainMenuViewController+DashPay.swift +++ b/DashWallet/Sources/UI/DashPay/Menu/DWMainMenuViewController+DashPay.swift @@ -24,14 +24,14 @@ extension DWMainMenuViewController: RootEditProfileViewControllerDelegate { controller.dismiss(animated: true, completion: nil) if MOCK_DASHPAY.boolValue { - RootEditProfileViewController.currentCredits -= 0.25 + BuyCreditsModel.currentCredits -= 0.25 let heading: String let message: String - if RootEditProfileViewController.currentCredits <= 0 { + if BuyCreditsModel.currentCredits <= 0 { heading = NSLocalizedString("Your credit balance has been fully depleted", comment: "") message = NSLocalizedString("You can continue to use DashPay for payments but you cannot update your profile or add more contacts until you top up your credit balance", comment: "") - } else if RootEditProfileViewController.currentCredits <= 0.25 { + } else if BuyCreditsModel.currentCredits <= 0.25 { heading = NSLocalizedString("Your credit balance is low", comment: "") message = NSLocalizedString("Top-up your credits to continue making changes to your profile and adding contacts", comment: "") } else { @@ -40,9 +40,10 @@ extension DWMainMenuViewController: RootEditProfileViewControllerDelegate { showModalDialog(style: .warning, icon: .system("exclamationmark.triangle.fill"), heading: heading, textBlock1: message, positiveButtonText: NSLocalizedString("Buy credits", comment: ""), positiveButtonAction: { - let vc = BuyCreditsViewController.init() + let vc = BuyCreditsViewController { + self.showToast(text: "Successful purchase", icon: .system("checkmark.circle.fill"), duration: 2) + } let navigationController = BaseNavigationController(rootViewController: vc) - navigationController.isModalInPresentation = true self.present(navigationController, animated: true) }, negativeButtonText: NSLocalizedString("Maybe later", comment: "")) } diff --git a/DashWallet/Sources/UI/DashPay/Profile/Edit Profile/RootEditProfileViewController.swift b/DashWallet/Sources/UI/DashPay/Profile/Edit Profile/RootEditProfileViewController.swift index 02df66847..c8a768a58 100644 --- a/DashWallet/Sources/UI/DashPay/Profile/Edit Profile/RootEditProfileViewController.swift +++ b/DashWallet/Sources/UI/DashPay/Profile/Edit Profile/RootEditProfileViewController.swift @@ -17,6 +17,7 @@ import UIKit +#if DASHPAY @objc(DWRootEditProfileViewControllerDelegate) protocol RootEditProfileViewControllerDelegate: AnyObject { func editProfileViewController(_ controller: RootEditProfileViewController, updateDisplayName rawDisplayName: String, aboutMe rawAboutMe: String, avatarURLString: String?) @@ -26,8 +27,6 @@ protocol RootEditProfileViewControllerDelegate: AnyObject { @objc(DWRootEditProfileViewController) class RootEditProfileViewController: DWBaseActionButtonViewController, DWEditProfileViewControllerDelegate, DWSaveAlertViewControllerDelegate, NavigationBarDisplayable { - static var currentCredits: Double = 0.5 // TODO: temp MOCK_DASHPAY - var isBackButtonHidden: Bool = false @objc @@ -110,3 +109,7 @@ class RootEditProfileViewController: DWBaseActionButtonViewController, DWEditPro child.didMove(toParent: self) } } +#else +@objc(DWRootEditProfileViewControllerDelegate) +protocol RootEditProfileViewControllerDelegate: AnyObject { } +#endif diff --git a/DashWallet/Sources/UI/Payments/Amount/BaseAmountViewController.swift b/DashWallet/Sources/UI/Payments/Amount/BaseAmountViewController.swift index 19966f356..7d69798b4 100644 --- a/DashWallet/Sources/UI/Payments/Amount/BaseAmountViewController.swift +++ b/DashWallet/Sources/UI/Payments/Amount/BaseAmountViewController.swift @@ -16,6 +16,7 @@ // import UIKit +import Combine private let kKeyboardHeight: CGFloat = 215.0 private let kDescKeyboardPadding: CGFloat = 8.0 @@ -23,6 +24,7 @@ private let kDescKeyboardPadding: CGFloat = 8.0 // MARK: - BaseAmountViewController class BaseAmountViewController: ActionButtonViewController, AmountProviding { + internal var cancellableBag = Set() public var topKeyboardView: UIView? { didSet { if let view = oldValue { @@ -53,7 +55,9 @@ class BaseAmountViewController: ActionButtonViewController, AmountProviding { internal let model: BaseAmountModel - func maxButtonAction() { } + private func maxButtonAction() { + model.selectAllFunds() + } init(model: BaseAmountModel) { self.model = model @@ -66,9 +70,13 @@ class BaseAmountViewController: ActionButtonViewController, AmountProviding { } internal func configureModel() { - model.amountChangeHandler = { [weak self] _ in - self?.amountDidChange() - } + model.$amount + .removeDuplicates() + .receive(on: DispatchQueue.main) + .sink { [weak self] amount in + self?.amountDidChange() + } + .store(in: &cancellableBag) model.errorHandler = { [weak self] error in self?.show(error: error) @@ -83,7 +91,7 @@ class BaseAmountViewController: ActionButtonViewController, AmountProviding { // NOP } - internal func amountDidChange() { + private func amountDidChange() { actionButton?.isEnabled = model.isAllowedToContinue amountView.amountInputControl.reloadData() showErrorIfNeeded() diff --git a/DashWallet/Sources/UI/Payments/Amount/Model/AmountObject.swift b/DashWallet/Sources/UI/Payments/Amount/Model/AmountObject.swift index 6c1657cff..3f5756759 100644 --- a/DashWallet/Sources/UI/Payments/Amount/Model/AmountObject.swift +++ b/DashWallet/Sources/UI/Payments/Amount/Model/AmountObject.swift @@ -19,7 +19,7 @@ import Foundation // MARK: - AmountObject -struct AmountObject { +struct AmountObject: Equatable { let amountType: AmountType let amountInternalRepresentation: String diff --git a/DashWallet/Sources/UI/Payments/Amount/Model/BaseAmountModel.swift b/DashWallet/Sources/UI/Payments/Amount/Model/BaseAmountModel.swift index b5dcb9413..edaf6c5ae 100644 --- a/DashWallet/Sources/UI/Payments/Amount/Model/BaseAmountModel.swift +++ b/DashWallet/Sources/UI/Payments/Amount/Model/BaseAmountModel.swift @@ -16,6 +16,7 @@ // import Foundation +import Combine // MARK: - AmountType @@ -49,10 +50,8 @@ class BaseAmountModel { var mainAmount: AmountObject! var supplementaryAmount: AmountObject! - var amount: AmountObject { - activeAmountType == .main ? mainAmount : supplementaryAmount - } - + @Published var amount: AmountObject! + var localCurrency: String { let locale = Locale.current as NSLocale return locale.displayName(forKey: .currencySymbol, value: localCurrencyCode)! @@ -79,7 +78,6 @@ class BaseAmountModel { } public var errorHandler: ((Error) -> Void)? - public var amountChangeHandler: ((AmountObject) -> Void)? public var presentCurrencyPickerHandler: (() -> Void)? public var inputsSwappedHandler: ((AmountType) -> Void)? public var amountInputItemsChangeHandler: (() -> Void)? @@ -139,7 +137,7 @@ class BaseAmountModel { } func select(inputItem: AmountInputItem) { - let currentAmount = amount + let currentAmount = amount! currentInputItem = inputItem @@ -228,13 +226,14 @@ class BaseAmountModel { updateAmountObjects(with: amount) } - internal func amountDidChange() { + internal final func amountDidChange() { + amount = activeAmountType == .main ? mainAmount : supplementaryAmount error = nil checkAmountForErrors() - amountChangeHandler?(amount) } internal func checkAmountForErrors() { } + internal func selectAllFunds() { } } extension BaseAmountModel { diff --git a/DashWallet/Sources/UI/Payments/Amount/Model/Send/SendAmountModel.swift b/DashWallet/Sources/UI/Payments/Amount/Model/Send/SendAmountModel.swift index 799242bce..2d38cb5e3 100644 --- a/DashWallet/Sources/UI/Payments/Amount/Model/Send/SendAmountModel.swift +++ b/DashWallet/Sources/UI/Payments/Amount/Model/Send/SendAmountModel.swift @@ -67,7 +67,7 @@ class SendAmountModel: BaseAmountModel { checkAmountForErrors() } - func selectAllFunds() { + override func selectAllFunds() { auth { [weak self] isAuthenticated in if isAuthenticated { self?.selectAllFundsWithoutAuth() diff --git a/DashWallet/Sources/UI/Payments/Amount/SendAmountViewController.swift b/DashWallet/Sources/UI/Payments/Amount/SendAmountViewController.swift index 34310b23b..1b091cd46 100644 --- a/DashWallet/Sources/UI/Payments/Amount/SendAmountViewController.swift +++ b/DashWallet/Sources/UI/Payments/Amount/SendAmountViewController.swift @@ -41,10 +41,6 @@ class SendAmountViewController: BaseAmountViewController { fatalError("init(coder:) has not been implemented") } - override func maxButtonAction() { - sendAmountModel.selectAllFunds() - } - internal func checkLeftoverBalance(isCrowdNodeTransfer: Bool = false, completion: @escaping ((Bool) -> Void)) { if CrowdNodeDefaults.shared.lastKnownBalance <= 0 && !isCrowdNodeTransfer { // If CrowdNode balance is 0, then there is no need to check the leftover balance diff --git a/DashWallet/Sources/UI/SwiftUI Components/Color+DWStyle.swift b/DashWallet/Sources/UI/SwiftUI Components/Color+DWStyle.swift index c424f8a2a..7e7975dea 100644 --- a/DashWallet/Sources/UI/SwiftUI Components/Color+DWStyle.swift +++ b/DashWallet/Sources/UI/SwiftUI Components/Color+DWStyle.swift @@ -50,6 +50,10 @@ extension Color { Color("Gray300") } + static var gray500: Color { + Color("Gray500") + } + // Background and secondary background are mismatched in the assests. // The correct values per the design: // Primary background: #F7F7F7 diff --git a/DashWallet/Sources/UI/SwiftUI Components/DashAmount.swift b/DashWallet/Sources/UI/SwiftUI Components/DashAmount.swift index 1139d9121..0747a99ac 100644 --- a/DashWallet/Sources/UI/SwiftUI Components/DashAmount.swift +++ b/DashWallet/Sources/UI/SwiftUI Components/DashAmount.swift @@ -21,13 +21,13 @@ struct DashAmount: View { var amount: Int64 var font: Font = .footnote var dashSymbolFactor: CGFloat = 1 + var showDirection = true var body: some View { if amount == Int64.max || amount == Int64.min { Text(NSLocalizedString("Not available", comment: "")) - .font(.footnote) + .font(font) .fontWeight(.medium) - .foregroundColor(.primaryText) } else { let formattedAbsAmount = abs(amount).formattedDashAmount let dashSymbolLast = formattedAbsAmount.first!.isNumber @@ -35,8 +35,11 @@ struct DashAmount: View { let cleanedAbsAmount = cleanAmount(formattedAbsAmount) HStack(spacing: 0) { - Text(directionSymbol) - .fontWeight(.medium) + if showDirection { + Text(directionSymbol) + .font(font) + .fontWeight(.medium) + } if !dashSymbolLast { DashSymbol() @@ -44,6 +47,7 @@ struct DashAmount: View { } Text(cleanedAbsAmount) + .font(font) .fontWeight(.medium) .lineLimit(1) .padding(.leading, 2) @@ -52,8 +56,6 @@ struct DashAmount: View { DashSymbol() } } - .font(font) - .foregroundColor(.primaryText) } } diff --git a/DashWallet/Sources/UI/SwiftUI Components/SendIntro.swift b/DashWallet/Sources/UI/SwiftUI Components/SendIntro.swift index 7a0bd97ec..5a3866f9c 100644 --- a/DashWallet/Sources/UI/SwiftUI Components/SendIntro.swift +++ b/DashWallet/Sources/UI/SwiftUI Components/SendIntro.swift @@ -20,38 +20,69 @@ import SwiftUI struct SendIntro: View { var title: String var destination: String? = nil - var balance: Double = 0.00 - var usdEquivalent: Double = 0.00 + var dashBalance: Int64? = nil + var balanceLabel: String? = nil + @State var balanceHidden: Bool = true var body: some View { - VStack(alignment: .leading, spacing: 10) { + VStack(alignment: .leading, spacing: 0) { Text(title) - .font(.title) + .font(.largeTitle) .fontWeight(.bold) if let destination = destination { - Text("to \(destination)") - .font(.subheadline) - .foregroundColor(.secondary) + HStack(spacing: 2) { + Text(NSLocalizedString("to", comment: "Send Screen: to address")) + Text(destination) + .font(.subheadline) + .padding(.leading, 4) + } + .padding(.top, 4) + .padding(.bottom, 2) } - HStack { - Text("Balance: \(String(format: "%.2f", balance)) ") - .font(.body) - + Text(Image(systemName: "bitcoinsign.circle")) - + Text(" ~ \(String(format: "%.2f", usdEquivalent)) US$") - .font(.body) - - Button(action: { - // Action for the eye button - }) { - Image(systemName: "eye.fill") - .foregroundColor(.gray) - .padding(5) - .background(Circle().fill(Color.gray.opacity(0.2))) + if let dashBalance = dashBalance { + HStack(spacing: 4) { + if let balanceLabel = balanceLabel { + Text(balanceLabel).font(.subheadline) + } else { + Text(NSLocalizedString("Balance", comment: "Send Screen: to address") + ":").font(.subheadline) + } + + if balanceHidden { + Text("***********").font(.subheadline) + } else { + DashAmount(amount: dashBalance, font: .subheadline, showDirection: false) + Text("~").font(.subheadline) + FormattedFiatText(from: dashBalance) + } + + Button(action: { + balanceHidden.toggle() + }) { + Image(systemName: balanceHidden ? "eye.slash.fill" : "eye.fill") + .resizable() + .scaledToFit() + .imageScale(.medium) + .frame(width: 17, height: 17) + .frame(width: 28, height: 28) + .foregroundColor(.gray500) + .background(Color.primaryText.opacity(0.05)) + .clipShape(Circle()) + } + .frame(width: 36, height: 36) } + .foregroundColor(.secondaryText) } - } - .padding() + }.frame(maxWidth: .infinity, alignment: .leading) + } + + @ViewBuilder + private func FormattedFiatText(from dashAmount: Int64) -> some View { + let text = (try? CurrencyExchanger.shared.convertDash(amount: abs(dashAmount.dashAmount), to: App.fiatCurrency).formattedFiatAmount) ?? NSLocalizedString("Not available", comment: "") + + Text(text) + .font(.subheadline) + .foregroundColor(.secondaryText) } } diff --git a/DashWallet/Sources/UI/SwiftUI Components/Toast.swift b/DashWallet/Sources/UI/SwiftUI Components/Toast.swift index 1eb0fff47..96b049634 100644 --- a/DashWallet/Sources/UI/SwiftUI Components/Toast.swift +++ b/DashWallet/Sources/UI/SwiftUI Components/Toast.swift @@ -129,8 +129,10 @@ extension UIViewController { view.addSubview(toastView) NSLayoutConstraint.activate([ - toastView.leadingAnchor.constraint(equalTo: view.leadingAnchor, constant: 20), - toastView.trailingAnchor.constraint(equalTo: view.trailingAnchor, constant: -20), + toastView.centerXAnchor.constraint(equalTo: view.centerXAnchor), + toastView.leadingAnchor.constraint(greaterThanOrEqualTo: view.leadingAnchor, constant: 10).withPriority(.defaultHigh), + view.trailingAnchor.constraint(greaterThanOrEqualTo: toastView.trailingAnchor, constant: 10).withPriority(.defaultHigh), + toastView.widthAnchor.constraint(lessThanOrEqualTo: view.widthAnchor, constant: -20), toastView.bottomAnchor.constraint(equalTo: view.safeAreaLayoutGuide.bottomAnchor, constant: -10) ]) diff --git a/DashWallet/Sources/UI/Uphold/Transfer/Model/UpholdAmountModel.swift b/DashWallet/Sources/UI/Uphold/Transfer/Model/UpholdAmountModel.swift index 53fc73c11..a51fcf089 100644 --- a/DashWallet/Sources/UI/Uphold/Transfer/Model/UpholdAmountModel.swift +++ b/DashWallet/Sources/UI/Uphold/Transfer/Model/UpholdAmountModel.swift @@ -54,7 +54,7 @@ final class UpholdAmountModel: BaseAmountModel { self.card = card } - func selectAllFunds() { + override func selectAllFunds() { let allAvailableFunds = card.available.plainDashAmount if allAvailableFunds > 0 { diff --git a/DashWallet/Sources/UI/Uphold/Transfer/UpholdTransferViewController.swift b/DashWallet/Sources/UI/Uphold/Transfer/UpholdTransferViewController.swift index 2509e6542..7911b3b32 100644 --- a/DashWallet/Sources/UI/Uphold/Transfer/UpholdTransferViewController.swift +++ b/DashWallet/Sources/UI/Uphold/Transfer/UpholdTransferViewController.swift @@ -122,10 +122,6 @@ final class UpholdTransferViewController: BaseAmountViewController { ]) } - override func maxButtonAction() { - upholdAmountModel.selectAllFunds() - } - override func actionButtonAction(sender: UIView) { upholdAmountModel.createTransaction(with: nil) } diff --git a/DashWallet/Sources/UI/Views/UIColor+DWStyle.h b/DashWallet/Sources/UI/Views/UIColor+DWStyle.h index f924c8c55..e5290bf6f 100644 --- a/DashWallet/Sources/UI/Views/UIColor+DWStyle.h +++ b/DashWallet/Sources/UI/Views/UIColor+DWStyle.h @@ -78,6 +78,8 @@ NS_ASSUME_NONNULL_BEGIN + (UIColor *)dw_buttonBlackTitleColor; + (UIColor *)dw_grayButtonColor; + ++ (UIColor *)dw_gray300Color; @end NS_ASSUME_NONNULL_END diff --git a/DashWallet/Sources/UI/Views/UIColor+DWStyle.m b/DashWallet/Sources/UI/Views/UIColor+DWStyle.m index 01717eea7..71ec3fb8d 100644 --- a/DashWallet/Sources/UI/Views/UIColor+DWStyle.m +++ b/DashWallet/Sources/UI/Views/UIColor+DWStyle.m @@ -249,6 +249,12 @@ + (UIColor *)dw_grayButtonColor { return color; } ++ (UIColor *)dw_gray300Color { + UIColor *color = [UIColor colorNamed:@"Gray300"]; + NSParameterAssert(color); + return color; +} + @end NS_ASSUME_NONNULL_END diff --git a/DashWallet/ar.lproj/Localizable.strings b/DashWallet/ar.lproj/Localizable.strings index 4449c8b33..4e8872962 100644 --- a/DashWallet/ar.lproj/Localizable.strings +++ b/DashWallet/ar.lproj/Localizable.strings @@ -323,6 +323,9 @@ /* Dash Service Overview */ "Buy and convert Dash with another crypto" = "قم بشراء وتحويل داش بعملات مشفرة أخرى"; +/* No comment provided by engineer. */ +"Buy credits" = "Buy credits"; + /* No comment provided by engineer. */ "Buy Dash" = "شراء داش "; @@ -587,6 +590,9 @@ /* CrowdNode */ "Dash address designated for your CrowdNode account in the Dash Wallet on this device " = "Dash address designated for your CrowdNode account in the Dash Wallet on this device "; +/* No comment provided by engineer. */ +"Dash balance" = "Dash balance"; + /* Coinbase Entry Point */ "Dash balance on Coinbase" = "رصيد داش على كوين بيس"; @@ -2223,6 +2229,9 @@ /* No comment provided by engineer. */ "Tools" = "ادوات"; +/* No comment provided by engineer. */ +"Top-up your credits to continue making changes to your profile and adding contacts" = "Top-up your credits to continue making changes to your profile and adding contacts"; + /* Dash Portal */ "Topper" = "Topper"; @@ -2607,6 +2616,9 @@ /* CrowdNode */ "You can change how / when your reward earnings are paid to you." = "يمكنك تغيير كيفية / وقت دفع أرباح المكافآت لك."; +/* No comment provided by engineer. */ +"You can continue to use DashPay for payments but you cannot update your profile or add more contacts until you top up your credit balance" = "You can continue to use DashPay for payments but you cannot update your profile or add more contacts until you top up your credit balance"; + /* No comment provided by engineer. */ "You can create a different username without paying again" = "You can create a different username without paying again"; @@ -2700,6 +2712,12 @@ /* CrowdNode */ "You will receive fractional payments automatically and they will by default be reinvested, however, it is also easy to set up automatic withdrawals to receive recurring payouts." = "ستتلقى مدفوعات جزئية تلقائيًا وسيتم إعادة استثمارها افتراضيًا ، ومع ذلك ، من السهل أيضًا إعداد عمليات سحب تلقائية لتلقي دفعات متكررة."; +/* No comment provided by engineer. */ +"Your credit balance has been fully depleted" = "Your credit balance has been fully depleted"; + +/* No comment provided by engineer. */ +"Your credit balance is low" = "Your credit balance is low"; + /* CrowdNode */ "Your CrowdNode account is creating…" = "حساب CrowdNode الخاص بك قيد الإنشاء ..."; diff --git a/DashWallet/bg.lproj/Localizable.strings b/DashWallet/bg.lproj/Localizable.strings index 245d300fe..9840833b8 100644 --- a/DashWallet/bg.lproj/Localizable.strings +++ b/DashWallet/bg.lproj/Localizable.strings @@ -323,6 +323,9 @@ /* Dash Service Overview */ "Buy and convert Dash with another crypto" = "Buy and convert Dash with another crypto"; +/* No comment provided by engineer. */ +"Buy credits" = "Buy credits"; + /* No comment provided by engineer. */ "Buy Dash" = "Купи Dash"; @@ -587,6 +590,9 @@ /* CrowdNode */ "Dash address designated for your CrowdNode account in the Dash Wallet on this device " = "Dash address designated for your CrowdNode account in the Dash Wallet on this device "; +/* No comment provided by engineer. */ +"Dash balance" = "Dash balance"; + /* Coinbase Entry Point */ "Dash balance on Coinbase" = "Dash balance on Coinbase"; @@ -2223,6 +2229,9 @@ /* No comment provided by engineer. */ "Tools" = "Инструменти"; +/* No comment provided by engineer. */ +"Top-up your credits to continue making changes to your profile and adding contacts" = "Top-up your credits to continue making changes to your profile and adding contacts"; + /* Dash Portal */ "Topper" = "Topper"; @@ -2607,6 +2616,9 @@ /* CrowdNode */ "You can change how / when your reward earnings are paid to you." = "You can change how / when your reward earnings are paid to you."; +/* No comment provided by engineer. */ +"You can continue to use DashPay for payments but you cannot update your profile or add more contacts until you top up your credit balance" = "You can continue to use DashPay for payments but you cannot update your profile or add more contacts until you top up your credit balance"; + /* No comment provided by engineer. */ "You can create a different username without paying again" = "You can create a different username without paying again"; @@ -2700,6 +2712,12 @@ /* CrowdNode */ "You will receive fractional payments automatically and they will by default be reinvested, however, it is also easy to set up automatic withdrawals to receive recurring payouts." = "You will receive fractional payments automatically and they will by default be reinvested, however, it is also easy to set up automatic withdrawals to receive recurring payouts."; +/* No comment provided by engineer. */ +"Your credit balance has been fully depleted" = "Your credit balance has been fully depleted"; + +/* No comment provided by engineer. */ +"Your credit balance is low" = "Your credit balance is low"; + /* CrowdNode */ "Your CrowdNode account is creating…" = "Your CrowdNode account is creating…"; diff --git a/DashWallet/ca.lproj/Localizable.strings b/DashWallet/ca.lproj/Localizable.strings index fa68a5449..ab9d8b963 100644 --- a/DashWallet/ca.lproj/Localizable.strings +++ b/DashWallet/ca.lproj/Localizable.strings @@ -323,6 +323,9 @@ /* Dash Service Overview */ "Buy and convert Dash with another crypto" = "Buy and convert Dash with another crypto"; +/* No comment provided by engineer. */ +"Buy credits" = "Buy credits"; + /* No comment provided by engineer. */ "Buy Dash" = "Buy Dash"; @@ -587,6 +590,9 @@ /* CrowdNode */ "Dash address designated for your CrowdNode account in the Dash Wallet on this device " = "Dash address designated for your CrowdNode account in the Dash Wallet on this device "; +/* No comment provided by engineer. */ +"Dash balance" = "Dash balance"; + /* Coinbase Entry Point */ "Dash balance on Coinbase" = "Dash balance on Coinbase"; @@ -2223,6 +2229,9 @@ /* No comment provided by engineer. */ "Tools" = "Tools"; +/* No comment provided by engineer. */ +"Top-up your credits to continue making changes to your profile and adding contacts" = "Top-up your credits to continue making changes to your profile and adding contacts"; + /* Dash Portal */ "Topper" = "Topper"; @@ -2607,6 +2616,9 @@ /* CrowdNode */ "You can change how / when your reward earnings are paid to you." = "You can change how / when your reward earnings are paid to you."; +/* No comment provided by engineer. */ +"You can continue to use DashPay for payments but you cannot update your profile or add more contacts until you top up your credit balance" = "You can continue to use DashPay for payments but you cannot update your profile or add more contacts until you top up your credit balance"; + /* No comment provided by engineer. */ "You can create a different username without paying again" = "You can create a different username without paying again"; @@ -2700,6 +2712,12 @@ /* CrowdNode */ "You will receive fractional payments automatically and they will by default be reinvested, however, it is also easy to set up automatic withdrawals to receive recurring payouts." = "You will receive fractional payments automatically and they will by default be reinvested, however, it is also easy to set up automatic withdrawals to receive recurring payouts."; +/* No comment provided by engineer. */ +"Your credit balance has been fully depleted" = "Your credit balance has been fully depleted"; + +/* No comment provided by engineer. */ +"Your credit balance is low" = "Your credit balance is low"; + /* CrowdNode */ "Your CrowdNode account is creating…" = "Your CrowdNode account is creating…"; diff --git a/DashWallet/cs.lproj/Localizable.strings b/DashWallet/cs.lproj/Localizable.strings index a0f43d547..1032c6a74 100644 --- a/DashWallet/cs.lproj/Localizable.strings +++ b/DashWallet/cs.lproj/Localizable.strings @@ -323,6 +323,9 @@ /* Dash Service Overview */ "Buy and convert Dash with another crypto" = "Buy and convert Dash with another crypto"; +/* No comment provided by engineer. */ +"Buy credits" = "Buy credits"; + /* No comment provided by engineer. */ "Buy Dash" = "Koupit Dash"; @@ -587,6 +590,9 @@ /* CrowdNode */ "Dash address designated for your CrowdNode account in the Dash Wallet on this device " = "Dash address designated for your CrowdNode account in the Dash Wallet on this device "; +/* No comment provided by engineer. */ +"Dash balance" = "Dash balance"; + /* Coinbase Entry Point */ "Dash balance on Coinbase" = "Dash balance on Coinbase"; @@ -2223,6 +2229,9 @@ /* No comment provided by engineer. */ "Tools" = "Nástroje"; +/* No comment provided by engineer. */ +"Top-up your credits to continue making changes to your profile and adding contacts" = "Top-up your credits to continue making changes to your profile and adding contacts"; + /* Dash Portal */ "Topper" = "Topper"; @@ -2607,6 +2616,9 @@ /* CrowdNode */ "You can change how / when your reward earnings are paid to you." = "You can change how / when your reward earnings are paid to you."; +/* No comment provided by engineer. */ +"You can continue to use DashPay for payments but you cannot update your profile or add more contacts until you top up your credit balance" = "You can continue to use DashPay for payments but you cannot update your profile or add more contacts until you top up your credit balance"; + /* No comment provided by engineer. */ "You can create a different username without paying again" = "You can create a different username without paying again"; @@ -2700,6 +2712,12 @@ /* CrowdNode */ "You will receive fractional payments automatically and they will by default be reinvested, however, it is also easy to set up automatic withdrawals to receive recurring payouts." = "You will receive fractional payments automatically and they will by default be reinvested, however, it is also easy to set up automatic withdrawals to receive recurring payouts."; +/* No comment provided by engineer. */ +"Your credit balance has been fully depleted" = "Your credit balance has been fully depleted"; + +/* No comment provided by engineer. */ +"Your credit balance is low" = "Your credit balance is low"; + /* CrowdNode */ "Your CrowdNode account is creating…" = "Your CrowdNode account is creating…"; diff --git a/DashWallet/da.lproj/Localizable.strings b/DashWallet/da.lproj/Localizable.strings index 8099423f1..b3f021563 100644 --- a/DashWallet/da.lproj/Localizable.strings +++ b/DashWallet/da.lproj/Localizable.strings @@ -323,6 +323,9 @@ /* Dash Service Overview */ "Buy and convert Dash with another crypto" = "Buy and convert Dash with another crypto"; +/* No comment provided by engineer. */ +"Buy credits" = "Buy credits"; + /* No comment provided by engineer. */ "Buy Dash" = "Buy Dash"; @@ -587,6 +590,9 @@ /* CrowdNode */ "Dash address designated for your CrowdNode account in the Dash Wallet on this device " = "Dash address designated for your CrowdNode account in the Dash Wallet on this device "; +/* No comment provided by engineer. */ +"Dash balance" = "Dash balance"; + /* Coinbase Entry Point */ "Dash balance on Coinbase" = "Dash balance on Coinbase"; @@ -2223,6 +2229,9 @@ /* No comment provided by engineer. */ "Tools" = "Tools"; +/* No comment provided by engineer. */ +"Top-up your credits to continue making changes to your profile and adding contacts" = "Top-up your credits to continue making changes to your profile and adding contacts"; + /* Dash Portal */ "Topper" = "Topper"; @@ -2607,6 +2616,9 @@ /* CrowdNode */ "You can change how / when your reward earnings are paid to you." = "You can change how / when your reward earnings are paid to you."; +/* No comment provided by engineer. */ +"You can continue to use DashPay for payments but you cannot update your profile or add more contacts until you top up your credit balance" = "You can continue to use DashPay for payments but you cannot update your profile or add more contacts until you top up your credit balance"; + /* No comment provided by engineer. */ "You can create a different username without paying again" = "You can create a different username without paying again"; @@ -2700,6 +2712,12 @@ /* CrowdNode */ "You will receive fractional payments automatically and they will by default be reinvested, however, it is also easy to set up automatic withdrawals to receive recurring payouts." = "You will receive fractional payments automatically and they will by default be reinvested, however, it is also easy to set up automatic withdrawals to receive recurring payouts."; +/* No comment provided by engineer. */ +"Your credit balance has been fully depleted" = "Your credit balance has been fully depleted"; + +/* No comment provided by engineer. */ +"Your credit balance is low" = "Your credit balance is low"; + /* CrowdNode */ "Your CrowdNode account is creating…" = "Your CrowdNode account is creating…"; diff --git a/DashWallet/de.lproj/Localizable.strings b/DashWallet/de.lproj/Localizable.strings index 16914187a..58e5faf44 100644 --- a/DashWallet/de.lproj/Localizable.strings +++ b/DashWallet/de.lproj/Localizable.strings @@ -323,6 +323,9 @@ /* Dash Service Overview */ "Buy and convert Dash with another crypto" = "Kaufe und konvertiere Dash in eine andere Kryptowährung"; +/* No comment provided by engineer. */ +"Buy credits" = "Buy credits"; + /* No comment provided by engineer. */ "Buy Dash" = "Dash kaufen"; @@ -587,6 +590,9 @@ /* CrowdNode */ "Dash address designated for your CrowdNode account in the Dash Wallet on this device " = "Dash Adresse, die für dein CrowdNode Konto in der Dash Wallet auf diesem Gerät bestimmt ist."; +/* No comment provided by engineer. */ +"Dash balance" = "Dash balance"; + /* Coinbase Entry Point */ "Dash balance on Coinbase" = "Dash Guthaben auf Coinbase"; @@ -2223,6 +2229,9 @@ /* No comment provided by engineer. */ "Tools" = "Werkzeuge"; +/* No comment provided by engineer. */ +"Top-up your credits to continue making changes to your profile and adding contacts" = "Top-up your credits to continue making changes to your profile and adding contacts"; + /* Dash Portal */ "Topper" = "Topper"; @@ -2607,6 +2616,9 @@ /* CrowdNode */ "You can change how / when your reward earnings are paid to you." = "Du kannst ändern, wann und wie die Auszahlungen deiner Rewards vorgenommen werden."; +/* No comment provided by engineer. */ +"You can continue to use DashPay for payments but you cannot update your profile or add more contacts until you top up your credit balance" = "You can continue to use DashPay for payments but you cannot update your profile or add more contacts until you top up your credit balance"; + /* No comment provided by engineer. */ "You can create a different username without paying again" = "Du kannst einen neuen Nutzernamen erstellen, ohne erneut zu zahlen."; @@ -2700,6 +2712,12 @@ /* CrowdNode */ "You will receive fractional payments automatically and they will by default be reinvested, however, it is also easy to set up automatic withdrawals to receive recurring payouts." = "Du erhältst automatisch Teilzahlungen, die standardmäßig reinvestiert werden. Du kannst jedoch auch automatische Entnahme einrichten, um wiederkehrende Auszahlungen zu erhalten."; +/* No comment provided by engineer. */ +"Your credit balance has been fully depleted" = "Your credit balance has been fully depleted"; + +/* No comment provided by engineer. */ +"Your credit balance is low" = "Your credit balance is low"; + /* CrowdNode */ "Your CrowdNode account is creating…" = "Dein CrowdNode Konto wird erstellt..."; diff --git a/DashWallet/el.lproj/Localizable.strings b/DashWallet/el.lproj/Localizable.strings index 7c7749b8d..126ed31e1 100644 --- a/DashWallet/el.lproj/Localizable.strings +++ b/DashWallet/el.lproj/Localizable.strings @@ -323,6 +323,9 @@ /* Dash Service Overview */ "Buy and convert Dash with another crypto" = "Αγοράστε και μετατρέψτε τα Dash σε άλλο κρυπτονόμισμα"; +/* No comment provided by engineer. */ +"Buy credits" = "Buy credits"; + /* No comment provided by engineer. */ "Buy Dash" = "Αγορά Dash"; @@ -587,6 +590,9 @@ /* CrowdNode */ "Dash address designated for your CrowdNode account in the Dash Wallet on this device " = "Διεύθυνση Dash που έχει οριστεί για το λογαριασμό σας στο CrowdNode στο πορτοφόλι Dash σε αυτή τη συσκευή"; +/* No comment provided by engineer. */ +"Dash balance" = "Dash balance"; + /* Coinbase Entry Point */ "Dash balance on Coinbase" = "Υπόλοιπο Dash στην Coinbase"; @@ -2223,6 +2229,9 @@ /* No comment provided by engineer. */ "Tools" = "Εργαλεία"; +/* No comment provided by engineer. */ +"Top-up your credits to continue making changes to your profile and adding contacts" = "Top-up your credits to continue making changes to your profile and adding contacts"; + /* Dash Portal */ "Topper" = "Topper"; @@ -2607,6 +2616,9 @@ /* CrowdNode */ "You can change how / when your reward earnings are paid to you." = "Μπορείτε να αλλάξετε τον τρόπο και τον χρόνο καταβολής των κερδών της ανταμοιβής σας."; +/* No comment provided by engineer. */ +"You can continue to use DashPay for payments but you cannot update your profile or add more contacts until you top up your credit balance" = "You can continue to use DashPay for payments but you cannot update your profile or add more contacts until you top up your credit balance"; + /* No comment provided by engineer. */ "You can create a different username without paying again" = "Μπορείτε να δημιουργήσετε ένα διαφορετικό όνομα χρήστη χωρίς να πληρώσετε ξανά"; @@ -2700,6 +2712,12 @@ /* CrowdNode */ "You will receive fractional payments automatically and they will by default be reinvested, however, it is also easy to set up automatic withdrawals to receive recurring payouts." = "Θα λαμβάνετε αυτόματα αποσπασματικές πληρωμές και θα επανεπενδύονται εξ ορισμού, ωστόσο, είναι επίσης εύκολο να ρυθμίσετε αυτόματες αναλήψεις για να λαμβάνετε επαναλαμβανόμενες πληρωμές."; +/* No comment provided by engineer. */ +"Your credit balance has been fully depleted" = "Your credit balance has been fully depleted"; + +/* No comment provided by engineer. */ +"Your credit balance is low" = "Your credit balance is low"; + /* CrowdNode */ "Your CrowdNode account is creating…" = "Ο λογαριασμός σας στο CrowdNode δημιουργείται..."; diff --git a/DashWallet/en.lproj/Localizable.strings b/DashWallet/en.lproj/Localizable.strings index e0c8a635c..d33c62944 100644 --- a/DashWallet/en.lproj/Localizable.strings +++ b/DashWallet/en.lproj/Localizable.strings @@ -323,6 +323,9 @@ /* Dash Service Overview */ "Buy and convert Dash with another crypto" = "Buy and convert Dash with another crypto"; +/* No comment provided by engineer. */ +"Buy credits" = "Buy credits"; + /* No comment provided by engineer. */ "Buy Dash" = "Buy Dash"; @@ -587,6 +590,9 @@ /* CrowdNode */ "Dash address designated for your CrowdNode account in the Dash Wallet on this device " = "Dash address designated for your CrowdNode account in the Dash Wallet on this device "; +/* No comment provided by engineer. */ +"Dash balance" = "Dash balance"; + /* Coinbase Entry Point */ "Dash balance on Coinbase" = "Dash balance on Coinbase"; @@ -2223,6 +2229,9 @@ /* No comment provided by engineer. */ "Tools" = "Tools"; +/* No comment provided by engineer. */ +"Top-up your credits to continue making changes to your profile and adding contacts" = "Top-up your credits to continue making changes to your profile and adding contacts"; + /* Dash Portal */ "Topper" = "Topper"; @@ -2607,6 +2616,9 @@ /* CrowdNode */ "You can change how / when your reward earnings are paid to you." = "You can change how / when your reward earnings are paid to you."; +/* No comment provided by engineer. */ +"You can continue to use DashPay for payments but you cannot update your profile or add more contacts until you top up your credit balance" = "You can continue to use DashPay for payments but you cannot update your profile or add more contacts until you top up your credit balance"; + /* No comment provided by engineer. */ "You can create a different username without paying again" = "You can create a different username without paying again"; @@ -2700,6 +2712,12 @@ /* CrowdNode */ "You will receive fractional payments automatically and they will by default be reinvested, however, it is also easy to set up automatic withdrawals to receive recurring payouts." = "You will receive fractional payments automatically and they will by default be reinvested, however, it is also easy to set up automatic withdrawals to receive recurring payouts."; +/* No comment provided by engineer. */ +"Your credit balance has been fully depleted" = "Your credit balance has been fully depleted"; + +/* No comment provided by engineer. */ +"Your credit balance is low" = "Your credit balance is low"; + /* CrowdNode */ "Your CrowdNode account is creating…" = "Your CrowdNode account is creating…"; diff --git a/DashWallet/eo.lproj/Localizable.strings b/DashWallet/eo.lproj/Localizable.strings index ff0ac27ad..58a81c7ad 100644 --- a/DashWallet/eo.lproj/Localizable.strings +++ b/DashWallet/eo.lproj/Localizable.strings @@ -323,6 +323,9 @@ /* Dash Service Overview */ "Buy and convert Dash with another crypto" = "Buy and convert Dash with another crypto"; +/* No comment provided by engineer. */ +"Buy credits" = "Buy credits"; + /* No comment provided by engineer. */ "Buy Dash" = "Buy Dash"; @@ -587,6 +590,9 @@ /* CrowdNode */ "Dash address designated for your CrowdNode account in the Dash Wallet on this device " = "Dash address designated for your CrowdNode account in the Dash Wallet on this device "; +/* No comment provided by engineer. */ +"Dash balance" = "Dash balance"; + /* Coinbase Entry Point */ "Dash balance on Coinbase" = "Dash balance on Coinbase"; @@ -2223,6 +2229,9 @@ /* No comment provided by engineer. */ "Tools" = "Tools"; +/* No comment provided by engineer. */ +"Top-up your credits to continue making changes to your profile and adding contacts" = "Top-up your credits to continue making changes to your profile and adding contacts"; + /* Dash Portal */ "Topper" = "Topper"; @@ -2607,6 +2616,9 @@ /* CrowdNode */ "You can change how / when your reward earnings are paid to you." = "You can change how / when your reward earnings are paid to you."; +/* No comment provided by engineer. */ +"You can continue to use DashPay for payments but you cannot update your profile or add more contacts until you top up your credit balance" = "You can continue to use DashPay for payments but you cannot update your profile or add more contacts until you top up your credit balance"; + /* No comment provided by engineer. */ "You can create a different username without paying again" = "You can create a different username without paying again"; @@ -2700,6 +2712,12 @@ /* CrowdNode */ "You will receive fractional payments automatically and they will by default be reinvested, however, it is also easy to set up automatic withdrawals to receive recurring payouts." = "You will receive fractional payments automatically and they will by default be reinvested, however, it is also easy to set up automatic withdrawals to receive recurring payouts."; +/* No comment provided by engineer. */ +"Your credit balance has been fully depleted" = "Your credit balance has been fully depleted"; + +/* No comment provided by engineer. */ +"Your credit balance is low" = "Your credit balance is low"; + /* CrowdNode */ "Your CrowdNode account is creating…" = "Your CrowdNode account is creating…"; diff --git a/DashWallet/es.lproj/Localizable.strings b/DashWallet/es.lproj/Localizable.strings index 15987bca5..51ba0b6fc 100644 --- a/DashWallet/es.lproj/Localizable.strings +++ b/DashWallet/es.lproj/Localizable.strings @@ -323,6 +323,9 @@ /* Dash Service Overview */ "Buy and convert Dash with another crypto" = "Compra y convierte Dash con otra criptomoneda"; +/* No comment provided by engineer. */ +"Buy credits" = "Buy credits"; + /* No comment provided by engineer. */ "Buy Dash" = "Comprar Dash"; @@ -587,6 +590,9 @@ /* CrowdNode */ "Dash address designated for your CrowdNode account in the Dash Wallet on this device " = "Dirección de Dash designada para tu cuenta de CrowdNode en la billetera de Dash en este dispositivo"; +/* No comment provided by engineer. */ +"Dash balance" = "Dash balance"; + /* Coinbase Entry Point */ "Dash balance on Coinbase" = "Saldo de Dash en Coinbase"; @@ -2223,6 +2229,9 @@ /* No comment provided by engineer. */ "Tools" = "Herramientas"; +/* No comment provided by engineer. */ +"Top-up your credits to continue making changes to your profile and adding contacts" = "Top-up your credits to continue making changes to your profile and adding contacts"; + /* Dash Portal */ "Topper" = "Topper"; @@ -2607,6 +2616,9 @@ /* CrowdNode */ "You can change how / when your reward earnings are paid to you." = "Puedes cambiar cómo / cuándo se te pagan las ganancias de tus recompensas."; +/* No comment provided by engineer. */ +"You can continue to use DashPay for payments but you cannot update your profile or add more contacts until you top up your credit balance" = "You can continue to use DashPay for payments but you cannot update your profile or add more contacts until you top up your credit balance"; + /* No comment provided by engineer. */ "You can create a different username without paying again" = "Puedes crear un nombre de usuario diferente sin pagar nuevamente"; @@ -2700,6 +2712,12 @@ /* CrowdNode */ "You will receive fractional payments automatically and they will by default be reinvested, however, it is also easy to set up automatic withdrawals to receive recurring payouts." = "Recibirás pagos fraccionados automáticamente y se reinvertirán de manera predeterminada; sin embargo, también es fácil configurar retiros automáticos para recibir pagos recurrentes."; +/* No comment provided by engineer. */ +"Your credit balance has been fully depleted" = "Your credit balance has been fully depleted"; + +/* No comment provided by engineer. */ +"Your credit balance is low" = "Your credit balance is low"; + /* CrowdNode */ "Your CrowdNode account is creating…" = "Tu cuenta de CrowdNode está creando..."; diff --git a/DashWallet/et.lproj/Localizable.strings b/DashWallet/et.lproj/Localizable.strings index 3a1e99316..ea2bea76e 100644 --- a/DashWallet/et.lproj/Localizable.strings +++ b/DashWallet/et.lproj/Localizable.strings @@ -323,6 +323,9 @@ /* Dash Service Overview */ "Buy and convert Dash with another crypto" = "Buy and convert Dash with another crypto"; +/* No comment provided by engineer. */ +"Buy credits" = "Buy credits"; + /* No comment provided by engineer. */ "Buy Dash" = "Osta Dashi"; @@ -587,6 +590,9 @@ /* CrowdNode */ "Dash address designated for your CrowdNode account in the Dash Wallet on this device " = "Dash address designated for your CrowdNode account in the Dash Wallet on this device "; +/* No comment provided by engineer. */ +"Dash balance" = "Dash balance"; + /* Coinbase Entry Point */ "Dash balance on Coinbase" = "Dash balance on Coinbase"; @@ -2223,6 +2229,9 @@ /* No comment provided by engineer. */ "Tools" = "Tools"; +/* No comment provided by engineer. */ +"Top-up your credits to continue making changes to your profile and adding contacts" = "Top-up your credits to continue making changes to your profile and adding contacts"; + /* Dash Portal */ "Topper" = "Topper"; @@ -2607,6 +2616,9 @@ /* CrowdNode */ "You can change how / when your reward earnings are paid to you." = "You can change how / when your reward earnings are paid to you."; +/* No comment provided by engineer. */ +"You can continue to use DashPay for payments but you cannot update your profile or add more contacts until you top up your credit balance" = "You can continue to use DashPay for payments but you cannot update your profile or add more contacts until you top up your credit balance"; + /* No comment provided by engineer. */ "You can create a different username without paying again" = "You can create a different username without paying again"; @@ -2700,6 +2712,12 @@ /* CrowdNode */ "You will receive fractional payments automatically and they will by default be reinvested, however, it is also easy to set up automatic withdrawals to receive recurring payouts." = "You will receive fractional payments automatically and they will by default be reinvested, however, it is also easy to set up automatic withdrawals to receive recurring payouts."; +/* No comment provided by engineer. */ +"Your credit balance has been fully depleted" = "Your credit balance has been fully depleted"; + +/* No comment provided by engineer. */ +"Your credit balance is low" = "Your credit balance is low"; + /* CrowdNode */ "Your CrowdNode account is creating…" = "Your CrowdNode account is creating…"; diff --git a/DashWallet/fa.lproj/Localizable.strings b/DashWallet/fa.lproj/Localizable.strings index e45076c90..30298f94f 100644 --- a/DashWallet/fa.lproj/Localizable.strings +++ b/DashWallet/fa.lproj/Localizable.strings @@ -323,6 +323,9 @@ /* Dash Service Overview */ "Buy and convert Dash with another crypto" = "خرید و مبادله دش با سایر رمزارزها"; +/* No comment provided by engineer. */ +"Buy credits" = "Buy credits"; + /* No comment provided by engineer. */ "Buy Dash" = "خرید دش"; @@ -587,6 +590,9 @@ /* CrowdNode */ "Dash address designated for your CrowdNode account in the Dash Wallet on this device " = "Dash address designated for your CrowdNode account in the Dash Wallet on this device "; +/* No comment provided by engineer. */ +"Dash balance" = "Dash balance"; + /* Coinbase Entry Point */ "Dash balance on Coinbase" = "موجودش دش در کوینبیس"; @@ -2223,6 +2229,9 @@ /* No comment provided by engineer. */ "Tools" = "ابزارها"; +/* No comment provided by engineer. */ +"Top-up your credits to continue making changes to your profile and adding contacts" = "Top-up your credits to continue making changes to your profile and adding contacts"; + /* Dash Portal */ "Topper" = "تاپر"; @@ -2607,6 +2616,9 @@ /* CrowdNode */ "You can change how / when your reward earnings are paid to you." = "می‌توانید نحوه برداشت/زمان برداشت پاداشی که به شما داده می‌شود را تغییر دهید. "; +/* No comment provided by engineer. */ +"You can continue to use DashPay for payments but you cannot update your profile or add more contacts until you top up your credit balance" = "You can continue to use DashPay for payments but you cannot update your profile or add more contacts until you top up your credit balance"; + /* No comment provided by engineer. */ "You can create a different username without paying again" = "You can create a different username without paying again"; @@ -2700,6 +2712,12 @@ /* CrowdNode */ "You will receive fractional payments automatically and they will by default be reinvested, however, it is also easy to set up automatic withdrawals to receive recurring payouts." = "مبلغی جزئی را به صورت خودکار دریافت خواهید کرد و به صورت خودکار دوباره سرمایه‌گذاری می‌شود. با این وجود، امکان تنظیم برداشت خودکار برای دریافت پرداخت‌های مکرر به سادگی امکان‌پذیر است. "; +/* No comment provided by engineer. */ +"Your credit balance has been fully depleted" = "Your credit balance has been fully depleted"; + +/* No comment provided by engineer. */ +"Your credit balance is low" = "Your credit balance is low"; + /* CrowdNode */ "Your CrowdNode account is creating…" = "حساب کراودنود شما در حال ایجاد شدن است..."; diff --git a/DashWallet/fi.lproj/Localizable.strings b/DashWallet/fi.lproj/Localizable.strings index 04143e6bd..c2a7c7711 100644 --- a/DashWallet/fi.lproj/Localizable.strings +++ b/DashWallet/fi.lproj/Localizable.strings @@ -323,6 +323,9 @@ /* Dash Service Overview */ "Buy and convert Dash with another crypto" = "Buy and convert Dash with another crypto"; +/* No comment provided by engineer. */ +"Buy credits" = "Buy credits"; + /* No comment provided by engineer. */ "Buy Dash" = "Buy Dash"; @@ -587,6 +590,9 @@ /* CrowdNode */ "Dash address designated for your CrowdNode account in the Dash Wallet on this device " = "Dash address designated for your CrowdNode account in the Dash Wallet on this device "; +/* No comment provided by engineer. */ +"Dash balance" = "Dash balance"; + /* Coinbase Entry Point */ "Dash balance on Coinbase" = "Dash balance on Coinbase"; @@ -2223,6 +2229,9 @@ /* No comment provided by engineer. */ "Tools" = "Tools"; +/* No comment provided by engineer. */ +"Top-up your credits to continue making changes to your profile and adding contacts" = "Top-up your credits to continue making changes to your profile and adding contacts"; + /* Dash Portal */ "Topper" = "Topper"; @@ -2607,6 +2616,9 @@ /* CrowdNode */ "You can change how / when your reward earnings are paid to you." = "You can change how / when your reward earnings are paid to you."; +/* No comment provided by engineer. */ +"You can continue to use DashPay for payments but you cannot update your profile or add more contacts until you top up your credit balance" = "You can continue to use DashPay for payments but you cannot update your profile or add more contacts until you top up your credit balance"; + /* No comment provided by engineer. */ "You can create a different username without paying again" = "You can create a different username without paying again"; @@ -2700,6 +2712,12 @@ /* CrowdNode */ "You will receive fractional payments automatically and they will by default be reinvested, however, it is also easy to set up automatic withdrawals to receive recurring payouts." = "You will receive fractional payments automatically and they will by default be reinvested, however, it is also easy to set up automatic withdrawals to receive recurring payouts."; +/* No comment provided by engineer. */ +"Your credit balance has been fully depleted" = "Your credit balance has been fully depleted"; + +/* No comment provided by engineer. */ +"Your credit balance is low" = "Your credit balance is low"; + /* CrowdNode */ "Your CrowdNode account is creating…" = "Your CrowdNode account is creating…"; diff --git a/DashWallet/fil.lproj/Localizable.strings b/DashWallet/fil.lproj/Localizable.strings index 8649591f9..b3e9a3970 100644 --- a/DashWallet/fil.lproj/Localizable.strings +++ b/DashWallet/fil.lproj/Localizable.strings @@ -323,6 +323,9 @@ /* Dash Service Overview */ "Buy and convert Dash with another crypto" = "Bumili at i-convert ang Dash gamit ang isa pang crypto"; +/* No comment provided by engineer. */ +"Buy credits" = "Buy credits"; + /* No comment provided by engineer. */ "Buy Dash" = "Bumili ng Dash"; @@ -587,6 +590,9 @@ /* CrowdNode */ "Dash address designated for your CrowdNode account in the Dash Wallet on this device " = "Dash address na itinalaga para sa iyong CrowdNode account sa Dash Wallet sa device na ito"; +/* No comment provided by engineer. */ +"Dash balance" = "Dash balance"; + /* Coinbase Entry Point */ "Dash balance on Coinbase" = "Dash balanse sa Coinbase"; @@ -2223,6 +2229,9 @@ /* No comment provided by engineer. */ "Tools" = "Kagamitan"; +/* No comment provided by engineer. */ +"Top-up your credits to continue making changes to your profile and adding contacts" = "Top-up your credits to continue making changes to your profile and adding contacts"; + /* Dash Portal */ "Topper" = "Topper"; @@ -2607,6 +2616,9 @@ /* CrowdNode */ "You can change how / when your reward earnings are paid to you." = "Maaari mong baguhin kung paano / kailan binabayaran sa iyo ang iyong mga kita sa reward."; +/* No comment provided by engineer. */ +"You can continue to use DashPay for payments but you cannot update your profile or add more contacts until you top up your credit balance" = "You can continue to use DashPay for payments but you cannot update your profile or add more contacts until you top up your credit balance"; + /* No comment provided by engineer. */ "You can create a different username without paying again" = "Maaari kang lumikha ng ibang username nang hindi nagbabayad muli"; @@ -2700,6 +2712,12 @@ /* CrowdNode */ "You will receive fractional payments automatically and they will by default be reinvested, however, it is also easy to set up automatic withdrawals to receive recurring payouts." = "Awtomatiko kang makakatanggap ng mga fractional na pagbabayad at bilang default, ire-invest ang mga ito, gayunpaman, madali ring mag-set up ng mga awtomatikong withdrawal upang makatanggap ng mga umuulit na payout."; +/* No comment provided by engineer. */ +"Your credit balance has been fully depleted" = "Your credit balance has been fully depleted"; + +/* No comment provided by engineer. */ +"Your credit balance is low" = "Your credit balance is low"; + /* CrowdNode */ "Your CrowdNode account is creating…" = "Linilikha na ang iyong CrowdNode account..."; diff --git a/DashWallet/fr.lproj/Localizable.strings b/DashWallet/fr.lproj/Localizable.strings index c018073fe..67bb3571e 100644 --- a/DashWallet/fr.lproj/Localizable.strings +++ b/DashWallet/fr.lproj/Localizable.strings @@ -323,6 +323,9 @@ /* Dash Service Overview */ "Buy and convert Dash with another crypto" = "Acheter et convertir des dashs avec une autre crypto"; +/* No comment provided by engineer. */ +"Buy credits" = "Buy credits"; + /* No comment provided by engineer. */ "Buy Dash" = "Acheter du Dash"; @@ -587,6 +590,9 @@ /* CrowdNode */ "Dash address designated for your CrowdNode account in the Dash Wallet on this device " = "Adresse Dash attribuée à votre compte CrowdNode dans Dash Wallet sur cet appareil"; +/* No comment provided by engineer. */ +"Dash balance" = "Dash balance"; + /* Coinbase Entry Point */ "Dash balance on Coinbase" = "Solde Dash sur Coinbase"; @@ -2223,6 +2229,9 @@ /* No comment provided by engineer. */ "Tools" = "Outils"; +/* No comment provided by engineer. */ +"Top-up your credits to continue making changes to your profile and adding contacts" = "Top-up your credits to continue making changes to your profile and adding contacts"; + /* Dash Portal */ "Topper" = "Topper"; @@ -2607,6 +2616,9 @@ /* CrowdNode */ "You can change how / when your reward earnings are paid to you." = "Vous pouvez modifier comment et quand vos gains de récompense vous sont payés."; +/* No comment provided by engineer. */ +"You can continue to use DashPay for payments but you cannot update your profile or add more contacts until you top up your credit balance" = "You can continue to use DashPay for payments but you cannot update your profile or add more contacts until you top up your credit balance"; + /* No comment provided by engineer. */ "You can create a different username without paying again" = "Vous pouvez créer un nom d'utilisateur différent sans payer à nouveau"; @@ -2700,6 +2712,12 @@ /* CrowdNode */ "You will receive fractional payments automatically and they will by default be reinvested, however, it is also easy to set up automatic withdrawals to receive recurring payouts." = "Vous recevrez automatiquement les paiements partiels, et ils seront réinvestis par défaut. Cependant, il est également simple d'opter pour des retraits automatiques pour recevoir les paiements récurrents."; +/* No comment provided by engineer. */ +"Your credit balance has been fully depleted" = "Your credit balance has been fully depleted"; + +/* No comment provided by engineer. */ +"Your credit balance is low" = "Your credit balance is low"; + /* CrowdNode */ "Your CrowdNode account is creating…" = "Votre compte CrowdNode est en cours de création..."; diff --git a/DashWallet/hr.lproj/Localizable.strings b/DashWallet/hr.lproj/Localizable.strings index 759710db2..9315bd15b 100644 --- a/DashWallet/hr.lproj/Localizable.strings +++ b/DashWallet/hr.lproj/Localizable.strings @@ -323,6 +323,9 @@ /* Dash Service Overview */ "Buy and convert Dash with another crypto" = "Buy and convert Dash with another crypto"; +/* No comment provided by engineer. */ +"Buy credits" = "Buy credits"; + /* No comment provided by engineer. */ "Buy Dash" = "Buy Dash"; @@ -587,6 +590,9 @@ /* CrowdNode */ "Dash address designated for your CrowdNode account in the Dash Wallet on this device " = "Dash address designated for your CrowdNode account in the Dash Wallet on this device "; +/* No comment provided by engineer. */ +"Dash balance" = "Dash balance"; + /* Coinbase Entry Point */ "Dash balance on Coinbase" = "Dash balance on Coinbase"; @@ -2223,6 +2229,9 @@ /* No comment provided by engineer. */ "Tools" = "Tools"; +/* No comment provided by engineer. */ +"Top-up your credits to continue making changes to your profile and adding contacts" = "Top-up your credits to continue making changes to your profile and adding contacts"; + /* Dash Portal */ "Topper" = "Topper"; @@ -2607,6 +2616,9 @@ /* CrowdNode */ "You can change how / when your reward earnings are paid to you." = "You can change how / when your reward earnings are paid to you."; +/* No comment provided by engineer. */ +"You can continue to use DashPay for payments but you cannot update your profile or add more contacts until you top up your credit balance" = "You can continue to use DashPay for payments but you cannot update your profile or add more contacts until you top up your credit balance"; + /* No comment provided by engineer. */ "You can create a different username without paying again" = "You can create a different username without paying again"; @@ -2700,6 +2712,12 @@ /* CrowdNode */ "You will receive fractional payments automatically and they will by default be reinvested, however, it is also easy to set up automatic withdrawals to receive recurring payouts." = "You will receive fractional payments automatically and they will by default be reinvested, however, it is also easy to set up automatic withdrawals to receive recurring payouts."; +/* No comment provided by engineer. */ +"Your credit balance has been fully depleted" = "Your credit balance has been fully depleted"; + +/* No comment provided by engineer. */ +"Your credit balance is low" = "Your credit balance is low"; + /* CrowdNode */ "Your CrowdNode account is creating…" = "Your CrowdNode account is creating…"; diff --git a/DashWallet/hu.lproj/Localizable.strings b/DashWallet/hu.lproj/Localizable.strings index a12dda41e..1e4cc68b4 100644 --- a/DashWallet/hu.lproj/Localizable.strings +++ b/DashWallet/hu.lproj/Localizable.strings @@ -323,6 +323,9 @@ /* Dash Service Overview */ "Buy and convert Dash with another crypto" = "Buy and convert Dash with another crypto"; +/* No comment provided by engineer. */ +"Buy credits" = "Buy credits"; + /* No comment provided by engineer. */ "Buy Dash" = "Buy Dash"; @@ -587,6 +590,9 @@ /* CrowdNode */ "Dash address designated for your CrowdNode account in the Dash Wallet on this device " = "Dash address designated for your CrowdNode account in the Dash Wallet on this device "; +/* No comment provided by engineer. */ +"Dash balance" = "Dash balance"; + /* Coinbase Entry Point */ "Dash balance on Coinbase" = "Dash balance on Coinbase"; @@ -2223,6 +2229,9 @@ /* No comment provided by engineer. */ "Tools" = "Tools"; +/* No comment provided by engineer. */ +"Top-up your credits to continue making changes to your profile and adding contacts" = "Top-up your credits to continue making changes to your profile and adding contacts"; + /* Dash Portal */ "Topper" = "Topper"; @@ -2607,6 +2616,9 @@ /* CrowdNode */ "You can change how / when your reward earnings are paid to you." = "You can change how / when your reward earnings are paid to you."; +/* No comment provided by engineer. */ +"You can continue to use DashPay for payments but you cannot update your profile or add more contacts until you top up your credit balance" = "You can continue to use DashPay for payments but you cannot update your profile or add more contacts until you top up your credit balance"; + /* No comment provided by engineer. */ "You can create a different username without paying again" = "You can create a different username without paying again"; @@ -2700,6 +2712,12 @@ /* CrowdNode */ "You will receive fractional payments automatically and they will by default be reinvested, however, it is also easy to set up automatic withdrawals to receive recurring payouts." = "You will receive fractional payments automatically and they will by default be reinvested, however, it is also easy to set up automatic withdrawals to receive recurring payouts."; +/* No comment provided by engineer. */ +"Your credit balance has been fully depleted" = "Your credit balance has been fully depleted"; + +/* No comment provided by engineer. */ +"Your credit balance is low" = "Your credit balance is low"; + /* CrowdNode */ "Your CrowdNode account is creating…" = "Your CrowdNode account is creating…"; diff --git a/DashWallet/id.lproj/Localizable.strings b/DashWallet/id.lproj/Localizable.strings index 1972f7613..3d413837e 100644 --- a/DashWallet/id.lproj/Localizable.strings +++ b/DashWallet/id.lproj/Localizable.strings @@ -323,6 +323,9 @@ /* Dash Service Overview */ "Buy and convert Dash with another crypto" = "Beli dan konversikan Dash dengan crypto lain"; +/* No comment provided by engineer. */ +"Buy credits" = "Buy credits"; + /* No comment provided by engineer. */ "Buy Dash" = "Beli Dash"; @@ -587,6 +590,9 @@ /* CrowdNode */ "Dash address designated for your CrowdNode account in the Dash Wallet on this device " = "Alamat dash yang ditujukan untuk akun CrowdNode Anda di Dash Wallet pada perangkat ini"; +/* No comment provided by engineer. */ +"Dash balance" = "Dash balance"; + /* Coinbase Entry Point */ "Dash balance on Coinbase" = "Saldo Dash di Coinbase"; @@ -2223,6 +2229,9 @@ /* No comment provided by engineer. */ "Tools" = "Alat"; +/* No comment provided by engineer. */ +"Top-up your credits to continue making changes to your profile and adding contacts" = "Top-up your credits to continue making changes to your profile and adding contacts"; + /* Dash Portal */ "Topper" = "Topper"; @@ -2607,6 +2616,9 @@ /* CrowdNode */ "You can change how / when your reward earnings are paid to you." = "Anda dapat mengubah bagaimana / kapan penghasilan hadiah Anda dibayarkan kepada Anda."; +/* No comment provided by engineer. */ +"You can continue to use DashPay for payments but you cannot update your profile or add more contacts until you top up your credit balance" = "You can continue to use DashPay for payments but you cannot update your profile or add more contacts until you top up your credit balance"; + /* No comment provided by engineer. */ "You can create a different username without paying again" = "Anda dapat membuat nama pengguna yang berbeda tanpa membayar lagi"; @@ -2700,6 +2712,12 @@ /* CrowdNode */ "You will receive fractional payments automatically and they will by default be reinvested, however, it is also easy to set up automatic withdrawals to receive recurring payouts." = "Anda akan menerima pembayaran pecahan secara otomatis dan secara default akan diinvestasikan kembali, namun,mudah juga untuk mengatur penarikan otomatis untuk menerima pembayaran berulang."; +/* No comment provided by engineer. */ +"Your credit balance has been fully depleted" = "Your credit balance has been fully depleted"; + +/* No comment provided by engineer. */ +"Your credit balance is low" = "Your credit balance is low"; + /* CrowdNode */ "Your CrowdNode account is creating…" = "Akun CrowdNode Anda sedang membuat…"; diff --git a/DashWallet/it.lproj/Localizable.strings b/DashWallet/it.lproj/Localizable.strings index 0d0fbc558..7b527d6f2 100644 --- a/DashWallet/it.lproj/Localizable.strings +++ b/DashWallet/it.lproj/Localizable.strings @@ -323,6 +323,9 @@ /* Dash Service Overview */ "Buy and convert Dash with another crypto" = "Acquista o scambia Dash con un'altra criptovaluta"; +/* No comment provided by engineer. */ +"Buy credits" = "Buy credits"; + /* No comment provided by engineer. */ "Buy Dash" = "Compra Dash"; @@ -587,6 +590,9 @@ /* CrowdNode */ "Dash address designated for your CrowdNode account in the Dash Wallet on this device " = "Indirizzo Dash designato per il tuo account CrowdNode nel Dash Wallet su questo dispositivo"; +/* No comment provided by engineer. */ +"Dash balance" = "Dash balance"; + /* Coinbase Entry Point */ "Dash balance on Coinbase" = "Saldo Dash su Coinbase"; @@ -2223,6 +2229,9 @@ /* No comment provided by engineer. */ "Tools" = "Strumenti"; +/* No comment provided by engineer. */ +"Top-up your credits to continue making changes to your profile and adding contacts" = "Top-up your credits to continue making changes to your profile and adding contacts"; + /* Dash Portal */ "Topper" = "Topper"; @@ -2607,6 +2616,9 @@ /* CrowdNode */ "You can change how / when your reward earnings are paid to you." = "Puoi modificare come/quando ti vengono pagati i guadagni del premio."; +/* No comment provided by engineer. */ +"You can continue to use DashPay for payments but you cannot update your profile or add more contacts until you top up your credit balance" = "You can continue to use DashPay for payments but you cannot update your profile or add more contacts until you top up your credit balance"; + /* No comment provided by engineer. */ "You can create a different username without paying again" = "Puoi creare un nome utente diverso senza pagare nuovamente"; @@ -2700,6 +2712,12 @@ /* CrowdNode */ "You will receive fractional payments automatically and they will by default be reinvested, however, it is also easy to set up automatic withdrawals to receive recurring payouts." = "Riceverai automaticamente pagamenti frazionari e per impostazione predefinita verranno reinvestiti, tuttavia, è anche facile impostare prelievi automatici per ricevere pagamenti ricorrenti."; +/* No comment provided by engineer. */ +"Your credit balance has been fully depleted" = "Your credit balance has been fully depleted"; + +/* No comment provided by engineer. */ +"Your credit balance is low" = "Your credit balance is low"; + /* CrowdNode */ "Your CrowdNode account is creating…" = "Il tuo account CrowdNode sta creando..."; diff --git a/DashWallet/ja.lproj/Localizable.strings b/DashWallet/ja.lproj/Localizable.strings index 750270fac..837fdcaf3 100644 --- a/DashWallet/ja.lproj/Localizable.strings +++ b/DashWallet/ja.lproj/Localizable.strings @@ -323,6 +323,9 @@ /* Dash Service Overview */ "Buy and convert Dash with another crypto" = "Dashを他の仮想通貨で購入して変換する"; +/* No comment provided by engineer. */ +"Buy credits" = "Buy credits"; + /* No comment provided by engineer. */ "Buy Dash" = "Dashを買う"; @@ -587,6 +590,9 @@ /* CrowdNode */ "Dash address designated for your CrowdNode account in the Dash Wallet on this device " = "この端末のDashウォレットでCrowdNodeアカウントに指定されたDashアドレス"; +/* No comment provided by engineer. */ +"Dash balance" = "Dash balance"; + /* Coinbase Entry Point */ "Dash balance on Coinbase" = "CoinbaseでのDashの残高"; @@ -2223,6 +2229,9 @@ /* No comment provided by engineer. */ "Tools" = "ツール"; +/* No comment provided by engineer. */ +"Top-up your credits to continue making changes to your profile and adding contacts" = "Top-up your credits to continue making changes to your profile and adding contacts"; + /* Dash Portal */ "Topper" = "Topper"; @@ -2607,6 +2616,9 @@ /* CrowdNode */ "You can change how / when your reward earnings are paid to you." = "お客様は、報酬の支払い方法や支払い時期を変更できます。"; +/* No comment provided by engineer. */ +"You can continue to use DashPay for payments but you cannot update your profile or add more contacts until you top up your credit balance" = "You can continue to use DashPay for payments but you cannot update your profile or add more contacts until you top up your credit balance"; + /* No comment provided by engineer. */ "You can create a different username without paying again" = "再度支払うことなく、別のユーザー名を作成できます。"; @@ -2700,6 +2712,12 @@ /* CrowdNode */ "You will receive fractional payments automatically and they will by default be reinvested, however, it is also easy to set up automatic withdrawals to receive recurring payouts." = "端数の支払いは自動的に受け取れ、デフォルトでは再投資されますが、定期的な支払いを受け取るための自動出金の設定も簡単に行うことができます。"; +/* No comment provided by engineer. */ +"Your credit balance has been fully depleted" = "Your credit balance has been fully depleted"; + +/* No comment provided by engineer. */ +"Your credit balance is low" = "Your credit balance is low"; + /* CrowdNode */ "Your CrowdNode account is creating…" = "お客様のCrowdNodeアカウントを作成中..."; diff --git a/DashWallet/ko.lproj/Localizable.strings b/DashWallet/ko.lproj/Localizable.strings index d8c365098..830446325 100644 --- a/DashWallet/ko.lproj/Localizable.strings +++ b/DashWallet/ko.lproj/Localizable.strings @@ -323,6 +323,9 @@ /* Dash Service Overview */ "Buy and convert Dash with another crypto" = "다른 암호화폐로 대시 구매 및 전환하기"; +/* No comment provided by engineer. */ +"Buy credits" = "Buy credits"; + /* No comment provided by engineer. */ "Buy Dash" = "대시 매수"; @@ -587,6 +590,9 @@ /* CrowdNode */ "Dash address designated for your CrowdNode account in the Dash Wallet on this device " = "이 기기의 대시 지갑 내 크라우드노드 계정에 지정한 대시 주소"; +/* No comment provided by engineer. */ +"Dash balance" = "Dash balance"; + /* Coinbase Entry Point */ "Dash balance on Coinbase" = "코인베이스의 대시 잔액"; @@ -2223,6 +2229,9 @@ /* No comment provided by engineer. */ "Tools" = "도구"; +/* No comment provided by engineer. */ +"Top-up your credits to continue making changes to your profile and adding contacts" = "Top-up your credits to continue making changes to your profile and adding contacts"; + /* Dash Portal */ "Topper" = "토퍼"; @@ -2607,6 +2616,9 @@ /* CrowdNode */ "You can change how / when your reward earnings are paid to you." = "당신의 리워드 수익을 어떻게 / 언제 받을 것인지 변경할 수 있습니다."; +/* No comment provided by engineer. */ +"You can continue to use DashPay for payments but you cannot update your profile or add more contacts until you top up your credit balance" = "You can continue to use DashPay for payments but you cannot update your profile or add more contacts until you top up your credit balance"; + /* No comment provided by engineer. */ "You can create a different username without paying again" = "다시 지불하지 않고도 다른 사용자 이름을 생성할 수 있습니다."; @@ -2700,6 +2712,12 @@ /* CrowdNode */ "You will receive fractional payments automatically and they will by default be reinvested, however, it is also easy to set up automatic withdrawals to receive recurring payouts." = "당신은 분할된 지불금을 자동적으로 받게 되며, 이 금액은 디폴트로 다시 투자됩니다. 그러나, 쉬운 설정을 통해 지속적으로 이 수익금을 받아 자동 출금할 수도 있습니다."; +/* No comment provided by engineer. */ +"Your credit balance has been fully depleted" = "Your credit balance has been fully depleted"; + +/* No comment provided by engineer. */ +"Your credit balance is low" = "Your credit balance is low"; + /* CrowdNode */ "Your CrowdNode account is creating…" = "당신의 크라우드노드 계정을 생성하는 중입니다..."; diff --git a/DashWallet/mk.lproj/Localizable.strings b/DashWallet/mk.lproj/Localizable.strings index 1942c0119..b7f761ed1 100644 --- a/DashWallet/mk.lproj/Localizable.strings +++ b/DashWallet/mk.lproj/Localizable.strings @@ -323,6 +323,9 @@ /* Dash Service Overview */ "Buy and convert Dash with another crypto" = "Buy and convert Dash with another crypto"; +/* No comment provided by engineer. */ +"Buy credits" = "Buy credits"; + /* No comment provided by engineer. */ "Buy Dash" = "Buy Dash"; @@ -587,6 +590,9 @@ /* CrowdNode */ "Dash address designated for your CrowdNode account in the Dash Wallet on this device " = "Dash address designated for your CrowdNode account in the Dash Wallet on this device "; +/* No comment provided by engineer. */ +"Dash balance" = "Dash balance"; + /* Coinbase Entry Point */ "Dash balance on Coinbase" = "Dash balance on Coinbase"; @@ -2223,6 +2229,9 @@ /* No comment provided by engineer. */ "Tools" = "Tools"; +/* No comment provided by engineer. */ +"Top-up your credits to continue making changes to your profile and adding contacts" = "Top-up your credits to continue making changes to your profile and adding contacts"; + /* Dash Portal */ "Topper" = "Topper"; @@ -2607,6 +2616,9 @@ /* CrowdNode */ "You can change how / when your reward earnings are paid to you." = "You can change how / when your reward earnings are paid to you."; +/* No comment provided by engineer. */ +"You can continue to use DashPay for payments but you cannot update your profile or add more contacts until you top up your credit balance" = "You can continue to use DashPay for payments but you cannot update your profile or add more contacts until you top up your credit balance"; + /* No comment provided by engineer. */ "You can create a different username without paying again" = "You can create a different username without paying again"; @@ -2700,6 +2712,12 @@ /* CrowdNode */ "You will receive fractional payments automatically and they will by default be reinvested, however, it is also easy to set up automatic withdrawals to receive recurring payouts." = "You will receive fractional payments automatically and they will by default be reinvested, however, it is also easy to set up automatic withdrawals to receive recurring payouts."; +/* No comment provided by engineer. */ +"Your credit balance has been fully depleted" = "Your credit balance has been fully depleted"; + +/* No comment provided by engineer. */ +"Your credit balance is low" = "Your credit balance is low"; + /* CrowdNode */ "Your CrowdNode account is creating…" = "Your CrowdNode account is creating…"; diff --git a/DashWallet/ms.lproj/Localizable.strings b/DashWallet/ms.lproj/Localizable.strings index 40fd7c0c5..02a396777 100644 --- a/DashWallet/ms.lproj/Localizable.strings +++ b/DashWallet/ms.lproj/Localizable.strings @@ -323,6 +323,9 @@ /* Dash Service Overview */ "Buy and convert Dash with another crypto" = "Buy and convert Dash with another crypto"; +/* No comment provided by engineer. */ +"Buy credits" = "Buy credits"; + /* No comment provided by engineer. */ "Buy Dash" = "Beli Dash"; @@ -587,6 +590,9 @@ /* CrowdNode */ "Dash address designated for your CrowdNode account in the Dash Wallet on this device " = "Dash address designated for your CrowdNode account in the Dash Wallet on this device "; +/* No comment provided by engineer. */ +"Dash balance" = "Dash balance"; + /* Coinbase Entry Point */ "Dash balance on Coinbase" = "Dash balance on Coinbase"; @@ -2223,6 +2229,9 @@ /* No comment provided by engineer. */ "Tools" = "Tools"; +/* No comment provided by engineer. */ +"Top-up your credits to continue making changes to your profile and adding contacts" = "Top-up your credits to continue making changes to your profile and adding contacts"; + /* Dash Portal */ "Topper" = "Topper"; @@ -2607,6 +2616,9 @@ /* CrowdNode */ "You can change how / when your reward earnings are paid to you." = "You can change how / when your reward earnings are paid to you."; +/* No comment provided by engineer. */ +"You can continue to use DashPay for payments but you cannot update your profile or add more contacts until you top up your credit balance" = "You can continue to use DashPay for payments but you cannot update your profile or add more contacts until you top up your credit balance"; + /* No comment provided by engineer. */ "You can create a different username without paying again" = "You can create a different username without paying again"; @@ -2700,6 +2712,12 @@ /* CrowdNode */ "You will receive fractional payments automatically and they will by default be reinvested, however, it is also easy to set up automatic withdrawals to receive recurring payouts." = "You will receive fractional payments automatically and they will by default be reinvested, however, it is also easy to set up automatic withdrawals to receive recurring payouts."; +/* No comment provided by engineer. */ +"Your credit balance has been fully depleted" = "Your credit balance has been fully depleted"; + +/* No comment provided by engineer. */ +"Your credit balance is low" = "Your credit balance is low"; + /* CrowdNode */ "Your CrowdNode account is creating…" = "Your CrowdNode account is creating…"; diff --git a/DashWallet/nb.lproj/Localizable.strings b/DashWallet/nb.lproj/Localizable.strings index 869653c0f..40fc28985 100644 --- a/DashWallet/nb.lproj/Localizable.strings +++ b/DashWallet/nb.lproj/Localizable.strings @@ -323,6 +323,9 @@ /* Dash Service Overview */ "Buy and convert Dash with another crypto" = "Buy and convert Dash with another crypto"; +/* No comment provided by engineer. */ +"Buy credits" = "Buy credits"; + /* No comment provided by engineer. */ "Buy Dash" = "Buy Dash"; @@ -587,6 +590,9 @@ /* CrowdNode */ "Dash address designated for your CrowdNode account in the Dash Wallet on this device " = "Dash address designated for your CrowdNode account in the Dash Wallet on this device "; +/* No comment provided by engineer. */ +"Dash balance" = "Dash balance"; + /* Coinbase Entry Point */ "Dash balance on Coinbase" = "Dash balance on Coinbase"; @@ -2223,6 +2229,9 @@ /* No comment provided by engineer. */ "Tools" = "Tools"; +/* No comment provided by engineer. */ +"Top-up your credits to continue making changes to your profile and adding contacts" = "Top-up your credits to continue making changes to your profile and adding contacts"; + /* Dash Portal */ "Topper" = "Topper"; @@ -2607,6 +2616,9 @@ /* CrowdNode */ "You can change how / when your reward earnings are paid to you." = "You can change how / when your reward earnings are paid to you."; +/* No comment provided by engineer. */ +"You can continue to use DashPay for payments but you cannot update your profile or add more contacts until you top up your credit balance" = "You can continue to use DashPay for payments but you cannot update your profile or add more contacts until you top up your credit balance"; + /* No comment provided by engineer. */ "You can create a different username without paying again" = "You can create a different username without paying again"; @@ -2700,6 +2712,12 @@ /* CrowdNode */ "You will receive fractional payments automatically and they will by default be reinvested, however, it is also easy to set up automatic withdrawals to receive recurring payouts." = "You will receive fractional payments automatically and they will by default be reinvested, however, it is also easy to set up automatic withdrawals to receive recurring payouts."; +/* No comment provided by engineer. */ +"Your credit balance has been fully depleted" = "Your credit balance has been fully depleted"; + +/* No comment provided by engineer. */ +"Your credit balance is low" = "Your credit balance is low"; + /* CrowdNode */ "Your CrowdNode account is creating…" = "Your CrowdNode account is creating…"; diff --git a/DashWallet/nl.lproj/Localizable.strings b/DashWallet/nl.lproj/Localizable.strings index e33b66a88..323511bbc 100644 --- a/DashWallet/nl.lproj/Localizable.strings +++ b/DashWallet/nl.lproj/Localizable.strings @@ -323,6 +323,9 @@ /* Dash Service Overview */ "Buy and convert Dash with another crypto" = "Koop en converteer Dash met een andere cryptovaluta"; +/* No comment provided by engineer. */ +"Buy credits" = "Buy credits"; + /* No comment provided by engineer. */ "Buy Dash" = "Koop Dash"; @@ -587,6 +590,9 @@ /* CrowdNode */ "Dash address designated for your CrowdNode account in the Dash Wallet on this device " = "Het Dash adres op dit apparaat dat is toegewezen aan je CrowdNode account "; +/* No comment provided by engineer. */ +"Dash balance" = "Dash balance"; + /* Coinbase Entry Point */ "Dash balance on Coinbase" = "Dash saldo op Coinbase"; @@ -2223,6 +2229,9 @@ /* No comment provided by engineer. */ "Tools" = "Gereedschap"; +/* No comment provided by engineer. */ +"Top-up your credits to continue making changes to your profile and adding contacts" = "Top-up your credits to continue making changes to your profile and adding contacts"; + /* Dash Portal */ "Topper" = "Topper"; @@ -2607,6 +2616,9 @@ /* CrowdNode */ "You can change how / when your reward earnings are paid to you." = "Je kunt wijzigen hoe en wanneer inkomsten aan worden uitbetaald."; +/* No comment provided by engineer. */ +"You can continue to use DashPay for payments but you cannot update your profile or add more contacts until you top up your credit balance" = "You can continue to use DashPay for payments but you cannot update your profile or add more contacts until you top up your credit balance"; + /* No comment provided by engineer. */ "You can create a different username without paying again" = "Je kan een andere gebruikersnaam aanmaken zonder opnieuw te betalen"; @@ -2700,6 +2712,12 @@ /* CrowdNode */ "You will receive fractional payments automatically and they will by default be reinvested, however, it is also easy to set up automatic withdrawals to receive recurring payouts." = "U ontvangt automatisch fractionele betalingen en deze worden standaard opnieuw geïnvesteerd. Het is ook mogelijk om automatische opnames in te stellen om terugkerende uitbetalingen te ontvangen."; +/* No comment provided by engineer. */ +"Your credit balance has been fully depleted" = "Your credit balance has been fully depleted"; + +/* No comment provided by engineer. */ +"Your credit balance is low" = "Your credit balance is low"; + /* CrowdNode */ "Your CrowdNode account is creating…" = "Je CrowdNode account wordt aanmaakt..."; diff --git a/DashWallet/pl.lproj/Localizable.strings b/DashWallet/pl.lproj/Localizable.strings index 2231f042b..f2f4739b5 100644 --- a/DashWallet/pl.lproj/Localizable.strings +++ b/DashWallet/pl.lproj/Localizable.strings @@ -323,6 +323,9 @@ /* Dash Service Overview */ "Buy and convert Dash with another crypto" = "Kup i przekonwertuj inną walutę krypto na Dash"; +/* No comment provided by engineer. */ +"Buy credits" = "Buy credits"; + /* No comment provided by engineer. */ "Buy Dash" = "Kup Dashe"; @@ -587,6 +590,9 @@ /* CrowdNode */ "Dash address designated for your CrowdNode account in the Dash Wallet on this device " = "Adres Dash wyznaczony dla twojego konta CrowdNode w porfelu Dash na tym urządzeniu. "; +/* No comment provided by engineer. */ +"Dash balance" = "Dash balance"; + /* Coinbase Entry Point */ "Dash balance on Coinbase" = "Saldo Dash na Coinbase"; @@ -2223,6 +2229,9 @@ /* No comment provided by engineer. */ "Tools" = "Narzędzia"; +/* No comment provided by engineer. */ +"Top-up your credits to continue making changes to your profile and adding contacts" = "Top-up your credits to continue making changes to your profile and adding contacts"; + /* Dash Portal */ "Topper" = "Topper"; @@ -2607,6 +2616,9 @@ /* CrowdNode */ "You can change how / when your reward earnings are paid to you." = "Możesz zmienić sposób, w jaki lub kiedy twoje zarobki są wypłacane."; +/* No comment provided by engineer. */ +"You can continue to use DashPay for payments but you cannot update your profile or add more contacts until you top up your credit balance" = "You can continue to use DashPay for payments but you cannot update your profile or add more contacts until you top up your credit balance"; + /* No comment provided by engineer. */ "You can create a different username without paying again" = "Możesz stworzyć inną nazwę użytkownika bez konieczności ponownego płacenia"; @@ -2700,6 +2712,12 @@ /* CrowdNode */ "You will receive fractional payments automatically and they will by default be reinvested, however, it is also easy to set up automatic withdrawals to receive recurring payouts." = "Będziesz otrzymywać częściowe płatności automatycznie i domyślnie będą one reinwestowane, jednak jęsli chcesz możesz też ustawić automatyczne wypłaty."; +/* No comment provided by engineer. */ +"Your credit balance has been fully depleted" = "Your credit balance has been fully depleted"; + +/* No comment provided by engineer. */ +"Your credit balance is low" = "Your credit balance is low"; + /* CrowdNode */ "Your CrowdNode account is creating…" = "Otwieramy twoje konto CrowNode..."; diff --git a/DashWallet/pt.lproj/Localizable.strings b/DashWallet/pt.lproj/Localizable.strings index 34453029c..4e62caf6d 100644 --- a/DashWallet/pt.lproj/Localizable.strings +++ b/DashWallet/pt.lproj/Localizable.strings @@ -323,6 +323,9 @@ /* Dash Service Overview */ "Buy and convert Dash with another crypto" = "Compre e converta Dash com outra criptomoeda"; +/* No comment provided by engineer. */ +"Buy credits" = "Buy credits"; + /* No comment provided by engineer. */ "Buy Dash" = "Comprar Dash"; @@ -587,6 +590,9 @@ /* CrowdNode */ "Dash address designated for your CrowdNode account in the Dash Wallet on this device " = "Endereço Dash designado para sua conta CrowdNode na Carteira Dash neste dispositivo"; +/* No comment provided by engineer. */ +"Dash balance" = "Dash balance"; + /* Coinbase Entry Point */ "Dash balance on Coinbase" = "Saldo Dash na Coinbase"; @@ -2223,6 +2229,9 @@ /* No comment provided by engineer. */ "Tools" = "Ferramentas"; +/* No comment provided by engineer. */ +"Top-up your credits to continue making changes to your profile and adding contacts" = "Top-up your credits to continue making changes to your profile and adding contacts"; + /* Dash Portal */ "Topper" = "Topper"; @@ -2607,6 +2616,9 @@ /* CrowdNode */ "You can change how / when your reward earnings are paid to you." = "Você pode alterar como / quando seus ganhos de recompensa serão pagos."; +/* No comment provided by engineer. */ +"You can continue to use DashPay for payments but you cannot update your profile or add more contacts until you top up your credit balance" = "You can continue to use DashPay for payments but you cannot update your profile or add more contacts until you top up your credit balance"; + /* No comment provided by engineer. */ "You can create a different username without paying again" = "Você pode criar um nome de usuário diferente sem pagar novamente"; @@ -2700,6 +2712,12 @@ /* CrowdNode */ "You will receive fractional payments automatically and they will by default be reinvested, however, it is also easy to set up automatic withdrawals to receive recurring payouts." = "Você receberá pagamentos fracionados automaticamente e eles serão reinvestidos por padrão, no entanto, também é fácil configurar saques automáticos para receber pagamentos recorrentes."; +/* No comment provided by engineer. */ +"Your credit balance has been fully depleted" = "Your credit balance has been fully depleted"; + +/* No comment provided by engineer. */ +"Your credit balance is low" = "Your credit balance is low"; + /* CrowdNode */ "Your CrowdNode account is creating…" = "Sua conta CrowdNode está sendo criada…"; diff --git a/DashWallet/ro.lproj/Localizable.strings b/DashWallet/ro.lproj/Localizable.strings index b7c13b1c2..11a7feebb 100644 --- a/DashWallet/ro.lproj/Localizable.strings +++ b/DashWallet/ro.lproj/Localizable.strings @@ -323,6 +323,9 @@ /* Dash Service Overview */ "Buy and convert Dash with another crypto" = "Buy and convert Dash with another crypto"; +/* No comment provided by engineer. */ +"Buy credits" = "Buy credits"; + /* No comment provided by engineer. */ "Buy Dash" = "Cumpără Dash"; @@ -587,6 +590,9 @@ /* CrowdNode */ "Dash address designated for your CrowdNode account in the Dash Wallet on this device " = "Dash address designated for your CrowdNode account in the Dash Wallet on this device "; +/* No comment provided by engineer. */ +"Dash balance" = "Dash balance"; + /* Coinbase Entry Point */ "Dash balance on Coinbase" = "Dash balance on Coinbase"; @@ -2223,6 +2229,9 @@ /* No comment provided by engineer. */ "Tools" = "Tools"; +/* No comment provided by engineer. */ +"Top-up your credits to continue making changes to your profile and adding contacts" = "Top-up your credits to continue making changes to your profile and adding contacts"; + /* Dash Portal */ "Topper" = "Topper"; @@ -2607,6 +2616,9 @@ /* CrowdNode */ "You can change how / when your reward earnings are paid to you." = "You can change how / when your reward earnings are paid to you."; +/* No comment provided by engineer. */ +"You can continue to use DashPay for payments but you cannot update your profile or add more contacts until you top up your credit balance" = "You can continue to use DashPay for payments but you cannot update your profile or add more contacts until you top up your credit balance"; + /* No comment provided by engineer. */ "You can create a different username without paying again" = "You can create a different username without paying again"; @@ -2700,6 +2712,12 @@ /* CrowdNode */ "You will receive fractional payments automatically and they will by default be reinvested, however, it is also easy to set up automatic withdrawals to receive recurring payouts." = "You will receive fractional payments automatically and they will by default be reinvested, however, it is also easy to set up automatic withdrawals to receive recurring payouts."; +/* No comment provided by engineer. */ +"Your credit balance has been fully depleted" = "Your credit balance has been fully depleted"; + +/* No comment provided by engineer. */ +"Your credit balance is low" = "Your credit balance is low"; + /* CrowdNode */ "Your CrowdNode account is creating…" = "Your CrowdNode account is creating…"; diff --git a/DashWallet/ru.lproj/Localizable.strings b/DashWallet/ru.lproj/Localizable.strings index e6ef12263..76cae23c3 100644 --- a/DashWallet/ru.lproj/Localizable.strings +++ b/DashWallet/ru.lproj/Localizable.strings @@ -323,6 +323,9 @@ /* Dash Service Overview */ "Buy and convert Dash with another crypto" = "Купить и конвертировать Dash с помощью другой криптовалюты"; +/* No comment provided by engineer. */ +"Buy credits" = "Buy credits"; + /* No comment provided by engineer. */ "Buy Dash" = "Купить Dash"; @@ -587,6 +590,9 @@ /* CrowdNode */ "Dash address designated for your CrowdNode account in the Dash Wallet on this device " = "Dash адрес, созданный для вашего аккаунта CrowdNode в Dash Wallet на этом устройстве"; +/* No comment provided by engineer. */ +"Dash balance" = "Dash balance"; + /* Coinbase Entry Point */ "Dash balance on Coinbase" = "Баланс Dash на Coinbase"; @@ -2223,6 +2229,9 @@ /* No comment provided by engineer. */ "Tools" = "Инструменты"; +/* No comment provided by engineer. */ +"Top-up your credits to continue making changes to your profile and adding contacts" = "Top-up your credits to continue making changes to your profile and adding contacts"; + /* Dash Portal */ "Topper" = "Topper"; @@ -2607,6 +2616,9 @@ /* CrowdNode */ "You can change how / when your reward earnings are paid to you." = "Вы можете настроить, когда и каким образом получите своё вознаграждение."; +/* No comment provided by engineer. */ +"You can continue to use DashPay for payments but you cannot update your profile or add more contacts until you top up your credit balance" = "You can continue to use DashPay for payments but you cannot update your profile or add more contacts until you top up your credit balance"; + /* No comment provided by engineer. */ "You can create a different username without paying again" = "Вы можете создать другое имя пользователя без дополнительной платы"; @@ -2700,6 +2712,12 @@ /* CrowdNode */ "You will receive fractional payments automatically and they will by default be reinvested, however, it is also easy to set up automatic withdrawals to receive recurring payouts." = "Вы будете автоматически получать свою долю выплат, и они по умолчанию будут реинвестированы. Однако, для повторяющихся выплат можно легко настроить автоматический вывод средств."; +/* No comment provided by engineer. */ +"Your credit balance has been fully depleted" = "Your credit balance has been fully depleted"; + +/* No comment provided by engineer. */ +"Your credit balance is low" = "Your credit balance is low"; + /* CrowdNode */ "Your CrowdNode account is creating…" = "Создаётся аккаунт на CrowdNode..."; diff --git a/DashWallet/sk.lproj/Localizable.strings b/DashWallet/sk.lproj/Localizable.strings index 81b267d11..4e9529f9c 100644 --- a/DashWallet/sk.lproj/Localizable.strings +++ b/DashWallet/sk.lproj/Localizable.strings @@ -323,6 +323,9 @@ /* Dash Service Overview */ "Buy and convert Dash with another crypto" = "Kúpte a preveďte Dash pomocou inej kryptomeny"; +/* No comment provided by engineer. */ +"Buy credits" = "Buy credits"; + /* No comment provided by engineer. */ "Buy Dash" = "Kúpiť Dash"; @@ -587,6 +590,9 @@ /* CrowdNode */ "Dash address designated for your CrowdNode account in the Dash Wallet on this device " = "Dash adresa určená pre váš CrowdNode účet v Dash Wallet na tomto zariadení"; +/* No comment provided by engineer. */ +"Dash balance" = "Dash balance"; + /* Coinbase Entry Point */ "Dash balance on Coinbase" = "Zostatok Dash na Coinbase"; @@ -2223,6 +2229,9 @@ /* No comment provided by engineer. */ "Tools" = "Nástroje"; +/* No comment provided by engineer. */ +"Top-up your credits to continue making changes to your profile and adding contacts" = "Top-up your credits to continue making changes to your profile and adding contacts"; + /* Dash Portal */ "Topper" = "Topper"; @@ -2607,6 +2616,9 @@ /* CrowdNode */ "You can change how / when your reward earnings are paid to you." = "Môžete zmeniť spôsob alebo kedy sa vám budú vyplácať vaše zárobky."; +/* No comment provided by engineer. */ +"You can continue to use DashPay for payments but you cannot update your profile or add more contacts until you top up your credit balance" = "You can continue to use DashPay for payments but you cannot update your profile or add more contacts until you top up your credit balance"; + /* No comment provided by engineer. */ "You can create a different username without paying again" = "Môžete si vytvoriť iné používateľské meno bez toho, aby ste museli znova platiť"; @@ -2700,6 +2712,12 @@ /* CrowdNode */ "You will receive fractional payments automatically and they will by default be reinvested, however, it is also easy to set up automatic withdrawals to receive recurring payouts." = "Čiastkové platby budete dostávať automaticky a štandardne budú reinvestované, ale je tiež jednoduché nastaviť automatické výbery pre prijímanie opakujúcich sa platieb."; +/* No comment provided by engineer. */ +"Your credit balance has been fully depleted" = "Your credit balance has been fully depleted"; + +/* No comment provided by engineer. */ +"Your credit balance is low" = "Your credit balance is low"; + /* CrowdNode */ "Your CrowdNode account is creating…" = "Váš CrowdNode účet sa vytvára…"; diff --git a/DashWallet/sl.lproj/Localizable.strings b/DashWallet/sl.lproj/Localizable.strings index 983d03682..306401eed 100644 --- a/DashWallet/sl.lproj/Localizable.strings +++ b/DashWallet/sl.lproj/Localizable.strings @@ -323,6 +323,9 @@ /* Dash Service Overview */ "Buy and convert Dash with another crypto" = "Buy and convert Dash with another crypto"; +/* No comment provided by engineer. */ +"Buy credits" = "Buy credits"; + /* No comment provided by engineer. */ "Buy Dash" = "Kupi Dash kovance"; @@ -587,6 +590,9 @@ /* CrowdNode */ "Dash address designated for your CrowdNode account in the Dash Wallet on this device " = "Dash address designated for your CrowdNode account in the Dash Wallet on this device "; +/* No comment provided by engineer. */ +"Dash balance" = "Dash balance"; + /* Coinbase Entry Point */ "Dash balance on Coinbase" = "Dash balance on Coinbase"; @@ -2223,6 +2229,9 @@ /* No comment provided by engineer. */ "Tools" = "Tools"; +/* No comment provided by engineer. */ +"Top-up your credits to continue making changes to your profile and adding contacts" = "Top-up your credits to continue making changes to your profile and adding contacts"; + /* Dash Portal */ "Topper" = "Topper"; @@ -2607,6 +2616,9 @@ /* CrowdNode */ "You can change how / when your reward earnings are paid to you." = "You can change how / when your reward earnings are paid to you."; +/* No comment provided by engineer. */ +"You can continue to use DashPay for payments but you cannot update your profile or add more contacts until you top up your credit balance" = "You can continue to use DashPay for payments but you cannot update your profile or add more contacts until you top up your credit balance"; + /* No comment provided by engineer. */ "You can create a different username without paying again" = "You can create a different username without paying again"; @@ -2700,6 +2712,12 @@ /* CrowdNode */ "You will receive fractional payments automatically and they will by default be reinvested, however, it is also easy to set up automatic withdrawals to receive recurring payouts." = "You will receive fractional payments automatically and they will by default be reinvested, however, it is also easy to set up automatic withdrawals to receive recurring payouts."; +/* No comment provided by engineer. */ +"Your credit balance has been fully depleted" = "Your credit balance has been fully depleted"; + +/* No comment provided by engineer. */ +"Your credit balance is low" = "Your credit balance is low"; + /* CrowdNode */ "Your CrowdNode account is creating…" = "Your CrowdNode account is creating…"; diff --git a/DashWallet/sl_SI.lproj/Localizable.strings b/DashWallet/sl_SI.lproj/Localizable.strings index fb179312f..9368fc5e4 100644 --- a/DashWallet/sl_SI.lproj/Localizable.strings +++ b/DashWallet/sl_SI.lproj/Localizable.strings @@ -323,6 +323,9 @@ /* Dash Service Overview */ "Buy and convert Dash with another crypto" = "Buy and convert Dash with another crypto"; +/* No comment provided by engineer. */ +"Buy credits" = "Buy credits"; + /* No comment provided by engineer. */ "Buy Dash" = "Buy Dash"; @@ -587,6 +590,9 @@ /* CrowdNode */ "Dash address designated for your CrowdNode account in the Dash Wallet on this device " = "Dash address designated for your CrowdNode account in the Dash Wallet on this device "; +/* No comment provided by engineer. */ +"Dash balance" = "Dash balance"; + /* Coinbase Entry Point */ "Dash balance on Coinbase" = "Dash balance on Coinbase"; @@ -2223,6 +2229,9 @@ /* No comment provided by engineer. */ "Tools" = "Tools"; +/* No comment provided by engineer. */ +"Top-up your credits to continue making changes to your profile and adding contacts" = "Top-up your credits to continue making changes to your profile and adding contacts"; + /* Dash Portal */ "Topper" = "Topper"; @@ -2607,6 +2616,9 @@ /* CrowdNode */ "You can change how / when your reward earnings are paid to you." = "You can change how / when your reward earnings are paid to you."; +/* No comment provided by engineer. */ +"You can continue to use DashPay for payments but you cannot update your profile or add more contacts until you top up your credit balance" = "You can continue to use DashPay for payments but you cannot update your profile or add more contacts until you top up your credit balance"; + /* No comment provided by engineer. */ "You can create a different username without paying again" = "You can create a different username without paying again"; @@ -2700,6 +2712,12 @@ /* CrowdNode */ "You will receive fractional payments automatically and they will by default be reinvested, however, it is also easy to set up automatic withdrawals to receive recurring payouts." = "You will receive fractional payments automatically and they will by default be reinvested, however, it is also easy to set up automatic withdrawals to receive recurring payouts."; +/* No comment provided by engineer. */ +"Your credit balance has been fully depleted" = "Your credit balance has been fully depleted"; + +/* No comment provided by engineer. */ +"Your credit balance is low" = "Your credit balance is low"; + /* CrowdNode */ "Your CrowdNode account is creating…" = "Your CrowdNode account is creating…"; diff --git a/DashWallet/sq.lproj/Localizable.strings b/DashWallet/sq.lproj/Localizable.strings index 162110e3b..6e881de7d 100644 --- a/DashWallet/sq.lproj/Localizable.strings +++ b/DashWallet/sq.lproj/Localizable.strings @@ -323,6 +323,9 @@ /* Dash Service Overview */ "Buy and convert Dash with another crypto" = "Buy and convert Dash with another crypto"; +/* No comment provided by engineer. */ +"Buy credits" = "Buy credits"; + /* No comment provided by engineer. */ "Buy Dash" = "Buy Dash"; @@ -587,6 +590,9 @@ /* CrowdNode */ "Dash address designated for your CrowdNode account in the Dash Wallet on this device " = "Dash address designated for your CrowdNode account in the Dash Wallet on this device "; +/* No comment provided by engineer. */ +"Dash balance" = "Dash balance"; + /* Coinbase Entry Point */ "Dash balance on Coinbase" = "Dash balance on Coinbase"; @@ -2223,6 +2229,9 @@ /* No comment provided by engineer. */ "Tools" = "Tools"; +/* No comment provided by engineer. */ +"Top-up your credits to continue making changes to your profile and adding contacts" = "Top-up your credits to continue making changes to your profile and adding contacts"; + /* Dash Portal */ "Topper" = "Topper"; @@ -2607,6 +2616,9 @@ /* CrowdNode */ "You can change how / when your reward earnings are paid to you." = "You can change how / when your reward earnings are paid to you."; +/* No comment provided by engineer. */ +"You can continue to use DashPay for payments but you cannot update your profile or add more contacts until you top up your credit balance" = "You can continue to use DashPay for payments but you cannot update your profile or add more contacts until you top up your credit balance"; + /* No comment provided by engineer. */ "You can create a different username without paying again" = "You can create a different username without paying again"; @@ -2700,6 +2712,12 @@ /* CrowdNode */ "You will receive fractional payments automatically and they will by default be reinvested, however, it is also easy to set up automatic withdrawals to receive recurring payouts." = "You will receive fractional payments automatically and they will by default be reinvested, however, it is also easy to set up automatic withdrawals to receive recurring payouts."; +/* No comment provided by engineer. */ +"Your credit balance has been fully depleted" = "Your credit balance has been fully depleted"; + +/* No comment provided by engineer. */ +"Your credit balance is low" = "Your credit balance is low"; + /* CrowdNode */ "Your CrowdNode account is creating…" = "Your CrowdNode account is creating…"; diff --git a/DashWallet/sr.lproj/Localizable.strings b/DashWallet/sr.lproj/Localizable.strings index 5bedc7acf..5594430b0 100644 --- a/DashWallet/sr.lproj/Localizable.strings +++ b/DashWallet/sr.lproj/Localizable.strings @@ -323,6 +323,9 @@ /* Dash Service Overview */ "Buy and convert Dash with another crypto" = "Buy and convert Dash with another crypto"; +/* No comment provided by engineer. */ +"Buy credits" = "Buy credits"; + /* No comment provided by engineer. */ "Buy Dash" = "Kupi Dash"; @@ -587,6 +590,9 @@ /* CrowdNode */ "Dash address designated for your CrowdNode account in the Dash Wallet on this device " = "Dash address designated for your CrowdNode account in the Dash Wallet on this device "; +/* No comment provided by engineer. */ +"Dash balance" = "Dash balance"; + /* Coinbase Entry Point */ "Dash balance on Coinbase" = "Dash balance on Coinbase"; @@ -2223,6 +2229,9 @@ /* No comment provided by engineer. */ "Tools" = "Tools"; +/* No comment provided by engineer. */ +"Top-up your credits to continue making changes to your profile and adding contacts" = "Top-up your credits to continue making changes to your profile and adding contacts"; + /* Dash Portal */ "Topper" = "Topper"; @@ -2607,6 +2616,9 @@ /* CrowdNode */ "You can change how / when your reward earnings are paid to you." = "You can change how / when your reward earnings are paid to you."; +/* No comment provided by engineer. */ +"You can continue to use DashPay for payments but you cannot update your profile or add more contacts until you top up your credit balance" = "You can continue to use DashPay for payments but you cannot update your profile or add more contacts until you top up your credit balance"; + /* No comment provided by engineer. */ "You can create a different username without paying again" = "You can create a different username without paying again"; @@ -2700,6 +2712,12 @@ /* CrowdNode */ "You will receive fractional payments automatically and they will by default be reinvested, however, it is also easy to set up automatic withdrawals to receive recurring payouts." = "You will receive fractional payments automatically and they will by default be reinvested, however, it is also easy to set up automatic withdrawals to receive recurring payouts."; +/* No comment provided by engineer. */ +"Your credit balance has been fully depleted" = "Your credit balance has been fully depleted"; + +/* No comment provided by engineer. */ +"Your credit balance is low" = "Your credit balance is low"; + /* CrowdNode */ "Your CrowdNode account is creating…" = "Your CrowdNode account is creating…"; diff --git a/DashWallet/sv.lproj/Localizable.strings b/DashWallet/sv.lproj/Localizable.strings index 022373f2b..2b15a7e04 100644 --- a/DashWallet/sv.lproj/Localizable.strings +++ b/DashWallet/sv.lproj/Localizable.strings @@ -323,6 +323,9 @@ /* Dash Service Overview */ "Buy and convert Dash with another crypto" = "Buy and convert Dash with another crypto"; +/* No comment provided by engineer. */ +"Buy credits" = "Buy credits"; + /* No comment provided by engineer. */ "Buy Dash" = "Köp Dash"; @@ -587,6 +590,9 @@ /* CrowdNode */ "Dash address designated for your CrowdNode account in the Dash Wallet on this device " = "Dash address designated for your CrowdNode account in the Dash Wallet on this device "; +/* No comment provided by engineer. */ +"Dash balance" = "Dash balance"; + /* Coinbase Entry Point */ "Dash balance on Coinbase" = "Dash balance on Coinbase"; @@ -2223,6 +2229,9 @@ /* No comment provided by engineer. */ "Tools" = "Tools"; +/* No comment provided by engineer. */ +"Top-up your credits to continue making changes to your profile and adding contacts" = "Top-up your credits to continue making changes to your profile and adding contacts"; + /* Dash Portal */ "Topper" = "Topper"; @@ -2607,6 +2616,9 @@ /* CrowdNode */ "You can change how / when your reward earnings are paid to you." = "You can change how / when your reward earnings are paid to you."; +/* No comment provided by engineer. */ +"You can continue to use DashPay for payments but you cannot update your profile or add more contacts until you top up your credit balance" = "You can continue to use DashPay for payments but you cannot update your profile or add more contacts until you top up your credit balance"; + /* No comment provided by engineer. */ "You can create a different username without paying again" = "You can create a different username without paying again"; @@ -2700,6 +2712,12 @@ /* CrowdNode */ "You will receive fractional payments automatically and they will by default be reinvested, however, it is also easy to set up automatic withdrawals to receive recurring payouts." = "You will receive fractional payments automatically and they will by default be reinvested, however, it is also easy to set up automatic withdrawals to receive recurring payouts."; +/* No comment provided by engineer. */ +"Your credit balance has been fully depleted" = "Your credit balance has been fully depleted"; + +/* No comment provided by engineer. */ +"Your credit balance is low" = "Your credit balance is low"; + /* CrowdNode */ "Your CrowdNode account is creating…" = "Your CrowdNode account is creating…"; diff --git a/DashWallet/th.lproj/Localizable.strings b/DashWallet/th.lproj/Localizable.strings index 2b487815e..696426983 100644 --- a/DashWallet/th.lproj/Localizable.strings +++ b/DashWallet/th.lproj/Localizable.strings @@ -323,6 +323,9 @@ /* Dash Service Overview */ "Buy and convert Dash with another crypto" = "ซื้อและแลกเปลี่ยน Dash ด้วยคริปโตอื่น ๆ"; +/* No comment provided by engineer. */ +"Buy credits" = "Buy credits"; + /* No comment provided by engineer. */ "Buy Dash" = "ขาย Dash"; @@ -587,6 +590,9 @@ /* CrowdNode */ "Dash address designated for your CrowdNode account in the Dash Wallet on this device " = "ที่อยู่ Dash ที่กำหนดไว้สำหรับบัญชี CrowdNode ของคุณในกระเป๋าเงิน Dash บนอุปกรณ์นี้"; +/* No comment provided by engineer. */ +"Dash balance" = "Dash balance"; + /* Coinbase Entry Point */ "Dash balance on Coinbase" = "ยอดคงเหลือของ Dash บน Coinbase"; @@ -2223,6 +2229,9 @@ /* No comment provided by engineer. */ "Tools" = "เครื่องมือ"; +/* No comment provided by engineer. */ +"Top-up your credits to continue making changes to your profile and adding contacts" = "Top-up your credits to continue making changes to your profile and adding contacts"; + /* Dash Portal */ "Topper" = "Topper"; @@ -2607,6 +2616,9 @@ /* CrowdNode */ "You can change how / when your reward earnings are paid to you." = "คุณสามารถเปลี่ยนวิธีการที่คุณได้รับจากรายได้จากรางวัลของคุณ"; +/* No comment provided by engineer. */ +"You can continue to use DashPay for payments but you cannot update your profile or add more contacts until you top up your credit balance" = "You can continue to use DashPay for payments but you cannot update your profile or add more contacts until you top up your credit balance"; + /* No comment provided by engineer. */ "You can create a different username without paying again" = "You can create a different username without paying again"; @@ -2700,6 +2712,12 @@ /* CrowdNode */ "You will receive fractional payments automatically and they will by default be reinvested, however, it is also easy to set up automatic withdrawals to receive recurring payouts." = "คุณจะได้รับการชำระเงินแบบเศษส่วนโดยอัตโนมัติและโดยค่าเริ่มต้นจะถูกนำกลับมาลงทุนใหม่อย่างไรก็ตามมันเป็นเรื่องง่ายที่จะตั้งค่าการถอนอัตโนมัติเพื่อรับการจ่ายเงินที่เกิดขึ้นซ้ำ"; +/* No comment provided by engineer. */ +"Your credit balance has been fully depleted" = "Your credit balance has been fully depleted"; + +/* No comment provided by engineer. */ +"Your credit balance is low" = "Your credit balance is low"; + /* CrowdNode */ "Your CrowdNode account is creating…" = "บัญชี CrowdNode ของคุณกำลังสร้าง ..."; diff --git a/DashWallet/tr.lproj/Localizable.strings b/DashWallet/tr.lproj/Localizable.strings index 256dd3bff..cef77f4a4 100644 --- a/DashWallet/tr.lproj/Localizable.strings +++ b/DashWallet/tr.lproj/Localizable.strings @@ -323,6 +323,9 @@ /* Dash Service Overview */ "Buy and convert Dash with another crypto" = "Başka bir kripto para kullanarak Dash satın alın"; +/* No comment provided by engineer. */ +"Buy credits" = "Buy credits"; + /* No comment provided by engineer. */ "Buy Dash" = "Dash Satın Al"; @@ -587,6 +590,9 @@ /* CrowdNode */ "Dash address designated for your CrowdNode account in the Dash Wallet on this device " = "Bu cihazdaki Dash Cüzdanında CrowdNode hesabınız için belirlenen Dash adresi"; +/* No comment provided by engineer. */ +"Dash balance" = "Dash balance"; + /* Coinbase Entry Point */ "Dash balance on Coinbase" = "Coinbase'deki Dash bakiyesi"; @@ -2223,6 +2229,9 @@ /* No comment provided by engineer. */ "Tools" = "Araçlar"; +/* No comment provided by engineer. */ +"Top-up your credits to continue making changes to your profile and adding contacts" = "Top-up your credits to continue making changes to your profile and adding contacts"; + /* Dash Portal */ "Topper" = "Topper"; @@ -2607,6 +2616,9 @@ /* CrowdNode */ "You can change how / when your reward earnings are paid to you." = "Ödüllerinizin nasıl ve ne zaman ödeneceğini değiştirebilirsiniz."; +/* No comment provided by engineer. */ +"You can continue to use DashPay for payments but you cannot update your profile or add more contacts until you top up your credit balance" = "You can continue to use DashPay for payments but you cannot update your profile or add more contacts until you top up your credit balance"; + /* No comment provided by engineer. */ "You can create a different username without paying again" = "Tekrar ödeme yapmadan farklı bir kullanıcı adı oluşturabilirsiniz"; @@ -2700,6 +2712,12 @@ /* CrowdNode */ "You will receive fractional payments automatically and they will by default be reinvested, however, it is also easy to set up automatic withdrawals to receive recurring payouts." = "Kısmı ödemeleri otomatik olarak alacaksınız ve bunlar yeniden yatırım için kullanılacak. Tekrarlayan ödemeleri almak için otomatik para çekme işlemlerini ayarlamak kolaydır."; +/* No comment provided by engineer. */ +"Your credit balance has been fully depleted" = "Your credit balance has been fully depleted"; + +/* No comment provided by engineer. */ +"Your credit balance is low" = "Your credit balance is low"; + /* CrowdNode */ "Your CrowdNode account is creating…" = "CrowdNode hesabınız oluşturuyor…"; diff --git a/DashWallet/uk.lproj/Localizable.strings b/DashWallet/uk.lproj/Localizable.strings index 1801295f2..58b2a37cb 100644 --- a/DashWallet/uk.lproj/Localizable.strings +++ b/DashWallet/uk.lproj/Localizable.strings @@ -323,6 +323,9 @@ /* Dash Service Overview */ "Buy and convert Dash with another crypto" = "Купуйте та конвертуйте Dash за допомогою іншої криптовалюти"; +/* No comment provided by engineer. */ +"Buy credits" = "Buy credits"; + /* No comment provided by engineer. */ "Buy Dash" = "Купити Dash"; @@ -587,6 +590,9 @@ /* CrowdNode */ "Dash address designated for your CrowdNode account in the Dash Wallet on this device " = "Адреса Dash, призначена для вашого облікового запису CrowdNode у Dash Wallet на цьому пристрої"; +/* No comment provided by engineer. */ +"Dash balance" = "Dash balance"; + /* Coinbase Entry Point */ "Dash balance on Coinbase" = "Баланс Dash на Coinbase"; @@ -2223,6 +2229,9 @@ /* No comment provided by engineer. */ "Tools" = "Інструменти"; +/* No comment provided by engineer. */ +"Top-up your credits to continue making changes to your profile and adding contacts" = "Top-up your credits to continue making changes to your profile and adding contacts"; + /* Dash Portal */ "Topper" = "Topper"; @@ -2607,6 +2616,9 @@ /* CrowdNode */ "You can change how / when your reward earnings are paid to you." = "Ви можете налаштувати, коли та яким чином отримаєте свою винагороду."; +/* No comment provided by engineer. */ +"You can continue to use DashPay for payments but you cannot update your profile or add more contacts until you top up your credit balance" = "You can continue to use DashPay for payments but you cannot update your profile or add more contacts until you top up your credit balance"; + /* No comment provided by engineer. */ "You can create a different username without paying again" = "Ви можете створити інше ім’я користувача, не сплачуючи повторно"; @@ -2700,6 +2712,12 @@ /* CrowdNode */ "You will receive fractional payments automatically and they will by default be reinvested, however, it is also easy to set up automatic withdrawals to receive recurring payouts." = "Ви отримуватимете дробові виплати автоматично, і за замовчуванням вони будуть реінвестовані, однак також легко налаштувати автоматичне зняття коштів для отримання регулярних виплат."; +/* No comment provided by engineer. */ +"Your credit balance has been fully depleted" = "Your credit balance has been fully depleted"; + +/* No comment provided by engineer. */ +"Your credit balance is low" = "Your credit balance is low"; + /* CrowdNode */ "Your CrowdNode account is creating…" = "Ваш обліковий запис CrowdNode створюється…"; diff --git a/DashWallet/vi.lproj/Localizable.strings b/DashWallet/vi.lproj/Localizable.strings index 96bb0f0de..85685eaba 100644 --- a/DashWallet/vi.lproj/Localizable.strings +++ b/DashWallet/vi.lproj/Localizable.strings @@ -323,6 +323,9 @@ /* Dash Service Overview */ "Buy and convert Dash with another crypto" = "Buy and convert Dash with another crypto"; +/* No comment provided by engineer. */ +"Buy credits" = "Buy credits"; + /* No comment provided by engineer. */ "Buy Dash" = "Mua Dash"; @@ -587,6 +590,9 @@ /* CrowdNode */ "Dash address designated for your CrowdNode account in the Dash Wallet on this device " = "Dash address designated for your CrowdNode account in the Dash Wallet on this device "; +/* No comment provided by engineer. */ +"Dash balance" = "Dash balance"; + /* Coinbase Entry Point */ "Dash balance on Coinbase" = "Dash balance on Coinbase"; @@ -2223,6 +2229,9 @@ /* No comment provided by engineer. */ "Tools" = "Công cụ"; +/* No comment provided by engineer. */ +"Top-up your credits to continue making changes to your profile and adding contacts" = "Top-up your credits to continue making changes to your profile and adding contacts"; + /* Dash Portal */ "Topper" = "Topper"; @@ -2607,6 +2616,9 @@ /* CrowdNode */ "You can change how / when your reward earnings are paid to you." = "You can change how / when your reward earnings are paid to you."; +/* No comment provided by engineer. */ +"You can continue to use DashPay for payments but you cannot update your profile or add more contacts until you top up your credit balance" = "You can continue to use DashPay for payments but you cannot update your profile or add more contacts until you top up your credit balance"; + /* No comment provided by engineer. */ "You can create a different username without paying again" = "You can create a different username without paying again"; @@ -2700,6 +2712,12 @@ /* CrowdNode */ "You will receive fractional payments automatically and they will by default be reinvested, however, it is also easy to set up automatic withdrawals to receive recurring payouts." = "You will receive fractional payments automatically and they will by default be reinvested, however, it is also easy to set up automatic withdrawals to receive recurring payouts."; +/* No comment provided by engineer. */ +"Your credit balance has been fully depleted" = "Your credit balance has been fully depleted"; + +/* No comment provided by engineer. */ +"Your credit balance is low" = "Your credit balance is low"; + /* CrowdNode */ "Your CrowdNode account is creating…" = "Your CrowdNode account is creating…"; diff --git a/DashWallet/zh-Hans.lproj/Localizable.strings b/DashWallet/zh-Hans.lproj/Localizable.strings index 03fd67077..23bc7b4f7 100644 --- a/DashWallet/zh-Hans.lproj/Localizable.strings +++ b/DashWallet/zh-Hans.lproj/Localizable.strings @@ -323,6 +323,9 @@ /* Dash Service Overview */ "Buy and convert Dash with another crypto" = "Buy and convert Dash with another crypto"; +/* No comment provided by engineer. */ +"Buy credits" = "Buy credits"; + /* No comment provided by engineer. */ "Buy Dash" = "购买达世币"; @@ -587,6 +590,9 @@ /* CrowdNode */ "Dash address designated for your CrowdNode account in the Dash Wallet on this device " = "Dash address designated for your CrowdNode account in the Dash Wallet on this device "; +/* No comment provided by engineer. */ +"Dash balance" = "Dash balance"; + /* Coinbase Entry Point */ "Dash balance on Coinbase" = "Dash balance on Coinbase"; @@ -2223,6 +2229,9 @@ /* No comment provided by engineer. */ "Tools" = "Tools"; +/* No comment provided by engineer. */ +"Top-up your credits to continue making changes to your profile and adding contacts" = "Top-up your credits to continue making changes to your profile and adding contacts"; + /* Dash Portal */ "Topper" = "Topper"; @@ -2607,6 +2616,9 @@ /* CrowdNode */ "You can change how / when your reward earnings are paid to you." = "You can change how / when your reward earnings are paid to you."; +/* No comment provided by engineer. */ +"You can continue to use DashPay for payments but you cannot update your profile or add more contacts until you top up your credit balance" = "You can continue to use DashPay for payments but you cannot update your profile or add more contacts until you top up your credit balance"; + /* No comment provided by engineer. */ "You can create a different username without paying again" = "You can create a different username without paying again"; @@ -2700,6 +2712,12 @@ /* CrowdNode */ "You will receive fractional payments automatically and they will by default be reinvested, however, it is also easy to set up automatic withdrawals to receive recurring payouts." = "You will receive fractional payments automatically and they will by default be reinvested, however, it is also easy to set up automatic withdrawals to receive recurring payouts."; +/* No comment provided by engineer. */ +"Your credit balance has been fully depleted" = "Your credit balance has been fully depleted"; + +/* No comment provided by engineer. */ +"Your credit balance is low" = "Your credit balance is low"; + /* CrowdNode */ "Your CrowdNode account is creating…" = "Your CrowdNode account is creating…"; diff --git a/DashWallet/zh-Hant-TW.lproj/Localizable.strings b/DashWallet/zh-Hant-TW.lproj/Localizable.strings index 6930c6df1..6fcafb30d 100644 --- a/DashWallet/zh-Hant-TW.lproj/Localizable.strings +++ b/DashWallet/zh-Hant-TW.lproj/Localizable.strings @@ -323,6 +323,9 @@ /* Dash Service Overview */ "Buy and convert Dash with another crypto" = "Buy and convert Dash with another crypto"; +/* No comment provided by engineer. */ +"Buy credits" = "Buy credits"; + /* No comment provided by engineer. */ "Buy Dash" = "購買達世幣"; @@ -587,6 +590,9 @@ /* CrowdNode */ "Dash address designated for your CrowdNode account in the Dash Wallet on this device " = "Dash address designated for your CrowdNode account in the Dash Wallet on this device "; +/* No comment provided by engineer. */ +"Dash balance" = "Dash balance"; + /* Coinbase Entry Point */ "Dash balance on Coinbase" = "Dash balance on Coinbase"; @@ -2223,6 +2229,9 @@ /* No comment provided by engineer. */ "Tools" = "Tools"; +/* No comment provided by engineer. */ +"Top-up your credits to continue making changes to your profile and adding contacts" = "Top-up your credits to continue making changes to your profile and adding contacts"; + /* Dash Portal */ "Topper" = "Topper"; @@ -2607,6 +2616,9 @@ /* CrowdNode */ "You can change how / when your reward earnings are paid to you." = "You can change how / when your reward earnings are paid to you."; +/* No comment provided by engineer. */ +"You can continue to use DashPay for payments but you cannot update your profile or add more contacts until you top up your credit balance" = "You can continue to use DashPay for payments but you cannot update your profile or add more contacts until you top up your credit balance"; + /* No comment provided by engineer. */ "You can create a different username without paying again" = "You can create a different username without paying again"; @@ -2700,6 +2712,12 @@ /* CrowdNode */ "You will receive fractional payments automatically and they will by default be reinvested, however, it is also easy to set up automatic withdrawals to receive recurring payouts." = "You will receive fractional payments automatically and they will by default be reinvested, however, it is also easy to set up automatic withdrawals to receive recurring payouts."; +/* No comment provided by engineer. */ +"Your credit balance has been fully depleted" = "Your credit balance has been fully depleted"; + +/* No comment provided by engineer. */ +"Your credit balance is low" = "Your credit balance is low"; + /* CrowdNode */ "Your CrowdNode account is creating…" = "Your CrowdNode account is creating…"; diff --git a/DashWallet/zh.lproj/Localizable.strings b/DashWallet/zh.lproj/Localizable.strings index 99013d46c..4452cdc9a 100644 --- a/DashWallet/zh.lproj/Localizable.strings +++ b/DashWallet/zh.lproj/Localizable.strings @@ -323,6 +323,9 @@ /* Dash Service Overview */ "Buy and convert Dash with another crypto" = "购买并以其他加密货币兑换Dash"; +/* No comment provided by engineer. */ +"Buy credits" = "Buy credits"; + /* No comment provided by engineer. */ "Buy Dash" = "购买Dash"; @@ -587,6 +590,9 @@ /* CrowdNode */ "Dash address designated for your CrowdNode account in the Dash Wallet on this device " = "此设备上Dash钱包中为您的CrowdNode账户指定Dash地址"; +/* No comment provided by engineer. */ +"Dash balance" = "Dash balance"; + /* Coinbase Entry Point */ "Dash balance on Coinbase" = "Coinbase上的Dash余额"; @@ -2223,6 +2229,9 @@ /* No comment provided by engineer. */ "Tools" = "工具"; +/* No comment provided by engineer. */ +"Top-up your credits to continue making changes to your profile and adding contacts" = "Top-up your credits to continue making changes to your profile and adding contacts"; + /* Dash Portal */ "Topper" = "Topper"; @@ -2607,6 +2616,9 @@ /* CrowdNode */ "You can change how / when your reward earnings are paid to you." = "您可以更改向您支付奖励收入的方式 / 时间."; +/* No comment provided by engineer. */ +"You can continue to use DashPay for payments but you cannot update your profile or add more contacts until you top up your credit balance" = "You can continue to use DashPay for payments but you cannot update your profile or add more contacts until you top up your credit balance"; + /* No comment provided by engineer. */ "You can create a different username without paying again" = "您可以创建一个不同的用户名无需再次付款"; @@ -2700,6 +2712,12 @@ /* CrowdNode */ "You will receive fractional payments automatically and they will by default be reinvested, however, it is also easy to set up automatic withdrawals to receive recurring payouts." = "您将自动收到小额付款, 默认下它们将被再次投资, 但是设置自动提款以接收定期付款也很容易."; +/* No comment provided by engineer. */ +"Your credit balance has been fully depleted" = "Your credit balance has been fully depleted"; + +/* No comment provided by engineer. */ +"Your credit balance is low" = "Your credit balance is low"; + /* CrowdNode */ "Your CrowdNode account is creating…" = "正在创建您的CrowdNode账户..."; diff --git a/DashWallet/zh_TW.lproj/Localizable.strings b/DashWallet/zh_TW.lproj/Localizable.strings index 6f3c24804..c5b996b5f 100644 --- a/DashWallet/zh_TW.lproj/Localizable.strings +++ b/DashWallet/zh_TW.lproj/Localizable.strings @@ -323,6 +323,9 @@ /* Dash Service Overview */ "Buy and convert Dash with another crypto" = "用另一種加密貨幣購買和兌換達世幣"; +/* No comment provided by engineer. */ +"Buy credits" = "Buy credits"; + /* No comment provided by engineer. */ "Buy Dash" = "購買達世幣"; @@ -587,6 +590,9 @@ /* CrowdNode */ "Dash address designated for your CrowdNode account in the Dash Wallet on this device " = "此設備上達世幣錢包中為您的 CrowdNode 帳戶指定的達世幣位址"; +/* No comment provided by engineer. */ +"Dash balance" = "Dash balance"; + /* Coinbase Entry Point */ "Dash balance on Coinbase" = "Coinbase 上的達世幣結餘"; @@ -2223,6 +2229,9 @@ /* No comment provided by engineer. */ "Tools" = "工具"; +/* No comment provided by engineer. */ +"Top-up your credits to continue making changes to your profile and adding contacts" = "Top-up your credits to continue making changes to your profile and adding contacts"; + /* Dash Portal */ "Topper" = "Topper"; @@ -2607,6 +2616,9 @@ /* CrowdNode */ "You can change how / when your reward earnings are paid to you." = "您可以更改向您支付獎勵收入的方式/時間。"; +/* No comment provided by engineer. */ +"You can continue to use DashPay for payments but you cannot update your profile or add more contacts until you top up your credit balance" = "You can continue to use DashPay for payments but you cannot update your profile or add more contacts until you top up your credit balance"; + /* No comment provided by engineer. */ "You can create a different username without paying again" = "您可以創建不同的用戶名而無需再次付費"; @@ -2700,6 +2712,12 @@ /* CrowdNode */ "You will receive fractional payments automatically and they will by default be reinvested, however, it is also easy to set up automatic withdrawals to receive recurring payouts." = "您將自動收到小額付款,預設情況下它們將被再投資,但是,設置自動提款以接收定期付款也很容易。"; +/* No comment provided by engineer. */ +"Your credit balance has been fully depleted" = "Your credit balance has been fully depleted"; + +/* No comment provided by engineer. */ +"Your credit balance is low" = "Your credit balance is low"; + /* CrowdNode */ "Your CrowdNode account is creating…" = "正在創建您的 CrowdNode 帳戶…"; diff --git a/Shared/Resources/SharedAssets.xcassets/Colors/Gray500.colorset/Contents.json b/Shared/Resources/SharedAssets.xcassets/Colors/Gray500.colorset/Contents.json new file mode 100644 index 000000000..483af9b53 --- /dev/null +++ b/Shared/Resources/SharedAssets.xcassets/Colors/Gray500.colorset/Contents.json @@ -0,0 +1,38 @@ +{ + "colors" : [ + { + "color" : { + "color-space" : "srgb", + "components" : { + "alpha" : "1.000", + "blue" : "0x66", + "green" : "0x5C", + "red" : "0x52" + } + }, + "idiom" : "universal" + }, + { + "appearances" : [ + { + "appearance" : "luminosity", + "value" : "dark" + } + ], + "color" : { + "color-space" : "srgb", + "components" : { + "alpha" : "1.000", + "blue" : "0x66", + "green" : "0x5C", + "red" : "0x52" + } + }, + "idiom" : "universal" + } + ], + "info" : { + "author" : "xcode", + "version" : 1 + } +} From b3ea666173c0c3561492818f1951fa67bc6922f0 Mon Sep 17 00:00:00 2001 From: Andrei Ashikhmin Date: Tue, 23 Jul 2024 20:56:59 +0700 Subject: [PATCH 6/6] chore: strings --- DashWallet/Sources/UI/Home/HomeViewController.swift | 4 +++- DashWallet/ar.lproj/Localizable.strings | 3 +++ DashWallet/bg.lproj/Localizable.strings | 3 +++ DashWallet/ca.lproj/Localizable.strings | 3 +++ DashWallet/cs.lproj/Localizable.strings | 3 +++ DashWallet/da.lproj/Localizable.strings | 3 +++ DashWallet/de.lproj/Localizable.strings | 3 +++ DashWallet/el.lproj/Localizable.strings | 3 +++ DashWallet/en.lproj/Localizable.strings | 3 +++ DashWallet/eo.lproj/Localizable.strings | 3 +++ DashWallet/es.lproj/Localizable.strings | 3 +++ DashWallet/et.lproj/Localizable.strings | 3 +++ DashWallet/fa.lproj/Localizable.strings | 3 +++ DashWallet/fi.lproj/Localizable.strings | 3 +++ DashWallet/fil.lproj/Localizable.strings | 3 +++ DashWallet/fr.lproj/Localizable.strings | 3 +++ DashWallet/hr.lproj/Localizable.strings | 3 +++ DashWallet/hu.lproj/Localizable.strings | 3 +++ DashWallet/id.lproj/Localizable.strings | 3 +++ DashWallet/it.lproj/Localizable.strings | 3 +++ DashWallet/ja.lproj/Localizable.strings | 3 +++ DashWallet/ko.lproj/Localizable.strings | 3 +++ DashWallet/mk.lproj/Localizable.strings | 3 +++ DashWallet/ms.lproj/Localizable.strings | 3 +++ DashWallet/nb.lproj/Localizable.strings | 3 +++ DashWallet/nl.lproj/Localizable.strings | 3 +++ DashWallet/pl.lproj/Localizable.strings | 3 +++ DashWallet/pt.lproj/Localizable.strings | 3 +++ DashWallet/ro.lproj/Localizable.strings | 3 +++ DashWallet/ru.lproj/Localizable.strings | 3 +++ DashWallet/sk.lproj/Localizable.strings | 3 +++ DashWallet/sl.lproj/Localizable.strings | 3 +++ DashWallet/sl_SI.lproj/Localizable.strings | 3 +++ DashWallet/sq.lproj/Localizable.strings | 3 +++ DashWallet/sr.lproj/Localizable.strings | 3 +++ DashWallet/sv.lproj/Localizable.strings | 3 +++ DashWallet/th.lproj/Localizable.strings | 3 +++ DashWallet/tr.lproj/Localizable.strings | 3 +++ DashWallet/uk.lproj/Localizable.strings | 3 +++ DashWallet/vi.lproj/Localizable.strings | 3 +++ DashWallet/zh-Hans.lproj/Localizable.strings | 3 +++ DashWallet/zh-Hant-TW.lproj/Localizable.strings | 3 +++ DashWallet/zh.lproj/Localizable.strings | 3 +++ DashWallet/zh_TW.lproj/Localizable.strings | 3 +++ 44 files changed, 132 insertions(+), 1 deletion(-) diff --git a/DashWallet/Sources/UI/Home/HomeViewController.swift b/DashWallet/Sources/UI/Home/HomeViewController.swift index 65cb49879..d78b95310 100644 --- a/DashWallet/Sources/UI/Home/HomeViewController.swift +++ b/DashWallet/Sources/UI/Home/HomeViewController.swift @@ -22,11 +22,13 @@ class HomeViewController: DWBasePayViewController, NavigationBarDisplayable { var model: DWHomeProtocol! private var homeView: HomeView! weak var delegate: (DWHomeViewControllerDelegate & DWWipeDelegate)? - var isBackButtonHidden: Bool = false #if DASHPAY + var isBackButtonHidden: Bool = false private var invitationSetup: DWInvitationSetupState? private var avatarView: DWDPAvatarView! + #else + var isBackButtonHidden: Bool = true #endif override var payModel: any DWPayModelProtocol { diff --git a/DashWallet/ar.lproj/Localizable.strings b/DashWallet/ar.lproj/Localizable.strings index 4e8872962..57ecb021c 100644 --- a/DashWallet/ar.lproj/Localizable.strings +++ b/DashWallet/ar.lproj/Localizable.strings @@ -22,6 +22,9 @@ /* No comment provided by engineer. */ "%@ is not allowed to access Touch ID" = "%@ is not allowed to access Touch ID"; +/* Credits */ +"%@ ~ %lu contacts / %lu profile updates" = "%1$@ ~ %2$lu contacts / %3$lu profile updates"; + /* Voting */ "%ld duplicates" = "%ld duplicates"; diff --git a/DashWallet/bg.lproj/Localizable.strings b/DashWallet/bg.lproj/Localizable.strings index 9840833b8..80b611eb3 100644 --- a/DashWallet/bg.lproj/Localizable.strings +++ b/DashWallet/bg.lproj/Localizable.strings @@ -22,6 +22,9 @@ /* No comment provided by engineer. */ "%@ is not allowed to access Touch ID" = "%@ не е разрешен достъпа до Touch ID"; +/* Credits */ +"%@ ~ %lu contacts / %lu profile updates" = "%1$@ ~ %2$lu contacts / %3$lu profile updates"; + /* Voting */ "%ld duplicates" = "%ld duplicates"; diff --git a/DashWallet/ca.lproj/Localizable.strings b/DashWallet/ca.lproj/Localizable.strings index ab9d8b963..436b55ce3 100644 --- a/DashWallet/ca.lproj/Localizable.strings +++ b/DashWallet/ca.lproj/Localizable.strings @@ -22,6 +22,9 @@ /* No comment provided by engineer. */ "%@ is not allowed to access Touch ID" = "%@ is not allowed to access Touch ID"; +/* Credits */ +"%@ ~ %lu contacts / %lu profile updates" = "%1$@ ~ %2$lu contacts / %3$lu profile updates"; + /* Voting */ "%ld duplicates" = "%ld duplicates"; diff --git a/DashWallet/cs.lproj/Localizable.strings b/DashWallet/cs.lproj/Localizable.strings index 1032c6a74..1640ad934 100644 --- a/DashWallet/cs.lproj/Localizable.strings +++ b/DashWallet/cs.lproj/Localizable.strings @@ -22,6 +22,9 @@ /* No comment provided by engineer. */ "%@ is not allowed to access Touch ID" = "%@ nemá přístup k Touch ID"; +/* Credits */ +"%@ ~ %lu contacts / %lu profile updates" = "%1$@ ~ %2$lu contacts / %3$lu profile updates"; + /* Voting */ "%ld duplicates" = "%ld duplicates"; diff --git a/DashWallet/da.lproj/Localizable.strings b/DashWallet/da.lproj/Localizable.strings index b3f021563..6ee2e0c06 100644 --- a/DashWallet/da.lproj/Localizable.strings +++ b/DashWallet/da.lproj/Localizable.strings @@ -22,6 +22,9 @@ /* No comment provided by engineer. */ "%@ is not allowed to access Touch ID" = "%@ is not allowed to access Touch ID"; +/* Credits */ +"%@ ~ %lu contacts / %lu profile updates" = "%1$@ ~ %2$lu contacts / %3$lu profile updates"; + /* Voting */ "%ld duplicates" = "%ld duplicates"; diff --git a/DashWallet/de.lproj/Localizable.strings b/DashWallet/de.lproj/Localizable.strings index 58e5faf44..7f1b14932 100644 --- a/DashWallet/de.lproj/Localizable.strings +++ b/DashWallet/de.lproj/Localizable.strings @@ -22,6 +22,9 @@ /* No comment provided by engineer. */ "%@ is not allowed to access Touch ID" = "%@ darf nicht auf die Touch ID zugreifen"; +/* Credits */ +"%@ ~ %lu contacts / %lu profile updates" = "%1$@ ~ %2$lu contacts / %3$lu profile updates"; + /* Voting */ "%ld duplicates" = "%ld Duplikate"; diff --git a/DashWallet/el.lproj/Localizable.strings b/DashWallet/el.lproj/Localizable.strings index 126ed31e1..60911da39 100644 --- a/DashWallet/el.lproj/Localizable.strings +++ b/DashWallet/el.lproj/Localizable.strings @@ -22,6 +22,9 @@ /* No comment provided by engineer. */ "%@ is not allowed to access Touch ID" = "%@ δεν επιτρέπεται να έχετε πρόσβαση στο Touch ID"; +/* Credits */ +"%@ ~ %lu contacts / %lu profile updates" = "%1$@ ~ %2$lu contacts / %3$lu profile updates"; + /* Voting */ "%ld duplicates" = "%ld διπλότυπα"; diff --git a/DashWallet/en.lproj/Localizable.strings b/DashWallet/en.lproj/Localizable.strings index d33c62944..60a09ec9c 100644 --- a/DashWallet/en.lproj/Localizable.strings +++ b/DashWallet/en.lproj/Localizable.strings @@ -22,6 +22,9 @@ /* No comment provided by engineer. */ "%@ is not allowed to access Touch ID" = "%@ is not allowed to access Touch ID"; +/* Credits */ +"%@ ~ %lu contacts / %lu profile updates" = "%1$@ ~ %2$lu contacts / %3$lu profile updates"; + /* Voting */ "%ld duplicates" = "%ld duplicates"; diff --git a/DashWallet/eo.lproj/Localizable.strings b/DashWallet/eo.lproj/Localizable.strings index 58a81c7ad..978887da1 100644 --- a/DashWallet/eo.lproj/Localizable.strings +++ b/DashWallet/eo.lproj/Localizable.strings @@ -22,6 +22,9 @@ /* No comment provided by engineer. */ "%@ is not allowed to access Touch ID" = "%@ is not allowed to access Touch ID"; +/* Credits */ +"%@ ~ %lu contacts / %lu profile updates" = "%1$@ ~ %2$lu contacts / %3$lu profile updates"; + /* Voting */ "%ld duplicates" = "%ld duplicates"; diff --git a/DashWallet/es.lproj/Localizable.strings b/DashWallet/es.lproj/Localizable.strings index 51ba0b6fc..da5b17389 100644 --- a/DashWallet/es.lproj/Localizable.strings +++ b/DashWallet/es.lproj/Localizable.strings @@ -22,6 +22,9 @@ /* No comment provided by engineer. */ "%@ is not allowed to access Touch ID" = "%@ no está permitido a acceder al Touch ID"; +/* Credits */ +"%@ ~ %lu contacts / %lu profile updates" = "%1$@ ~ %2$lu contacts / %3$lu profile updates"; + /* Voting */ "%ld duplicates" = "%ld duplicados"; diff --git a/DashWallet/et.lproj/Localizable.strings b/DashWallet/et.lproj/Localizable.strings index ea2bea76e..ff983a08a 100644 --- a/DashWallet/et.lproj/Localizable.strings +++ b/DashWallet/et.lproj/Localizable.strings @@ -22,6 +22,9 @@ /* No comment provided by engineer. */ "%@ is not allowed to access Touch ID" = "%@ is not allowed to access Touch ID"; +/* Credits */ +"%@ ~ %lu contacts / %lu profile updates" = "%1$@ ~ %2$lu contacts / %3$lu profile updates"; + /* Voting */ "%ld duplicates" = "%ld duplicates"; diff --git a/DashWallet/fa.lproj/Localizable.strings b/DashWallet/fa.lproj/Localizable.strings index 30298f94f..0af94c221 100644 --- a/DashWallet/fa.lproj/Localizable.strings +++ b/DashWallet/fa.lproj/Localizable.strings @@ -22,6 +22,9 @@ /* No comment provided by engineer. */ "%@ is not allowed to access Touch ID" = "%@ is not allowed to access Touch ID"; +/* Credits */ +"%@ ~ %lu contacts / %lu profile updates" = "%1$@ ~ %2$lu contacts / %3$lu profile updates"; + /* Voting */ "%ld duplicates" = "%ld duplicates"; diff --git a/DashWallet/fi.lproj/Localizable.strings b/DashWallet/fi.lproj/Localizable.strings index c2a7c7711..b32b8f79e 100644 --- a/DashWallet/fi.lproj/Localizable.strings +++ b/DashWallet/fi.lproj/Localizable.strings @@ -22,6 +22,9 @@ /* No comment provided by engineer. */ "%@ is not allowed to access Touch ID" = "%@ is not allowed to access Touch ID"; +/* Credits */ +"%@ ~ %lu contacts / %lu profile updates" = "%1$@ ~ %2$lu contacts / %3$lu profile updates"; + /* Voting */ "%ld duplicates" = "%ld duplicates"; diff --git a/DashWallet/fil.lproj/Localizable.strings b/DashWallet/fil.lproj/Localizable.strings index b3e9a3970..c2190138b 100644 --- a/DashWallet/fil.lproj/Localizable.strings +++ b/DashWallet/fil.lproj/Localizable.strings @@ -22,6 +22,9 @@ /* No comment provided by engineer. */ "%@ is not allowed to access Touch ID" = "%@ ay hindi pinahihintulutang i-access ang Touch ID"; +/* Credits */ +"%@ ~ %lu contacts / %lu profile updates" = "%1$@ ~ %2$lu contacts / %3$lu profile updates"; + /* Voting */ "%ld duplicates" = "%ld duplicate"; diff --git a/DashWallet/fr.lproj/Localizable.strings b/DashWallet/fr.lproj/Localizable.strings index 67bb3571e..212228ee2 100644 --- a/DashWallet/fr.lproj/Localizable.strings +++ b/DashWallet/fr.lproj/Localizable.strings @@ -22,6 +22,9 @@ /* No comment provided by engineer. */ "%@ is not allowed to access Touch ID" = "%@ n'est pas autorisé à accéder à Touch ID"; +/* Credits */ +"%@ ~ %lu contacts / %lu profile updates" = "%1$@ ~ %2$lu contacts / %3$lu profile updates"; + /* Voting */ "%ld duplicates" = "%ld doublons"; diff --git a/DashWallet/hr.lproj/Localizable.strings b/DashWallet/hr.lproj/Localizable.strings index 9315bd15b..9213e5615 100644 --- a/DashWallet/hr.lproj/Localizable.strings +++ b/DashWallet/hr.lproj/Localizable.strings @@ -22,6 +22,9 @@ /* No comment provided by engineer. */ "%@ is not allowed to access Touch ID" = "%@ is not allowed to access Touch ID"; +/* Credits */ +"%@ ~ %lu contacts / %lu profile updates" = "%1$@ ~ %2$lu contacts / %3$lu profile updates"; + /* Voting */ "%ld duplicates" = "%ld duplicates"; diff --git a/DashWallet/hu.lproj/Localizable.strings b/DashWallet/hu.lproj/Localizable.strings index 1e4cc68b4..e9dee52ee 100644 --- a/DashWallet/hu.lproj/Localizable.strings +++ b/DashWallet/hu.lproj/Localizable.strings @@ -22,6 +22,9 @@ /* No comment provided by engineer. */ "%@ is not allowed to access Touch ID" = "%@ is not allowed to access Touch ID"; +/* Credits */ +"%@ ~ %lu contacts / %lu profile updates" = "%1$@ ~ %2$lu contacts / %3$lu profile updates"; + /* Voting */ "%ld duplicates" = "%ld duplicates"; diff --git a/DashWallet/id.lproj/Localizable.strings b/DashWallet/id.lproj/Localizable.strings index 3d413837e..e8019a0f8 100644 --- a/DashWallet/id.lproj/Localizable.strings +++ b/DashWallet/id.lproj/Localizable.strings @@ -22,6 +22,9 @@ /* No comment provided by engineer. */ "%@ is not allowed to access Touch ID" = "%@ tidak diizinkan mengakses Pengenal Sentuh"; +/* Credits */ +"%@ ~ %lu contacts / %lu profile updates" = "%1$@ ~ %2$lu contacts / %3$lu profile updates"; + /* Voting */ "%ld duplicates" = "%ld duplikat"; diff --git a/DashWallet/it.lproj/Localizable.strings b/DashWallet/it.lproj/Localizable.strings index 7b527d6f2..73f431cbc 100644 --- a/DashWallet/it.lproj/Localizable.strings +++ b/DashWallet/it.lproj/Localizable.strings @@ -22,6 +22,9 @@ /* No comment provided by engineer. */ "%@ is not allowed to access Touch ID" = "%@ non hai dato il permesso al sensore biometrico digitale"; +/* Credits */ +"%@ ~ %lu contacts / %lu profile updates" = "%1$@ ~ %2$lu contacts / %3$lu profile updates"; + /* Voting */ "%ld duplicates" = "%ld duplicati"; diff --git a/DashWallet/ja.lproj/Localizable.strings b/DashWallet/ja.lproj/Localizable.strings index 837fdcaf3..a57bfb7d1 100644 --- a/DashWallet/ja.lproj/Localizable.strings +++ b/DashWallet/ja.lproj/Localizable.strings @@ -22,6 +22,9 @@ /* No comment provided by engineer. */ "%@ is not allowed to access Touch ID" = "%@はTouch IDへのアクセスが許可されていません"; +/* Credits */ +"%@ ~ %lu contacts / %lu profile updates" = "%1$@ ~ %2$lu contacts / %3$lu profile updates"; + /* Voting */ "%ld duplicates" = "%ld件の重複"; diff --git a/DashWallet/ko.lproj/Localizable.strings b/DashWallet/ko.lproj/Localizable.strings index 830446325..0bf557edf 100644 --- a/DashWallet/ko.lproj/Localizable.strings +++ b/DashWallet/ko.lproj/Localizable.strings @@ -22,6 +22,9 @@ /* No comment provided by engineer. */ "%@ is not allowed to access Touch ID" = "%@게 터치 ID 접근 권한이 없습니다"; +/* Credits */ +"%@ ~ %lu contacts / %lu profile updates" = "%1$@ ~ %2$lu contacts / %3$lu profile updates"; + /* Voting */ "%ld duplicates" = "%Id 복사"; diff --git a/DashWallet/mk.lproj/Localizable.strings b/DashWallet/mk.lproj/Localizable.strings index b7f761ed1..2ecf9aeee 100644 --- a/DashWallet/mk.lproj/Localizable.strings +++ b/DashWallet/mk.lproj/Localizable.strings @@ -22,6 +22,9 @@ /* No comment provided by engineer. */ "%@ is not allowed to access Touch ID" = "%@ is not allowed to access Touch ID"; +/* Credits */ +"%@ ~ %lu contacts / %lu profile updates" = "%1$@ ~ %2$lu contacts / %3$lu profile updates"; + /* Voting */ "%ld duplicates" = "%ld duplicates"; diff --git a/DashWallet/ms.lproj/Localizable.strings b/DashWallet/ms.lproj/Localizable.strings index 02a396777..8f3bff69c 100644 --- a/DashWallet/ms.lproj/Localizable.strings +++ b/DashWallet/ms.lproj/Localizable.strings @@ -22,6 +22,9 @@ /* No comment provided by engineer. */ "%@ is not allowed to access Touch ID" = "%@ is not allowed to access Touch ID"; +/* Credits */ +"%@ ~ %lu contacts / %lu profile updates" = "%1$@ ~ %2$lu contacts / %3$lu profile updates"; + /* Voting */ "%ld duplicates" = "%ld duplicates"; diff --git a/DashWallet/nb.lproj/Localizable.strings b/DashWallet/nb.lproj/Localizable.strings index 40fc28985..de0e2d0ae 100644 --- a/DashWallet/nb.lproj/Localizable.strings +++ b/DashWallet/nb.lproj/Localizable.strings @@ -22,6 +22,9 @@ /* No comment provided by engineer. */ "%@ is not allowed to access Touch ID" = "%@ is not allowed to access Touch ID"; +/* Credits */ +"%@ ~ %lu contacts / %lu profile updates" = "%1$@ ~ %2$lu contacts / %3$lu profile updates"; + /* Voting */ "%ld duplicates" = "%ld duplicates"; diff --git a/DashWallet/nl.lproj/Localizable.strings b/DashWallet/nl.lproj/Localizable.strings index 323511bbc..34a86eacc 100644 --- a/DashWallet/nl.lproj/Localizable.strings +++ b/DashWallet/nl.lproj/Localizable.strings @@ -22,6 +22,9 @@ /* No comment provided by engineer. */ "%@ is not allowed to access Touch ID" = "%@ heeft geen toegang tot vingeridentificatie"; +/* Credits */ +"%@ ~ %lu contacts / %lu profile updates" = "%1$@ ~ %2$lu contacts / %3$lu profile updates"; + /* Voting */ "%ld duplicates" = "%ld duplicaten"; diff --git a/DashWallet/pl.lproj/Localizable.strings b/DashWallet/pl.lproj/Localizable.strings index f2f4739b5..9b80c906f 100644 --- a/DashWallet/pl.lproj/Localizable.strings +++ b/DashWallet/pl.lproj/Localizable.strings @@ -22,6 +22,9 @@ /* No comment provided by engineer. */ "%@ is not allowed to access Touch ID" = "%@ nie ma zezwolenia na dostęp do Touch ID"; +/* Credits */ +"%@ ~ %lu contacts / %lu profile updates" = "%1$@ ~ %2$lu contacts / %3$lu profile updates"; + /* Voting */ "%ld duplicates" = "%ld duplikatów"; diff --git a/DashWallet/pt.lproj/Localizable.strings b/DashWallet/pt.lproj/Localizable.strings index 4e62caf6d..f6f2bd2b2 100644 --- a/DashWallet/pt.lproj/Localizable.strings +++ b/DashWallet/pt.lproj/Localizable.strings @@ -22,6 +22,9 @@ /* No comment provided by engineer. */ "%@ is not allowed to access Touch ID" = "%@ não tem permissão para acessar Touch ID"; +/* Credits */ +"%@ ~ %lu contacts / %lu profile updates" = "%1$@ ~ %2$lu contacts / %3$lu profile updates"; + /* Voting */ "%ld duplicates" = "%ld duplicados"; diff --git a/DashWallet/ro.lproj/Localizable.strings b/DashWallet/ro.lproj/Localizable.strings index 11a7feebb..e806a78a9 100644 --- a/DashWallet/ro.lproj/Localizable.strings +++ b/DashWallet/ro.lproj/Localizable.strings @@ -22,6 +22,9 @@ /* No comment provided by engineer. */ "%@ is not allowed to access Touch ID" = "%@ is not allowed to access Touch ID"; +/* Credits */ +"%@ ~ %lu contacts / %lu profile updates" = "%1$@ ~ %2$lu contacts / %3$lu profile updates"; + /* Voting */ "%ld duplicates" = "%ld duplicates"; diff --git a/DashWallet/ru.lproj/Localizable.strings b/DashWallet/ru.lproj/Localizable.strings index 76cae23c3..a97204867 100644 --- a/DashWallet/ru.lproj/Localizable.strings +++ b/DashWallet/ru.lproj/Localizable.strings @@ -22,6 +22,9 @@ /* No comment provided by engineer. */ "%@ is not allowed to access Touch ID" = "%@ запрещен доступ к Touch ID"; +/* Credits */ +"%@ ~ %lu contacts / %lu profile updates" = "%1$@ ~ %2$lu contacts / %3$lu profile updates"; + /* Voting */ "%ld duplicates" = "%ld дубликатов"; diff --git a/DashWallet/sk.lproj/Localizable.strings b/DashWallet/sk.lproj/Localizable.strings index 4e9529f9c..862472f64 100644 --- a/DashWallet/sk.lproj/Localizable.strings +++ b/DashWallet/sk.lproj/Localizable.strings @@ -22,6 +22,9 @@ /* No comment provided by engineer. */ "%@ is not allowed to access Touch ID" = "%@ nemá povolený prístup k Touch ID"; +/* Credits */ +"%@ ~ %lu contacts / %lu profile updates" = "%1$@ ~ %2$lu contacts / %3$lu profile updates"; + /* Voting */ "%ld duplicates" = "%ld duplikátov"; diff --git a/DashWallet/sl.lproj/Localizable.strings b/DashWallet/sl.lproj/Localizable.strings index 306401eed..d07f57675 100644 --- a/DashWallet/sl.lproj/Localizable.strings +++ b/DashWallet/sl.lproj/Localizable.strings @@ -22,6 +22,9 @@ /* No comment provided by engineer. */ "%@ is not allowed to access Touch ID" = "%@ is not allowed to access Touch ID"; +/* Credits */ +"%@ ~ %lu contacts / %lu profile updates" = "%1$@ ~ %2$lu contacts / %3$lu profile updates"; + /* Voting */ "%ld duplicates" = "%ld duplicates"; diff --git a/DashWallet/sl_SI.lproj/Localizable.strings b/DashWallet/sl_SI.lproj/Localizable.strings index 9368fc5e4..eec0118de 100644 --- a/DashWallet/sl_SI.lproj/Localizable.strings +++ b/DashWallet/sl_SI.lproj/Localizable.strings @@ -22,6 +22,9 @@ /* No comment provided by engineer. */ "%@ is not allowed to access Touch ID" = "%@ is not allowed to access Touch ID"; +/* Credits */ +"%@ ~ %lu contacts / %lu profile updates" = "%1$@ ~ %2$lu contacts / %3$lu profile updates"; + /* Voting */ "%ld duplicates" = "%ld duplicates"; diff --git a/DashWallet/sq.lproj/Localizable.strings b/DashWallet/sq.lproj/Localizable.strings index 6e881de7d..e03e1f795 100644 --- a/DashWallet/sq.lproj/Localizable.strings +++ b/DashWallet/sq.lproj/Localizable.strings @@ -22,6 +22,9 @@ /* No comment provided by engineer. */ "%@ is not allowed to access Touch ID" = "%@ is not allowed to access Touch ID"; +/* Credits */ +"%@ ~ %lu contacts / %lu profile updates" = "%1$@ ~ %2$lu contacts / %3$lu profile updates"; + /* Voting */ "%ld duplicates" = "%ld duplicates"; diff --git a/DashWallet/sr.lproj/Localizable.strings b/DashWallet/sr.lproj/Localizable.strings index 5594430b0..8307bfc67 100644 --- a/DashWallet/sr.lproj/Localizable.strings +++ b/DashWallet/sr.lproj/Localizable.strings @@ -22,6 +22,9 @@ /* No comment provided by engineer. */ "%@ is not allowed to access Touch ID" = "%@ is not allowed to access Touch ID"; +/* Credits */ +"%@ ~ %lu contacts / %lu profile updates" = "%1$@ ~ %2$lu contacts / %3$lu profile updates"; + /* Voting */ "%ld duplicates" = "%ld duplicates"; diff --git a/DashWallet/sv.lproj/Localizable.strings b/DashWallet/sv.lproj/Localizable.strings index 2b15a7e04..3f2c170ec 100644 --- a/DashWallet/sv.lproj/Localizable.strings +++ b/DashWallet/sv.lproj/Localizable.strings @@ -22,6 +22,9 @@ /* No comment provided by engineer. */ "%@ is not allowed to access Touch ID" = "%@ is not allowed to access Touch ID"; +/* Credits */ +"%@ ~ %lu contacts / %lu profile updates" = "%1$@ ~ %2$lu contacts / %3$lu profile updates"; + /* Voting */ "%ld duplicates" = "%ld duplicates"; diff --git a/DashWallet/th.lproj/Localizable.strings b/DashWallet/th.lproj/Localizable.strings index 696426983..c8667dfbe 100644 --- a/DashWallet/th.lproj/Localizable.strings +++ b/DashWallet/th.lproj/Localizable.strings @@ -22,6 +22,9 @@ /* No comment provided by engineer. */ "%@ is not allowed to access Touch ID" = "%@ ไม่สามารถเข้าถึง Touch ID"; +/* Credits */ +"%@ ~ %lu contacts / %lu profile updates" = "%1$@ ~ %2$lu contacts / %3$lu profile updates"; + /* Voting */ "%ld duplicates" = "%ld ซ้ำ"; diff --git a/DashWallet/tr.lproj/Localizable.strings b/DashWallet/tr.lproj/Localizable.strings index cef77f4a4..5063e6dd2 100644 --- a/DashWallet/tr.lproj/Localizable.strings +++ b/DashWallet/tr.lproj/Localizable.strings @@ -22,6 +22,9 @@ /* No comment provided by engineer. */ "%@ is not allowed to access Touch ID" = "%@ Dokunmatik Kimliğe erişim izni verilmiyor"; +/* Credits */ +"%@ ~ %lu contacts / %lu profile updates" = "%1$@ ~ %2$lu contacts / %3$lu profile updates"; + /* Voting */ "%ld duplicates" = "%ld kopyalar"; diff --git a/DashWallet/uk.lproj/Localizable.strings b/DashWallet/uk.lproj/Localizable.strings index 58b2a37cb..d4c242d7d 100644 --- a/DashWallet/uk.lproj/Localizable.strings +++ b/DashWallet/uk.lproj/Localizable.strings @@ -22,6 +22,9 @@ /* No comment provided by engineer. */ "%@ is not allowed to access Touch ID" = "%@ не має доступу до Touch ID"; +/* Credits */ +"%@ ~ %lu contacts / %lu profile updates" = "%1$@ ~ %2$lu contacts / %3$lu profile updates"; + /* Voting */ "%ld duplicates" = "%Ід дублікатів"; diff --git a/DashWallet/vi.lproj/Localizable.strings b/DashWallet/vi.lproj/Localizable.strings index 85685eaba..cdf0fb9bf 100644 --- a/DashWallet/vi.lproj/Localizable.strings +++ b/DashWallet/vi.lproj/Localizable.strings @@ -22,6 +22,9 @@ /* No comment provided by engineer. */ "%@ is not allowed to access Touch ID" = "%@ không được cho phép truy cập chức năng Touch ID"; +/* Credits */ +"%@ ~ %lu contacts / %lu profile updates" = "%1$@ ~ %2$lu contacts / %3$lu profile updates"; + /* Voting */ "%ld duplicates" = "%ld duplicates"; diff --git a/DashWallet/zh-Hans.lproj/Localizable.strings b/DashWallet/zh-Hans.lproj/Localizable.strings index 23bc7b4f7..b645943c0 100644 --- a/DashWallet/zh-Hans.lproj/Localizable.strings +++ b/DashWallet/zh-Hans.lproj/Localizable.strings @@ -22,6 +22,9 @@ /* No comment provided by engineer. */ "%@ is not allowed to access Touch ID" = "%@ is not allowed to access Touch ID"; +/* Credits */ +"%@ ~ %lu contacts / %lu profile updates" = "%1$@ ~ %2$lu contacts / %3$lu profile updates"; + /* Voting */ "%ld duplicates" = "%ld duplicates"; diff --git a/DashWallet/zh-Hant-TW.lproj/Localizable.strings b/DashWallet/zh-Hant-TW.lproj/Localizable.strings index 6fcafb30d..e0232d0b2 100644 --- a/DashWallet/zh-Hant-TW.lproj/Localizable.strings +++ b/DashWallet/zh-Hant-TW.lproj/Localizable.strings @@ -22,6 +22,9 @@ /* No comment provided by engineer. */ "%@ is not allowed to access Touch ID" = "%@ is not allowed to access Touch ID"; +/* Credits */ +"%@ ~ %lu contacts / %lu profile updates" = "%1$@ ~ %2$lu contacts / %3$lu profile updates"; + /* Voting */ "%ld duplicates" = "%ld duplicates"; diff --git a/DashWallet/zh.lproj/Localizable.strings b/DashWallet/zh.lproj/Localizable.strings index 4452cdc9a..c8d10d045 100644 --- a/DashWallet/zh.lproj/Localizable.strings +++ b/DashWallet/zh.lproj/Localizable.strings @@ -22,6 +22,9 @@ /* No comment provided by engineer. */ "%@ is not allowed to access Touch ID" = "%@ 不被允许访问指纹识别"; +/* Credits */ +"%@ ~ %lu contacts / %lu profile updates" = "%1$@ ~ %2$lu contacts / %3$lu profile updates"; + /* Voting */ "%ld duplicates" = "%ld 重复项"; diff --git a/DashWallet/zh_TW.lproj/Localizable.strings b/DashWallet/zh_TW.lproj/Localizable.strings index c5b996b5f..a47554ab5 100644 --- a/DashWallet/zh_TW.lproj/Localizable.strings +++ b/DashWallet/zh_TW.lproj/Localizable.strings @@ -22,6 +22,9 @@ /* No comment provided by engineer. */ "%@ is not allowed to access Touch ID" = "%@ 不允許訪問Touch ID"; +/* Credits */ +"%@ ~ %lu contacts / %lu profile updates" = "%1$@ ~ %2$lu contacts / %3$lu profile updates"; + /* Voting */ "%ld duplicates" = "%ld 重複項目";