From 9ea44b68549bfb77a413116be953c2fbfe9425d0 Mon Sep 17 00:00:00 2001 From: mike-dydx <149746839+mike-dydx@users.noreply.github.com> Date: Mon, 23 Sep 2024 13:50:32 -0400 Subject: [PATCH] CLI-624: move alerts out of tab navigation into to settings (#255) * move alerts routing to settings screen * showing alerts * rename & delete old files * add back button * conditionally hide/show alerts based on onboarding status and feature flag * rename * rename again * move tab config out of json * improve tab bar gradient and app theme update propagation --------- Co-authored-by: Mike --- .../RoutingTabBarController.swift | 73 +++------ .../UIToolkits/_View/GradientView.swift | 71 ++++---- .../dydxPresenters.xcodeproj/project.pbxproj | 108 ++++++------- .../_Features/routing_swiftui.json | 4 +- .../dydxPresenters/_Features/tabs_v4.json | 2 +- .../_Features/tabs_v4_vault.json | 8 +- .../dydxFrontendAlertsProvider.swift | 0 .../Providers/dydxSystemAlertsProvider.swift | 0 .../dydxTransferAlertsProvider.swift | 0 .../AlertProvider/dydxAlertsProvider.swift | 0 .../_v4/Alerts/dydxAlertsViewBuilder.swift | 63 ++++++++ ...ncelPendingIsolatedOrdersViewBuilder.swift | 4 +- .../dydxMarketInfoViewBuilder.swift | 2 +- .../Components/dydxAlertsViewPresenter.swift | 39 ----- .../dydxNewsAlertsViewBuilder.swift | 78 --------- ...ProfileSecondaryButtonsViewPresenter.swift | 47 ++++++ .../dydxSettingsHelpRowViewPresenter.swift | 34 ---- .../_v4/Profile/dydxProfileViewBuilder.swift | 6 +- .../_v4/Rating/dydxRateAppViewBuilder.swift | 4 +- .../_v4/RootTab/dydxV4TabBarBuilder.swift | 82 ++++++---- .../dydxViews.xcodeproj/project.pbxproj | 18 +-- .../icon_earn.imageset/Contents.json | 12 ++ .../icon_earn.imageset/icon_earn.pdf | Bin 0 -> 2588 bytes .../icon_market.imageset/Contents.json | 2 +- .../icon_market.imageset/Vector-23.pdf | Bin 2977 -> 0 bytes .../icon_market.imageset/icon_market.pdf | Bin 0 -> 1481 bytes .../icon_portfolio.imageset/Contents.json | 12 ++ .../icon_portfolio.pdf | Bin 0 -> 1453 bytes .../icon_profile.imageset/Contents.json | 2 +- .../icon_profile.imageset/Vector-25.pdf | Bin 1912 -> 0 bytes .../icon_profile.imageset/icon_profile.pdf | Bin 0 -> 1249 bytes .../HostingViewController.swift | 30 ++-- .../dydxViews/Themes/dydxThemes.swift | 8 +- .../Components/Alerts/dydxAlertItem.swift | 0 .../Components/Alerts/dydxAlertsView.swift | 99 ++++++++++++ .../dydxViews/_v4/Auth/dydxSecurityView.swift | 2 +- .../Components/Alerts/dydxAlertsView.swift | 54 ------- .../_v4/NewsAlerts/dydxNewsAlertsView.swift | 151 ------------------ ... => dydxProfileSecondaryButtonsView.swift} | 60 ++++--- .../_v4/Profile/dydxProfileView.swift | 4 +- .../dydxViews/_v4/Update/dydxUpdateView.swift | 2 +- 41 files changed, 484 insertions(+), 597 deletions(-) rename dydx/dydxPresenters/dydxPresenters/_v4/{NewsAlerts => Alerts}/AlertProvider/Providers/dydxFrontendAlertsProvider.swift (100%) rename dydx/dydxPresenters/dydxPresenters/_v4/{NewsAlerts => Alerts}/AlertProvider/Providers/dydxSystemAlertsProvider.swift (100%) rename dydx/dydxPresenters/dydxPresenters/_v4/{NewsAlerts => Alerts}/AlertProvider/Providers/dydxTransferAlertsProvider.swift (100%) rename dydx/dydxPresenters/dydxPresenters/_v4/{NewsAlerts => Alerts}/AlertProvider/dydxAlertsProvider.swift (100%) create mode 100644 dydx/dydxPresenters/dydxPresenters/_v4/Alerts/dydxAlertsViewBuilder.swift delete mode 100644 dydx/dydxPresenters/dydxPresenters/_v4/NewsAlerts/Components/dydxAlertsViewPresenter.swift delete mode 100644 dydx/dydxPresenters/dydxPresenters/_v4/NewsAlerts/dydxNewsAlertsViewBuilder.swift create mode 100644 dydx/dydxPresenters/dydxPresenters/_v4/Profile/Components/dydxProfileSecondaryButtonsViewPresenter.swift delete mode 100644 dydx/dydxPresenters/dydxPresenters/_v4/Profile/Components/dydxSettingsHelpRowViewPresenter.swift create mode 100644 dydx/dydxViews/dydxViews/Media.xcassets/icon_earn.imageset/Contents.json create mode 100644 dydx/dydxViews/dydxViews/Media.xcassets/icon_earn.imageset/icon_earn.pdf delete mode 100644 dydx/dydxViews/dydxViews/Media.xcassets/icon_market.imageset/Vector-23.pdf create mode 100644 dydx/dydxViews/dydxViews/Media.xcassets/icon_market.imageset/icon_market.pdf create mode 100644 dydx/dydxViews/dydxViews/Media.xcassets/icon_portfolio.imageset/Contents.json create mode 100644 dydx/dydxViews/dydxViews/Media.xcassets/icon_portfolio.imageset/icon_portfolio.pdf delete mode 100644 dydx/dydxViews/dydxViews/Media.xcassets/icon_profile.imageset/Vector-25.pdf create mode 100644 dydx/dydxViews/dydxViews/Media.xcassets/icon_profile.imageset/icon_profile.pdf rename dydx/dydxViews/dydxViews/_v4/{NewsAlerts => Alerts}/Components/Alerts/dydxAlertItem.swift (100%) create mode 100644 dydx/dydxViews/dydxViews/_v4/Alerts/Components/Alerts/dydxAlertsView.swift delete mode 100644 dydx/dydxViews/dydxViews/_v4/NewsAlerts/Components/Alerts/dydxAlertsView.swift delete mode 100644 dydx/dydxViews/dydxViews/_v4/NewsAlerts/dydxNewsAlertsView.swift rename dydx/dydxViews/dydxViews/_v4/Profile/Components/{dydxSettingsHelpRowView.swift => dydxProfileSecondaryButtonsView.swift} (53%) diff --git a/PlatformRouting/PlatformRouting/_ViewController/RoutingTabBarController.swift b/PlatformRouting/PlatformRouting/_ViewController/RoutingTabBarController.swift index 78219de3..3cf9a5de 100644 --- a/PlatformRouting/PlatformRouting/_ViewController/RoutingTabBarController.swift +++ b/PlatformRouting/PlatformRouting/_ViewController/RoutingTabBarController.swift @@ -52,16 +52,6 @@ open class RoutingTabBarController: UITabBarController, ParsingProtocol { private var actionPath: String? - @IBInspectable open var routingMap: String? { - didSet { - if routingMap != oldValue { - if let destinations = parser.asArray(JsonLoader.load(bundles: Bundle.particles, fileName: routingMap)) { - parse(array: destinations) - } - } - } - } - var previousController: UIViewController? override open func viewDidLoad() { @@ -104,18 +94,6 @@ open class RoutingTabBarController: UITabBarController, ParsingProtocol { } } - public func parse(array: [Any]) { - if let data = array as? [[String: Any]] { - var maps = [TabbarItemInfo]() - for dictionary in data { - let routing = TabbarItemInfo() - routing.parse(dictionary: dictionary) - maps.append(routing) - } - self.maps = maps - } - } - open func diff(current: [TabbarItemInfo], old: [TabbarItemInfo]) -> Diff { return old.diff(current) { (object1, object2) -> Bool in object1.path == object2.path @@ -160,8 +138,8 @@ open class RoutingTabBarController: UITabBarController, ParsingProtocol { } private func path(info: TabbarItemInfo) -> String? { - if let router = Router.shared as? MappedUIKitRouter, let path = info.path { - let request = RoutingRequest(path: path) + if let router = Router.shared as? MappedUIKitRouter { + let request = RoutingRequest(path: info.path) return router.transform(request: request).path } else { return nil @@ -225,13 +203,11 @@ open class RoutingTabBarController: UITabBarController, ParsingProtocol { private func setup(viewController: UIViewController, info: TabbarItemInfo) { let tabbarItem = UITabBarItem() - tabbarItem.title = info.title?.localized ?? " " - if let image = info.image { - tabbarItem.image = UIImage.named(image, bundles: Bundle.particles) - } - if let selected = info.selected { - tabbarItem.selectedImage = UIImage.named(selected, bundles: Bundle.particles) - } + tabbarItem.title = info.title + tabbarItem.image = UIImage.named(info.image, bundles: Bundle.particles) +// if let selected = info.selected { +// tabbarItem.selectedImage = UIImage.named(selected, bundles: Bundle.particles) +// } viewController.tabBarItem = tabbarItem } @@ -241,11 +217,7 @@ open class RoutingTabBarController: UITabBarController, ParsingProtocol { let viewController = viewControllers[i] if let tabbarItem = viewController.tabBarItem { let map = maps[i] - if let path = map.path { - tabbarItem.badgeValue = badging?.badge(for: path) - } else { - tabbarItem.badgeValue = nil - } + tabbarItem.badgeValue = badging?.badge(for: map.path) } } } @@ -276,24 +248,21 @@ open class RoutingTabBarController: UITabBarController, ParsingProtocol { } } -public class TabbarItemInfo: NSObject, ParsingProtocol { - override open var parser: Parser { - return RoutingTabBarController.parserOverwrite ?? super.parser +public struct TabbarItemInfo: Equatable { + public init(path: String, + title: String?, + image: String, + split: Bool) { + self.path = path + self.title = title + self.image = image + self.split = split } - - public var path: String? + + public var path: String public var title: String? - public var image: String? - public var selected: String? - public var split: Bool? - - public func parse(dictionary: [String: Any]) { - path = parser.asString(dictionary["path"]) - title = parser.asString(dictionary["title"]) - image = parser.asString(dictionary["image"]) - selected = parser.asString(dictionary["selected"]) - split = parser.asBoolean(dictionary["split"])?.boolValue - } + public var image: String + public var split: Bool } extension RoutingTabBarController: UITabBarControllerDelegate { diff --git a/UIToolkits/UIToolkits/_View/GradientView.swift b/UIToolkits/UIToolkits/_View/GradientView.swift index 09e86548..12a8170a 100644 --- a/UIToolkits/UIToolkits/_View/GradientView.swift +++ b/UIToolkits/UIToolkits/_View/GradientView.swift @@ -2,45 +2,58 @@ // GradientView.swift // UIToolkits // -// Created by Qiang Huang on 9/6/21. -// Copyright © 2021 dYdX. All rights reserved. +// Created by Mike Maguire on 9/20/24. +// Copyright © 2024 dYdX. All rights reserved. // import UIKit -@objc public class GradientView: UIView { - override open class var layerClass: AnyClass { - return CAGradientLayer.classForCoder() +public class GradientView: UIView { + + // Configurable properties + public var gradientColors: [UIColor] { + didSet { + gradientLayer.colors = gradientColors.map { $0.cgColor } + } } - @IBInspectable var startColor: UIColor? - @IBInspectable var endColor: UIColor? - - private var gradientLayer: CAGradientLayer? { - return layer as? CAGradientLayer + private let startPoint: CGPoint + private let endPoint: CGPoint + private let gradientLayer = CAGradientLayer() + + // Initializers + public init(gradientColors: [UIColor], + startPoint: CGPoint = CGPoint(x: 0.5, y: 0), + endPoint: CGPoint = CGPoint(x: 0.5, y: 1)) { + self.gradientColors = gradientColors + self.startPoint = startPoint + self.endPoint = endPoint + super.init(frame: .zero) + setupGradientLayer() } - - required init?(coder aDecoder: NSCoder) { - super.init(coder: aDecoder) + + required init?(coder: NSCoder) { + fatalError("init(coder:) has not been implemented") } - - public override func awakeFromNib() { - super.awakeFromNib() - gradientLayer?.startPoint = CGPoint(x: 0.0, y: 0.5) - gradientLayer?.endPoint = CGPoint(x: 1.0, y: 0.5) - setupLayer() + + // Setup gradient layer + private func setupGradientLayer() { + gradientLayer.colors = gradientColors.map { $0.cgColor } + gradientLayer.startPoint = startPoint + gradientLayer.endPoint = endPoint + layer.insertSublayer(gradientLayer, at: 0) } - - public func set(startColor: UIColor?, endColor: UIColor?) { - self.startColor = startColor - self.endColor = endColor - setupLayer() + + // Adjust gradient layer's frame when the view's bounds change + public override func layoutSubviews() { + super.layoutSubviews() + gradientLayer.frame = bounds } - private func setupLayer() { - if let startColor = startColor, let endColor = endColor { - gradientLayer?.colors = [startColor.cgColor, endColor.cgColor] - } else { - gradientLayer?.colors = nil + public override func traitCollectionDidChange(_ previousTraitCollection: UITraitCollection?) { + super.traitCollectionDidChange(previousTraitCollection) + if traitCollection.hasDifferentColorAppearance(comparedTo: previousTraitCollection) { + setupGradientLayer() } } } + diff --git a/dydx/dydxPresenters/dydxPresenters.xcodeproj/project.pbxproj b/dydx/dydxPresenters/dydxPresenters.xcodeproj/project.pbxproj index 8fb624e5..19aba941 100644 --- a/dydx/dydxPresenters/dydxPresenters.xcodeproj/project.pbxproj +++ b/dydx/dydxPresenters/dydxPresenters.xcodeproj/project.pbxproj @@ -17,7 +17,6 @@ 0216441128F36FBE00C7093E /* CandleDataPoint.swift in Sources */ = {isa = PBXBuildFile; fileRef = 0216441028F36FBE00C7093E /* CandleDataPoint.swift */; }; 021B68B12AD9B86600C5C3BF /* dydxSecurityViewPresenter.swift in Sources */ = {isa = PBXBuildFile; fileRef = 021B68A42AD9B86600C5C3BF /* dydxSecurityViewPresenter.swift */; }; 02282E752AC8860300BC9F01 /* dydxOrderbookGroupViewPresenter.swift in Sources */ = {isa = PBXBuildFile; fileRef = 02282E742AC8860300BC9F01 /* dydxOrderbookGroupViewPresenter.swift */; }; - 022A24522A03088B003A385E /* dydxAlertsViewPresenter.swift in Sources */ = {isa = PBXBuildFile; fileRef = 022A24512A03088B003A385E /* dydxAlertsViewPresenter.swift */; }; 0230376F28C11BE600412B72 /* dydxMarketsViewBuilder.swift in Sources */ = {isa = PBXBuildFile; fileRef = 0230376E28C11BE600412B72 /* dydxMarketsViewBuilder.swift */; }; 0236F0CB2968793A00EB995F /* dydxPortfolioFillsViewPresenter.swift in Sources */ = {isa = PBXBuildFile; fileRef = 0236F0CA2968793A00EB995F /* dydxPortfolioFillsViewPresenter.swift */; }; 0236F113296A9D7A00EB995F /* dydxPortfolioFundingViewPresenter.swift in Sources */ = {isa = PBXBuildFile; fileRef = 0236F112296A9D7A00EB995F /* dydxPortfolioFundingViewPresenter.swift */; }; @@ -57,7 +56,6 @@ 0257C78E2A00485500F6160B /* SparklineDataPoint.swift in Sources */ = {isa = PBXBuildFile; fileRef = 0257C78D2A00485500F6160B /* SparklineDataPoint.swift */; }; 025841F228EE9D7C007338D3 /* dydxMarketAssetListViewPresenter.swift in Sources */ = {isa = PBXBuildFile; fileRef = 025841F128EE9D7C007338D3 /* dydxMarketAssetListViewPresenter.swift */; }; 025841F428EE9DE8007338D3 /* dydxAssetItemChartViewPresenter.swift in Sources */ = {isa = PBXBuildFile; fileRef = 025841F328EE9DE8007338D3 /* dydxAssetItemChartViewPresenter.swift */; }; - 0258B9E72991BC900098E1BE /* dydxNewsAlertsViewBuilder.swift in Sources */ = {isa = PBXBuildFile; fileRef = 0258B9E62991BC900098E1BE /* dydxNewsAlertsViewBuilder.swift */; }; 0258BA23299294BF0098E1BE /* dydxProfileViewBuilder.swift in Sources */ = {isa = PBXBuildFile; fileRef = 0258BA22299294BF0098E1BE /* dydxProfileViewBuilder.swift */; }; 0258BA2929929E870098E1BE /* dydxProfileButtonsViewPresenter.swift in Sources */ = {isa = PBXBuildFile; fileRef = 0258BA2829929E870098E1BE /* dydxProfileButtonsViewPresenter.swift */; }; 025D22D628F65E1B00C4ADAE /* dydxMarketStatsViewPresenter.swift in Sources */ = {isa = PBXBuildFile; fileRef = 025D22D528F65E1B00C4ADAE /* dydxMarketStatsViewPresenter.swift */; }; @@ -82,7 +80,6 @@ 0280B3A629CB63E10017D64A /* dydxOnboardWelcomeViewBuilder.swift in Sources */ = {isa = PBXBuildFile; fileRef = 0280B3A529CB63E10017D64A /* dydxOnboardWelcomeViewBuilder.swift */; }; 0284202F29AD727200C0E7CC /* dydxViews.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = 0284201F29AD725000C0E7CC /* dydxViews.framework */; }; 02860A9F29C15E760079E644 /* dydxOnboardScanViewBuilder.swift in Sources */ = {isa = PBXBuildFile; fileRef = 02860A9329C15E760079E644 /* dydxOnboardScanViewBuilder.swift */; }; - 028AC6A42A5E564B00FE0891 /* dydxTransferAlertsProvider.swift in Sources */ = {isa = PBXBuildFile; fileRef = 028AC6A32A5E564B00FE0891 /* dydxTransferAlertsProvider.swift */; }; 028DB3402A05893D0090BE58 /* dydxProfileHeaderViewPresenter.swift in Sources */ = {isa = PBXBuildFile; fileRef = 028DB33F2A05893D0090BE58 /* dydxProfileHeaderViewPresenter.swift */; }; 028FB3EC2AD642B30013136C /* dydxTokenConstants.swift in Sources */ = {isa = PBXBuildFile; fileRef = 028FB3EB2AD642B30013136C /* dydxTokenConstants.swift */; }; 0295392329FB256E009026E3 /* dydxThemeViewBuilder.swift in Sources */ = {isa = PBXBuildFile; fileRef = 0295392229FB256E009026E3 /* dydxThemeViewBuilder.swift */; }; @@ -93,8 +90,6 @@ 029E0E8729AD9BA500FE271C /* PlatformParticles.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = 029E0E7829AD9B8700FE271C /* PlatformParticles.framework */; }; 029E11A029ADB77E00FE271C /* dydxChart.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = 029E119329ADB77300FE271C /* dydxChart.framework */; }; 02A134C129A5A14700B13E83 /* dydxClosePositionHeaderViewPresenter.swift in Sources */ = {isa = PBXBuildFile; fileRef = 02A134C029A5A14700B13E83 /* dydxClosePositionHeaderViewPresenter.swift */; }; - 02A565AF2A5E310B0035469F /* dydxAlertsProvider.swift in Sources */ = {isa = PBXBuildFile; fileRef = 02A565AE2A5E310B0035469F /* dydxAlertsProvider.swift */; }; - 02A565B22A5E32790035469F /* dydxSystemAlertsProvider.swift in Sources */ = {isa = PBXBuildFile; fileRef = 02A565B12A5E32790035469F /* dydxSystemAlertsProvider.swift */; }; 02A5C85E297FBCD700FFE1F9 /* dydxTransferViewBuilder.swift in Sources */ = {isa = PBXBuildFile; fileRef = 02A5C85D297FBCD700FFE1F9 /* dydxTransferViewBuilder.swift */; }; 02A8980628E76175006F1658 /* dydxStateManager.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = 02E7DD9728CFB30000727949 /* dydxStateManager.framework */; platformFilter = ios; }; 02B27A492AE8BC7600A995EC /* dydxHelpViewPresenter.swift in Sources */ = {isa = PBXBuildFile; fileRef = 02B27A482AE8BC7600A995EC /* dydxHelpViewPresenter.swift */; }; @@ -145,6 +140,11 @@ 2749F8FF2B853B8700D6BA16 /* dydxRewardsLaunchIncentivesPresenter.swift in Sources */ = {isa = PBXBuildFile; fileRef = 2749F8FE2B853B8700D6BA16 /* dydxRewardsLaunchIncentivesPresenter.swift */; }; 2751D6432C59614C00B36F95 /* tabs_v4_vault.json in Resources */ = {isa = PBXBuildFile; fileRef = 2751D6352C59614C00B36F95 /* tabs_v4_vault.json */; }; 2751D6462C59643800B36F95 /* dydxVaultViewBuilder.swift in Sources */ = {isa = PBXBuildFile; fileRef = 2751D6452C59643800B36F95 /* dydxVaultViewBuilder.swift */; }; + 27592DF82C9A54D6002FBD4B /* dydxFrontendAlertsProvider.swift in Sources */ = {isa = PBXBuildFile; fileRef = 27592DEE2C9A54D6002FBD4B /* dydxFrontendAlertsProvider.swift */; }; + 27592DF92C9A54D6002FBD4B /* dydxSystemAlertsProvider.swift in Sources */ = {isa = PBXBuildFile; fileRef = 27592DEF2C9A54D6002FBD4B /* dydxSystemAlertsProvider.swift */; }; + 27592DFA2C9A54D6002FBD4B /* dydxTransferAlertsProvider.swift in Sources */ = {isa = PBXBuildFile; fileRef = 27592DF02C9A54D6002FBD4B /* dydxTransferAlertsProvider.swift */; }; + 27592DFB2C9A54D6002FBD4B /* dydxAlertsProvider.swift in Sources */ = {isa = PBXBuildFile; fileRef = 27592DF22C9A54D6002FBD4B /* dydxAlertsProvider.swift */; }; + 27592E052C9A57D4002FBD4B /* dydxAlertsViewBuilder.swift in Sources */ = {isa = PBXBuildFile; fileRef = 27592E042C9A57D4002FBD4B /* dydxAlertsViewBuilder.swift */; }; 276908FF2AAFB22F0075B2D6 /* dydxPortfolioTransfersViewPresenter.swift in Sources */ = {isa = PBXBuildFile; fileRef = 276908FE2AAFB22F0075B2D6 /* dydxPortfolioTransfersViewPresenter.swift */; }; 277754352C069F8600E3E985 /* OnboardingAnalytics.swift in Sources */ = {isa = PBXBuildFile; fileRef = 277754282C069F8600E3E985 /* OnboardingAnalytics.swift */; }; 277987512BA33F15006DC5CD /* dydxSelectedMarketStore.swift in Sources */ = {isa = PBXBuildFile; fileRef = 277987502BA33F15006DC5CD /* dydxSelectedMarketStore.swift */; }; @@ -162,7 +162,7 @@ 278EA5642BB610AC007A0E17 /* dydxNotificationsSettingsViewBuilder.swift in Sources */ = {isa = PBXBuildFile; fileRef = 278EA5632BB610AC007A0E17 /* dydxNotificationsSettingsViewBuilder.swift */; }; 278EA5662BB61C24007A0E17 /* KeyValueStoreProtocolStore+Ext.swift in Sources */ = {isa = PBXBuildFile; fileRef = 278EA5652BB61C24007A0E17 /* KeyValueStoreProtocolStore+Ext.swift */; }; 27B957ED2B97C07400EF9304 /* dydxShareActionBuilder.swift in Sources */ = {isa = PBXBuildFile; fileRef = 27B957EC2B97C07400EF9304 /* dydxShareActionBuilder.swift */; }; - 27C027532AFD761300E92CCB /* dydxSettingsHelpRowViewPresenter.swift in Sources */ = {isa = PBXBuildFile; fileRef = 27C027522AFD761300E92CCB /* dydxSettingsHelpRowViewPresenter.swift */; }; + 27C027532AFD761300E92CCB /* dydxProfileSecondaryButtonsViewPresenter.swift in Sources */ = {isa = PBXBuildFile; fileRef = 27C027522AFD761300E92CCB /* dydxProfileSecondaryButtonsViewPresenter.swift */; }; 27DB2EA32AC1E7B20047BC39 /* dydxTradeRestrictedViewPresenter.swift in Sources */ = {isa = PBXBuildFile; fileRef = 27DB2EA22AC1E7B20047BC39 /* dydxTradeRestrictedViewPresenter.swift */; }; 27E0735C2C20D2470034B963 /* dydxCancelPendingIsolatedOrdersViewBuilder.swift in Sources */ = {isa = PBXBuildFile; fileRef = 27E0735B2C20D2470034B963 /* dydxCancelPendingIsolatedOrdersViewBuilder.swift */; }; 314BBDE9F332ECA910BC414E /* Pods_iOS_dydxPresenters.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = F1551C00FFF41C29CFC5BD94 /* Pods_iOS_dydxPresenters.framework */; }; @@ -172,7 +172,6 @@ 6453A7D2299C563F0041A0C4 /* dydxClosePositionInputViewBuilder.swift in Sources */ = {isa = PBXBuildFile; fileRef = 6453A7D1299C563F0041A0C4 /* dydxClosePositionInputViewBuilder.swift */; }; 6453AB26299D98110041A0C4 /* dydxClosePositionInputEditPresenter.swift in Sources */ = {isa = PBXBuildFile; fileRef = 6453AB25299D98110041A0C4 /* dydxClosePositionInputEditPresenter.swift */; }; 6453AB2B299EA4380041A0C4 /* dydxClosePositionInputCtaButtonViewPresenter.swift in Sources */ = {isa = PBXBuildFile; fileRef = 6453AB2A299EA4380041A0C4 /* dydxClosePositionInputCtaButtonViewPresenter.swift */; }; - 647D0F152A9FB1C600DA7815 /* dydxFrontendAlertsProvider.swift in Sources */ = {isa = PBXBuildFile; fileRef = 647D0F142A9FB1C600DA7815 /* dydxFrontendAlertsProvider.swift */; }; 6488BBC7296F2CD50096502F /* AbacusUtils.swift in Sources */ = {isa = PBXBuildFile; fileRef = 6488BBC6296F2CD50096502F /* AbacusUtils.swift */; }; 6496DBC9295CBBDD00174CE7 /* dydxV4TabBarBuilder.swift in Sources */ = {isa = PBXBuildFile; fileRef = 6496DBC8295CBBDD00174CE7 /* dydxV4TabBarBuilder.swift */; }; 6496DC39295E081300174CE7 /* dydxPortfolioViewBuilder.swift in Sources */ = {isa = PBXBuildFile; fileRef = 6496DC38295E081300174CE7 /* dydxPortfolioViewBuilder.swift */; }; @@ -408,7 +407,6 @@ 0216441028F36FBE00C7093E /* CandleDataPoint.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = CandleDataPoint.swift; sourceTree = ""; }; 021B68A42AD9B86600C5C3BF /* dydxSecurityViewPresenter.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = dydxSecurityViewPresenter.swift; sourceTree = ""; }; 02282E742AC8860300BC9F01 /* dydxOrderbookGroupViewPresenter.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = dydxOrderbookGroupViewPresenter.swift; sourceTree = ""; }; - 022A24512A03088B003A385E /* dydxAlertsViewPresenter.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = dydxAlertsViewPresenter.swift; sourceTree = ""; }; 0230376E28C11BE600412B72 /* dydxMarketsViewBuilder.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = dydxMarketsViewBuilder.swift; sourceTree = ""; }; 0236F0CA2968793A00EB995F /* dydxPortfolioFillsViewPresenter.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = dydxPortfolioFillsViewPresenter.swift; sourceTree = ""; }; 0236F112296A9D7A00EB995F /* dydxPortfolioFundingViewPresenter.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = dydxPortfolioFundingViewPresenter.swift; sourceTree = ""; }; @@ -449,7 +447,6 @@ 0257C78D2A00485500F6160B /* SparklineDataPoint.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = SparklineDataPoint.swift; sourceTree = ""; }; 025841F128EE9D7C007338D3 /* dydxMarketAssetListViewPresenter.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = dydxMarketAssetListViewPresenter.swift; sourceTree = ""; }; 025841F328EE9DE8007338D3 /* dydxAssetItemChartViewPresenter.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = dydxAssetItemChartViewPresenter.swift; sourceTree = ""; }; - 0258B9E62991BC900098E1BE /* dydxNewsAlertsViewBuilder.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = dydxNewsAlertsViewBuilder.swift; sourceTree = ""; }; 0258BA22299294BF0098E1BE /* dydxProfileViewBuilder.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = dydxProfileViewBuilder.swift; sourceTree = ""; }; 0258BA2829929E870098E1BE /* dydxProfileButtonsViewPresenter.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = dydxProfileButtonsViewPresenter.swift; sourceTree = ""; }; 025D22D528F65E1B00C4ADAE /* dydxMarketStatsViewPresenter.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = dydxMarketStatsViewPresenter.swift; sourceTree = ""; }; @@ -474,7 +471,6 @@ 0280B3A529CB63E10017D64A /* dydxOnboardWelcomeViewBuilder.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = dydxOnboardWelcomeViewBuilder.swift; sourceTree = ""; }; 0284201929AD725000C0E7CC /* dydxViews.xcodeproj */ = {isa = PBXFileReference; lastKnownFileType = "wrapper.pb-project"; name = dydxViews.xcodeproj; path = ../dydxViews/dydxViews.xcodeproj; sourceTree = ""; }; 02860A9329C15E760079E644 /* dydxOnboardScanViewBuilder.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = dydxOnboardScanViewBuilder.swift; sourceTree = ""; }; - 028AC6A32A5E564B00FE0891 /* dydxTransferAlertsProvider.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = dydxTransferAlertsProvider.swift; sourceTree = ""; }; 028DB33F2A05893D0090BE58 /* dydxProfileHeaderViewPresenter.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = dydxProfileHeaderViewPresenter.swift; sourceTree = ""; }; 028FB3EB2AD642B30013136C /* dydxTokenConstants.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = dydxTokenConstants.swift; sourceTree = ""; }; 0295392229FB256E009026E3 /* dydxThemeViewBuilder.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = dydxThemeViewBuilder.swift; sourceTree = ""; }; @@ -485,8 +481,6 @@ 029E0E6D29AD9B8600FE271C /* PlatformParticles.xcodeproj */ = {isa = PBXFileReference; lastKnownFileType = "wrapper.pb-project"; name = PlatformParticles.xcodeproj; path = ../../PlatformParticles/PlatformParticles.xcodeproj; sourceTree = ""; }; 029E118D29ADB77300FE271C /* dydxChart.xcodeproj */ = {isa = PBXFileReference; lastKnownFileType = "wrapper.pb-project"; name = dydxChart.xcodeproj; path = ../dydxChart/dydxChart.xcodeproj; sourceTree = ""; }; 02A134C029A5A14700B13E83 /* dydxClosePositionHeaderViewPresenter.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = dydxClosePositionHeaderViewPresenter.swift; sourceTree = ""; }; - 02A565AE2A5E310B0035469F /* dydxAlertsProvider.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = dydxAlertsProvider.swift; sourceTree = ""; }; - 02A565B12A5E32790035469F /* dydxSystemAlertsProvider.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = dydxSystemAlertsProvider.swift; sourceTree = ""; }; 02A5C85D297FBCD700FFE1F9 /* dydxTransferViewBuilder.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = dydxTransferViewBuilder.swift; sourceTree = ""; }; 02B27A482AE8BC7600A995EC /* dydxHelpViewPresenter.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = dydxHelpViewPresenter.swift; sourceTree = ""; }; 02B6CE742A7087A700C5F088 /* dydxTransferSubaccountWorker.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = dydxTransferSubaccountWorker.swift; sourceTree = ""; }; @@ -538,6 +532,11 @@ 2749F8FE2B853B8700D6BA16 /* dydxRewardsLaunchIncentivesPresenter.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = dydxRewardsLaunchIncentivesPresenter.swift; sourceTree = ""; }; 2751D6352C59614C00B36F95 /* tabs_v4_vault.json */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = text.json; path = tabs_v4_vault.json; sourceTree = ""; }; 2751D6452C59643800B36F95 /* dydxVaultViewBuilder.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = dydxVaultViewBuilder.swift; sourceTree = ""; }; + 27592DEE2C9A54D6002FBD4B /* dydxFrontendAlertsProvider.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = dydxFrontendAlertsProvider.swift; sourceTree = ""; }; + 27592DEF2C9A54D6002FBD4B /* dydxSystemAlertsProvider.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = dydxSystemAlertsProvider.swift; sourceTree = ""; }; + 27592DF02C9A54D6002FBD4B /* dydxTransferAlertsProvider.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = dydxTransferAlertsProvider.swift; sourceTree = ""; }; + 27592DF22C9A54D6002FBD4B /* dydxAlertsProvider.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = dydxAlertsProvider.swift; sourceTree = ""; }; + 27592E042C9A57D4002FBD4B /* dydxAlertsViewBuilder.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = dydxAlertsViewBuilder.swift; sourceTree = ""; }; 276908FE2AAFB22F0075B2D6 /* dydxPortfolioTransfersViewPresenter.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = dydxPortfolioTransfersViewPresenter.swift; sourceTree = ""; }; 277754282C069F8600E3E985 /* OnboardingAnalytics.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = OnboardingAnalytics.swift; sourceTree = ""; }; 277987502BA33F15006DC5CD /* dydxSelectedMarketStore.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = dydxSelectedMarketStore.swift; sourceTree = ""; }; @@ -555,7 +554,7 @@ 278EA5632BB610AC007A0E17 /* dydxNotificationsSettingsViewBuilder.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = dydxNotificationsSettingsViewBuilder.swift; sourceTree = ""; }; 278EA5652BB61C24007A0E17 /* KeyValueStoreProtocolStore+Ext.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = "KeyValueStoreProtocolStore+Ext.swift"; sourceTree = ""; }; 27B957EC2B97C07400EF9304 /* dydxShareActionBuilder.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = dydxShareActionBuilder.swift; sourceTree = ""; }; - 27C027522AFD761300E92CCB /* dydxSettingsHelpRowViewPresenter.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = dydxSettingsHelpRowViewPresenter.swift; sourceTree = ""; }; + 27C027522AFD761300E92CCB /* dydxProfileSecondaryButtonsViewPresenter.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = dydxProfileSecondaryButtonsViewPresenter.swift; sourceTree = ""; }; 27DB2EA22AC1E7B20047BC39 /* dydxTradeRestrictedViewPresenter.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = dydxTradeRestrictedViewPresenter.swift; sourceTree = ""; }; 27E0735B2C20D2470034B963 /* dydxCancelPendingIsolatedOrdersViewBuilder.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = dydxCancelPendingIsolatedOrdersViewBuilder.swift; sourceTree = ""; }; 64487FFE2AA248340068DD87 /* dydxAlertsWorker.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = dydxAlertsWorker.swift; sourceTree = ""; }; @@ -564,7 +563,6 @@ 6453A7D1299C563F0041A0C4 /* dydxClosePositionInputViewBuilder.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = dydxClosePositionInputViewBuilder.swift; sourceTree = ""; }; 6453AB25299D98110041A0C4 /* dydxClosePositionInputEditPresenter.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = dydxClosePositionInputEditPresenter.swift; sourceTree = ""; }; 6453AB2A299EA4380041A0C4 /* dydxClosePositionInputCtaButtonViewPresenter.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = dydxClosePositionInputCtaButtonViewPresenter.swift; sourceTree = ""; }; - 647D0F142A9FB1C600DA7815 /* dydxFrontendAlertsProvider.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = dydxFrontendAlertsProvider.swift; sourceTree = ""; }; 6488BBC6296F2CD50096502F /* AbacusUtils.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = AbacusUtils.swift; sourceTree = ""; }; 6496DBC8295CBBDD00174CE7 /* dydxV4TabBarBuilder.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = dydxV4TabBarBuilder.swift; sourceTree = ""; }; 6496DC38295E081300174CE7 /* dydxPortfolioViewBuilder.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = dydxPortfolioViewBuilder.swift; sourceTree = ""; }; @@ -669,6 +667,7 @@ 0230376A28C11B0300412B72 /* _v4 */ = { isa = PBXGroup; children = ( + 27592DF72C9A54D6002FBD4B /* Alerts */, 0243A75529BE568600A083FE /* Actions */, 021B68A32AD9B86600C5C3BF /* Auth */, 27E0735A2C20D1F80034B963 /* CancelOrders */, @@ -680,7 +679,6 @@ 02B8419F28EF68E400C4D25B /* MarketInfo */, 0230375A28C1176100412B72 /* Markets */, 0276FA982A0DB8FD000BDF0B /* Model+Ext.swift */, - 0258B9E52991BC880098E1BE /* NewsAlerts */, 02FF0BCF29AE92EE00781EDA /* Onboarding */, 0238FC47296DA54A002E1C1A /* OrderDetails */, 6496DC31295E05E000174CE7 /* Portfolio */, @@ -942,16 +940,6 @@ path = Components; sourceTree = ""; }; - 0258B9E52991BC880098E1BE /* NewsAlerts */ = { - isa = PBXGroup; - children = ( - 02A565A12A5E2FFC0035469F /* AlertProvider */, - 02E430CF2A03035000A648CD /* Components */, - 0258B9E62991BC900098E1BE /* dydxNewsAlertsViewBuilder.swift */, - ); - path = NewsAlerts; - sourceTree = ""; - }; 0258BA1E299294A90098E1BE /* Profile */ = { isa = PBXGroup; children = ( @@ -985,7 +973,7 @@ 028DB33F2A05893D0090BE58 /* dydxProfileHeaderViewPresenter.swift */, 02F95A8D2A1D6AAD00828F9A /* dydxProfileHistoryViewPresenter.swift */, 02F6E71E2A8293270018F00C /* dydxProfileFeesViewPresenter.swift */, - 27C027522AFD761300E92CCB /* dydxSettingsHelpRowViewPresenter.swift */, + 27C027522AFD761300E92CCB /* dydxProfileSecondaryButtonsViewPresenter.swift */, ); path = Components; sourceTree = ""; @@ -1176,25 +1164,6 @@ path = Components; sourceTree = ""; }; - 02A565A12A5E2FFC0035469F /* AlertProvider */ = { - isa = PBXGroup; - children = ( - 02A565B02A5E31580035469F /* Providers */, - 02A565AE2A5E310B0035469F /* dydxAlertsProvider.swift */, - ); - path = AlertProvider; - sourceTree = ""; - }; - 02A565B02A5E31580035469F /* Providers */ = { - isa = PBXGroup; - children = ( - 02A565B12A5E32790035469F /* dydxSystemAlertsProvider.swift */, - 028AC6A32A5E564B00FE0891 /* dydxTransferAlertsProvider.swift */, - 647D0F142A9FB1C600DA7815 /* dydxFrontendAlertsProvider.swift */, - ); - path = Providers; - sourceTree = ""; - }; 02A5C859297FBCCB00FFE1F9 /* Transfer */ = { isa = PBXGroup; children = ( @@ -1284,14 +1253,6 @@ name = Products; sourceTree = ""; }; - 02E430CF2A03035000A648CD /* Components */ = { - isa = PBXGroup; - children = ( - 022A24512A03088B003A385E /* dydxAlertsViewPresenter.swift */, - ); - path = Components; - sourceTree = ""; - }; 02E7B36B29D79A4400D6626D /* _Features */ = { isa = PBXGroup; children = ( @@ -1455,6 +1416,34 @@ path = Vault; sourceTree = ""; }; + 27592DF12C9A54D6002FBD4B /* Providers */ = { + isa = PBXGroup; + children = ( + 27592DEE2C9A54D6002FBD4B /* dydxFrontendAlertsProvider.swift */, + 27592DEF2C9A54D6002FBD4B /* dydxSystemAlertsProvider.swift */, + 27592DF02C9A54D6002FBD4B /* dydxTransferAlertsProvider.swift */, + ); + path = Providers; + sourceTree = ""; + }; + 27592DF32C9A54D6002FBD4B /* AlertProvider */ = { + isa = PBXGroup; + children = ( + 27592DF12C9A54D6002FBD4B /* Providers */, + 27592DF22C9A54D6002FBD4B /* dydxAlertsProvider.swift */, + ); + path = AlertProvider; + sourceTree = ""; + }; + 27592DF72C9A54D6002FBD4B /* Alerts */ = { + isa = PBXGroup; + children = ( + 27592E042C9A57D4002FBD4B /* dydxAlertsViewBuilder.swift */, + 27592DF32C9A54D6002FBD4B /* AlertProvider */, + ); + path = Alerts; + sourceTree = ""; + }; 277E90052B1EA093005CCBCB /* TradingRewards */ = { isa = PBXGroup; children = ( @@ -1989,6 +1978,7 @@ 6496DC39295E081300174CE7 /* dydxPortfolioViewBuilder.swift in Sources */, 02465B96297F6E2E00A4CA55 /* dydxPortfolioHeaderPresenter.swift in Sources */, 0238FE0A296EF91D002E1C1A /* dydxMarketPositionViewPresenter.swift in Sources */, + 27592E052C9A57D4002FBD4B /* dydxAlertsViewBuilder.swift in Sources */, 645299EF2AE86FB1000810E6 /* dydxUpdateViewPresenter.swift in Sources */, 02CA62872A7EBE08006067DB /* dydxPortfolioFeesViewPresenter.swift in Sources */, 0208632528F51EC400C9D3A0 /* dydxMarketDepthChartViewPresenter.swift in Sources */, @@ -1998,8 +1988,8 @@ 024F47922964A83700E40247 /* dydxMarketConfigsViewPresenter.swift in Sources */, 6448800B2AA248340068DD87 /* dydxAlertsWorker.swift in Sources */, 0262F2D529DB4891009889E2 /* WalletAction.swift in Sources */, + 27592DF82C9A54D6002FBD4B /* dydxFrontendAlertsProvider.swift in Sources */, 023789ED28BD381C00F212E1 /* dydxPresenters.docc in Sources */, - 0258B9E72991BC900098E1BE /* dydxNewsAlertsViewBuilder.swift in Sources */, 2751D6462C59643800B36F95 /* dydxVaultViewBuilder.swift in Sources */, 277E908B2B2118AE005CCBCB /* dydxRewardsHistoryViewPresenter.swift in Sources */, 0279DE952BED63E100F9ECF8 /* dydxAdjustMarginCtaButtonViewPresenter.swift in Sources */, @@ -2011,13 +2001,13 @@ 272911D62C06A628003F3EA0 /* TransferAnalytics.swift in Sources */, 0257C78E2A00485500F6160B /* SparklineDataPoint.swift in Sources */, 028DB3402A05893D0090BE58 /* dydxProfileHeaderViewPresenter.swift in Sources */, - 27C027532AFD761300E92CCB /* dydxSettingsHelpRowViewPresenter.swift in Sources */, + 27C027532AFD761300E92CCB /* dydxProfileSecondaryButtonsViewPresenter.swift in Sources */, 02EF485629F732C600C97746 /* dydxFavoriteStore.swift in Sources */, 0208627C28F4DAC000C9D3A0 /* dydxMarketInfoPagingViewPresenter.swift in Sources */, 0238FECB2970D681002E1C1A /* SharedAccountPresenter.swift in Sources */, + 27592DF92C9A54D6002FBD4B /* dydxSystemAlertsProvider.swift in Sources */, 02A134C129A5A14700B13E83 /* dydxClosePositionHeaderViewPresenter.swift in Sources */, 02FA5B7E2A12FB280045F2F5 /* dydxTransferWithdrawalViewPresenter.swift in Sources */, - 02A565B22A5E32790035469F /* dydxSystemAlertsProvider.swift in Sources */, 27B957ED2B97C07400EF9304 /* dydxShareActionBuilder.swift in Sources */, 024FEB412ACB60690087A55E /* dydxMarketOrderbookPresenter.swift in Sources */, 270E7E242A5F6B1B00136793 /* dydxTradeInputSideViewPresenter.swift in Sources */, @@ -2049,13 +2039,13 @@ 27823CF42C77E21A009BCD51 /* dydxVaultDepositWithdrawViewBuilder.swift in Sources */, 64A4DB9929664818008D8E20 /* dydxTradeReceiptPresenter.swift in Sources */, 0236F0CB2968793A00EB995F /* dydxPortfolioFillsViewPresenter.swift in Sources */, - 02A565AF2A5E310B0035469F /* dydxAlertsProvider.swift in Sources */, 025841F428EE9DE8007338D3 /* dydxAssetItemChartViewPresenter.swift in Sources */, 278EA5662BB61C24007A0E17 /* KeyValueStoreProtocolStore+Ext.swift in Sources */, 02860A9F29C15E760079E644 /* dydxOnboardScanViewBuilder.swift in Sources */, 277E90332B1FAE9A005CCBCB /* dydxRewardsHelpViewPresenter.swift in Sources */, 02FAFA5C29D4E08E001A0903 /* dydxDebugViewBuilder.swift in Sources */, 02F543B22C17ABBB000924E4 /* dydxGasTokenViewBuilder.swift in Sources */, + 27592DFA2C9A54D6002FBD4B /* dydxTransferAlertsProvider.swift in Sources */, 02F700FE29EA0FD9004DEB5E /* dydxReceiptPresenter.swift in Sources */, 27457F5B2C8AC8B700873640 /* dydxVaultDepositWithdrawConfirmationViewBuilder.swift in Sources */, 027E1EF829CA27CD0098666F /* dydxSettingsLandingViewBuilder.swift in Sources */, @@ -2072,11 +2062,11 @@ 0238FB6D296BD4E0002E1C1A /* dydxPortfolioChartViewPresenter.swift in Sources */, 029CBE7128F5FDF600259C1D /* dydxMarketFundingChartViewPresenter.swift in Sources */, 0236F113296A9D7A00EB995F /* dydxPortfolioFundingViewPresenter.swift in Sources */, - 022A24522A03088B003A385E /* dydxAlertsViewPresenter.swift in Sources */, 029CBE7928F6092400259C1D /* dydxMarketTradesViewPresenter.swift in Sources */, 0295392329FB256E009026E3 /* dydxThemeViewBuilder.swift in Sources */, 02669B7C2AD8661F00A756AA /* dydxCarteraConfigWorker.swift in Sources */, 02B841B228EF6C6400C4D25B /* dydxMarketInfoViewBuilder.swift in Sources */, + 27592DFB2C9A54D6002FBD4B /* dydxAlertsProvider.swift in Sources */, 02031F1C2AC3A7130069E00D /* dydxTradeSheetTipDraftViewPresenter.swift in Sources */, 02D9518C2C926B9C007BB2B4 /* dydxNotificationPrimerViewPresenter.swift in Sources */, 277E8FC92B1E576B005CCBCB /* dydxProfileRewardsViewPresenter.swift in Sources */, @@ -2087,7 +2077,6 @@ 029CBE7428F6032C00259C1D /* HistoricalFundingDataPoint.swift in Sources */, 0274B34828F1140D005AF69E /* dydxMarketPriceCandlesViewPresenter.swift in Sources */, 0253179729C1270700D6CC9B /* dydxTradingNetworkViewBuilder.swift in Sources */, - 028AC6A42A5E564B00FE0891 /* dydxTransferAlertsProvider.swift in Sources */, 02B27A492AE8BC7600A995EC /* dydxHelpViewPresenter.swift in Sources */, 0258BA2929929E870098E1BE /* dydxProfileButtonsViewPresenter.swift in Sources */, 278EA5642BB610AC007A0E17 /* dydxNotificationsSettingsViewBuilder.swift in Sources */, @@ -2105,7 +2094,6 @@ 02FF0BD229AE92FE00781EDA /* dydxWalletListViewBuilder.swift in Sources */, 027F3F062AB93B3700602E5B /* dydxProfileBalancesViewPresenter.swift in Sources */, 02F6E71F2A8293270018F00C /* dydxProfileFeesViewPresenter.swift in Sources */, - 647D0F152A9FB1C600DA7815 /* dydxFrontendAlertsProvider.swift in Sources */, 02D1345828ECF30000B46941 /* dydxMarketsSearchViewBuilder.swift in Sources */, 27044F702BBB1CDF004C750D /* dydxTakeProfitStopLossViewPresenter.swift in Sources */, 277DB22F2C669A6800964F9B /* dydxPredictionMarketsNoticeViewBuilder.swift in Sources */, diff --git a/dydx/dydxPresenters/dydxPresenters/_Features/routing_swiftui.json b/dydx/dydxPresenters/dydxPresenters/_Features/routing_swiftui.json index 1d005a04..b5585c74 100644 --- a/dydx/dydxPresenters/dydxPresenters/_Features/routing_swiftui.json +++ b/dydx/dydxPresenters/dydxPresenters/_Features/routing_swiftui.json @@ -98,8 +98,8 @@ "destination":"AffiliateEntity.storyboard" }, "/alerts":{ - "destination":"dydxPresenters.dydxNewsAlertsViewBuilder", - "presentation":"prompt" + "destination":"dydxPresenters.dydxAlertsViewBuilder", + "presentation":"push" }, "/closePosition/status":{ "destination":"dydxPresenters.dydxTradeStatusViewBuilder", diff --git a/dydx/dydxPresenters/dydxPresenters/_Features/tabs_v4.json b/dydx/dydxPresenters/dydxPresenters/_Features/tabs_v4.json index 3f80529e..7deed704 100644 --- a/dydx/dydxPresenters/dydxPresenters/_Features/tabs_v4.json +++ b/dydx/dydxPresenters/dydxPresenters/_Features/tabs_v4.json @@ -2,7 +2,7 @@ { "path":"/portfolio", "title":"", - "image":"icon_wallet", + "image":"icon_portfolio", "split":true }, { diff --git a/dydx/dydxPresenters/dydxPresenters/_Features/tabs_v4_vault.json b/dydx/dydxPresenters/dydxPresenters/_Features/tabs_v4_vault.json index 599ca710..b0aa7d50 100644 --- a/dydx/dydxPresenters/dydxPresenters/_Features/tabs_v4_vault.json +++ b/dydx/dydxPresenters/dydxPresenters/_Features/tabs_v4_vault.json @@ -1,9 +1,9 @@ [ { - "path":"/vault", + "path":"/portfolio", "title":"", - "image":"icon_alerts", + "image":"icon_portfolio", "split":true }, { @@ -17,9 +17,9 @@ "path":"/trade" }, { - "path":"/portfolio", + "path":"/vault", "title":"", - "image":"icon_wallet", + "image":"icon_earn", "split":true }, { diff --git a/dydx/dydxPresenters/dydxPresenters/_v4/NewsAlerts/AlertProvider/Providers/dydxFrontendAlertsProvider.swift b/dydx/dydxPresenters/dydxPresenters/_v4/Alerts/AlertProvider/Providers/dydxFrontendAlertsProvider.swift similarity index 100% rename from dydx/dydxPresenters/dydxPresenters/_v4/NewsAlerts/AlertProvider/Providers/dydxFrontendAlertsProvider.swift rename to dydx/dydxPresenters/dydxPresenters/_v4/Alerts/AlertProvider/Providers/dydxFrontendAlertsProvider.swift diff --git a/dydx/dydxPresenters/dydxPresenters/_v4/NewsAlerts/AlertProvider/Providers/dydxSystemAlertsProvider.swift b/dydx/dydxPresenters/dydxPresenters/_v4/Alerts/AlertProvider/Providers/dydxSystemAlertsProvider.swift similarity index 100% rename from dydx/dydxPresenters/dydxPresenters/_v4/NewsAlerts/AlertProvider/Providers/dydxSystemAlertsProvider.swift rename to dydx/dydxPresenters/dydxPresenters/_v4/Alerts/AlertProvider/Providers/dydxSystemAlertsProvider.swift diff --git a/dydx/dydxPresenters/dydxPresenters/_v4/NewsAlerts/AlertProvider/Providers/dydxTransferAlertsProvider.swift b/dydx/dydxPresenters/dydxPresenters/_v4/Alerts/AlertProvider/Providers/dydxTransferAlertsProvider.swift similarity index 100% rename from dydx/dydxPresenters/dydxPresenters/_v4/NewsAlerts/AlertProvider/Providers/dydxTransferAlertsProvider.swift rename to dydx/dydxPresenters/dydxPresenters/_v4/Alerts/AlertProvider/Providers/dydxTransferAlertsProvider.swift diff --git a/dydx/dydxPresenters/dydxPresenters/_v4/NewsAlerts/AlertProvider/dydxAlertsProvider.swift b/dydx/dydxPresenters/dydxPresenters/_v4/Alerts/AlertProvider/dydxAlertsProvider.swift similarity index 100% rename from dydx/dydxPresenters/dydxPresenters/_v4/NewsAlerts/AlertProvider/dydxAlertsProvider.swift rename to dydx/dydxPresenters/dydxPresenters/_v4/Alerts/AlertProvider/dydxAlertsProvider.swift diff --git a/dydx/dydxPresenters/dydxPresenters/_v4/Alerts/dydxAlertsViewBuilder.swift b/dydx/dydxPresenters/dydxPresenters/_v4/Alerts/dydxAlertsViewBuilder.swift new file mode 100644 index 00000000..18d5ddc6 --- /dev/null +++ b/dydx/dydxPresenters/dydxPresenters/_v4/Alerts/dydxAlertsViewBuilder.swift @@ -0,0 +1,63 @@ +// +// dydxAlertsViewBuilder.swift +// dydxUI +// +// Created by Michael Maguire on 9/17/24. +// Copyright © 2024 dYdX Trading Inc. All rights reserved. +// + +import Utilities +import dydxViews +import PlatformParticles +import RoutingKit +import ParticlesKit +import PlatformUI + +public class dydxAlertsViewBuilder: NSObject, ObjectBuilderProtocol { + public func build() -> T? { + let presenter = dydxAlertsViewBuilderPresenter() + let view = presenter.viewModel?.createView() ?? PlatformViewModel().createView() + return dydxAlertsViewController(presenter: presenter, view: view, configuration: .default) as? T + } +} + +private class dydxAlertsViewController: HostingViewController { + override public func arrive(to request: RoutingRequest?, animated: Bool) -> Bool { + if request?.path == "/alerts" { + return true + } + return false + } +} + +private protocol dydxAlertsViewBuilderPresenterProtocol: HostedViewPresenterProtocol { + var viewModel: dydxAlertsViewModel? { get } +} + +private class dydxAlertsViewBuilderPresenter: HostedViewPresenter, dydxAlertsViewBuilderPresenterProtocol { + private let alertsProvider = dydxAlertsProvider.shared + + override init() { + super.init() + + viewModel = dydxAlertsViewModel() + + viewModel?.listViewModel.contentChanged = { [weak self] in + self?.viewModel?.objectWillChange.send() + } + + viewModel?.backAction = { + Router.shared?.navigate(to: RoutingRequest(path: "/action/dismiss"), animated: true, completion: nil) + } + } + + override func start() { + super.start() + + alertsProvider.items + .sink { [weak self] viewModels in + self?.viewModel?.listViewModel.items = viewModels + } + .store(in: &subscriptions) + } +} diff --git a/dydx/dydxPresenters/dydxPresenters/_v4/CancelOrders/dydxCancelPendingIsolatedOrdersViewBuilder.swift b/dydx/dydxPresenters/dydxPresenters/_v4/CancelOrders/dydxCancelPendingIsolatedOrdersViewBuilder.swift index 82e39764..2cb732e6 100644 --- a/dydx/dydxPresenters/dydxPresenters/_v4/CancelOrders/dydxCancelPendingIsolatedOrdersViewBuilder.swift +++ b/dydx/dydxPresenters/dydxPresenters/_v4/CancelOrders/dydxCancelPendingIsolatedOrdersViewBuilder.swift @@ -18,11 +18,11 @@ public class dydxCancelPendingIsolatedOrdersViewBuilder: NSObject, ObjectBuilder public func build() -> T? { let presenter = dydxCancelPendingIsolatedOrdersViewBuilderPresenter() let view = presenter.viewModel?.createView() ?? PlatformViewModel().createView() - return dydxCancelPendingIsolatedOrdersViewBuilderController(presenter: presenter, view: view, configuration: .default) as? T + return dydxCancelPendingIsolatedOrdersViewController(presenter: presenter, view: view, configuration: .default) as? T } } -private class dydxCancelPendingIsolatedOrdersViewBuilderController: HostingViewController { +private class dydxCancelPendingIsolatedOrdersViewController: HostingViewController { override public func arrive(to request: RoutingRequest?, animated: Bool) -> Bool { if let marketId = request?.params?["market"] as? String, request?.path == "/portfolio/cancel_pending_position", diff --git a/dydx/dydxPresenters/dydxPresenters/_v4/MarketInfo/dydxMarketInfoViewBuilder.swift b/dydx/dydxPresenters/dydxPresenters/_v4/MarketInfo/dydxMarketInfoViewBuilder.swift index bbca64a6..addff6ac 100644 --- a/dydx/dydxPresenters/dydxPresenters/_v4/MarketInfo/dydxMarketInfoViewBuilder.swift +++ b/dydx/dydxPresenters/dydxPresenters/_v4/MarketInfo/dydxMarketInfoViewBuilder.swift @@ -19,7 +19,7 @@ public class dydxMarketInfoViewBuilder: NSObject, ObjectBuilderProtocol { public func build() -> T? { let presenter = dydxMarketInfoViewPresenter() let view = presenter.viewModel?.createView() ?? PlatformViewModel().createView() - let viewController = dydxMarketInfoViewController(presenter: presenter, view: view, configuration: .nav) + let viewController = dydxMarketInfoViewController(presenter: presenter, view: view, configuration: .default) viewController.hidesBottomBarWhenPushed = true return viewController as? T } diff --git a/dydx/dydxPresenters/dydxPresenters/_v4/NewsAlerts/Components/dydxAlertsViewPresenter.swift b/dydx/dydxPresenters/dydxPresenters/_v4/NewsAlerts/Components/dydxAlertsViewPresenter.swift deleted file mode 100644 index 5410540e..00000000 --- a/dydx/dydxPresenters/dydxPresenters/_v4/NewsAlerts/Components/dydxAlertsViewPresenter.swift +++ /dev/null @@ -1,39 +0,0 @@ -// -// dydxAlertsViewPresenter.swift -// dydxPresenters -// -// Created by Rui Huang on 5/3/23. -// - -import Utilities -import dydxViews -import PlatformParticles -import RoutingKit -import ParticlesKit -import PlatformUI -import dydxStateManager -import Abacus - -protocol dydxAlertsViewPresenterProtocol: HostedViewPresenterProtocol { - var viewModel: dydxAlertsViewModel? { get } -} - -class dydxAlertsViewPresenter: HostedViewPresenter, dydxAlertsViewPresenterProtocol { - private let alertsProvider = dydxAlertsProvider.shared - - override init() { - super.init() - - viewModel = dydxAlertsViewModel() - } - - override func start() { - super.start() - - alertsProvider.items - .sink { [weak self] viewModels in - self?.viewModel?.items = viewModels - } - .store(in: &subscriptions) - } -} diff --git a/dydx/dydxPresenters/dydxPresenters/_v4/NewsAlerts/dydxNewsAlertsViewBuilder.swift b/dydx/dydxPresenters/dydxPresenters/_v4/NewsAlerts/dydxNewsAlertsViewBuilder.swift deleted file mode 100644 index e782f692..00000000 --- a/dydx/dydxPresenters/dydxPresenters/_v4/NewsAlerts/dydxNewsAlertsViewBuilder.swift +++ /dev/null @@ -1,78 +0,0 @@ -// -// dydxNewsAlertsViewBuilder.swift -// dydxPresenters -// -// Created by Rui Huang on 2/7/23. -// - -import Utilities -import dydxViews -import PlatformParticles -import RoutingKit -import ParticlesKit -import PlatformUI -import dydxStateManager -import Abacus - -public class dydxNewsAlertsViewBuilder: NSObject, ObjectBuilderProtocol { - public func build() -> T? { - let presenter = dydxNewsAlertsViewPresenter() - let view = presenter.viewModel?.createView() ?? PlatformViewModel().createView() - return dydxNewsAlertsViewController(presenter: presenter, view: view, configuration: .tabbarItemView) as? T - } -} - -private class dydxNewsAlertsViewController: HostingViewController { - override public func arrive(to request: RoutingRequest?, animated: Bool) -> Bool { - if request?.path == "/alerts" { - return true - } - return false - } -} - -private protocol dydxNewsAlertsViewPresenterProtocol: HostedViewPresenterProtocol { - var viewModel: dydxNewsAlertsViewModel? { get } -} - -private class dydxNewsAlertsViewPresenter: HostedViewPresenter, dydxNewsAlertsViewPresenterProtocol { - private let alertsPresenter = dydxAlertsViewPresenter() - - override init() { - let viewModel = dydxNewsAlertsViewModel() - alertsPresenter.$viewModel.assign(to: &viewModel.$alerts) - super.init() - self.viewModel = viewModel - viewModel.alerts?.contentChanged = { [weak self] in - self?.viewModel?.objectWillChange.send() - } - } - - override func start() { - super.start() - - if let blogs = AbacusStateManager.shared.environment?.links?.blogs { - viewModel?.blog.url = URL(string: blogs) - updateSelectionBar() - } - - attachChild(worker: alertsPresenter) - } - - private func updateSelectionBar() { - let selectionBar = SelectionBarModel() - selectionBar.location = .header - selectionBar.items = [ - SelectionBarModel.Item(text: DataLocalizer.localize(path: "APP.GENERAL.ALERTS"), isSelected: true), - SelectionBarModel.Item(text: DataLocalizer.localize(path: "APP.GENERAL.NEWS"), isSelected: false) - ] - selectionBar.onSelectionChanged = { [weak self] selectedIndex in - for index in 0..<(selectionBar.items?.count ?? 0) { - selectionBar.items?[index].isSelected = selectedIndex == index - } - self?.viewModel?.objectWillChange.send() - } - - viewModel?.selectionBar = selectionBar - } -} diff --git a/dydx/dydxPresenters/dydxPresenters/_v4/Profile/Components/dydxProfileSecondaryButtonsViewPresenter.swift b/dydx/dydxPresenters/dydxPresenters/_v4/Profile/Components/dydxProfileSecondaryButtonsViewPresenter.swift new file mode 100644 index 00000000..44c01520 --- /dev/null +++ b/dydx/dydxPresenters/dydxPresenters/_v4/Profile/Components/dydxProfileSecondaryButtonsViewPresenter.swift @@ -0,0 +1,47 @@ +// +// dydxProfileSecondaryButtonsViewPresenter.swift +// dydxPresenters +// +// Created by Michael Maguire on 11/9/23. +// + +import Utilities +import dydxViews +import PlatformParticles +import RoutingKit +import ParticlesKit +import PlatformUI +import dydxStateManager +import dydxFormatter + +protocol dydxProfileSecondaryButtonsViewPresenterProtocol: HostedViewPresenterProtocol { + var viewModel: dydxProfileSecondaryButtonsViewModel? { get } +} + +class dydxProfileSecondaryButtonsViewPresenter: HostedViewPresenter, dydxProfileSecondaryButtonsViewPresenterProtocol { + init(viewModel: dydxProfileSecondaryButtonsViewModel) { + super.init() + + self.viewModel = viewModel + + viewModel.settingsAction = { + Router.shared?.navigate(to: RoutingRequest(path: "/settings"), animated: true, completion: nil) + } + + viewModel.helpAction = { + Router.shared?.navigate(to: RoutingRequest(path: "/help"), animated: true, completion: nil) + } + + AbacusStateManager.shared.state.onboarded + .sink { [weak self] onboarded in + // do not show alerts if wallet not connected + if onboarded && dydxBoolFeatureFlag.isVaultEnabled.isEnabled { + self?.viewModel?.alertsAction = { + Router.shared?.navigate(to: RoutingRequest(path: "/alerts"), animated: true, completion: nil) + } + } + + } + .store(in: &self.subscriptions) + } +} diff --git a/dydx/dydxPresenters/dydxPresenters/_v4/Profile/Components/dydxSettingsHelpRowViewPresenter.swift b/dydx/dydxPresenters/dydxPresenters/_v4/Profile/Components/dydxSettingsHelpRowViewPresenter.swift deleted file mode 100644 index 134bdf49..00000000 --- a/dydx/dydxPresenters/dydxPresenters/_v4/Profile/Components/dydxSettingsHelpRowViewPresenter.swift +++ /dev/null @@ -1,34 +0,0 @@ -// -// dydxSettingsHelpRowViewPresenter.swift -// dydxPresenters -// -// Created by Michael Maguire on 11/9/23. -// - -import Utilities -import dydxViews -import PlatformParticles -import RoutingKit -import ParticlesKit -import PlatformUI -import dydxStateManager - -protocol dydxSettingsHelpRowViewPresenterProtocol: HostedViewPresenterProtocol { - var viewModel: dydxSettingsHelpRowViewModel? { get } -} - -class dydxSettingsHelpRowViewPresenter: HostedViewPresenter, dydxSettingsHelpRowViewPresenterProtocol { - init(viewModel: dydxSettingsHelpRowViewModel) { - super.init() - - self.viewModel = viewModel - - viewModel.settingsAction = { - Router.shared?.navigate(to: RoutingRequest(path: "/settings"), animated: true, completion: nil) - } - - viewModel.helpAction = { - Router.shared?.navigate(to: RoutingRequest(path: "/help"), animated: true, completion: nil) - } - } -} diff --git a/dydx/dydxPresenters/dydxPresenters/_v4/Profile/dydxProfileViewBuilder.swift b/dydx/dydxPresenters/dydxPresenters/_v4/Profile/dydxProfileViewBuilder.swift index 82102177..38d60f7e 100644 --- a/dydx/dydxPresenters/dydxPresenters/_v4/Profile/dydxProfileViewBuilder.swift +++ b/dydx/dydxPresenters/dydxPresenters/_v4/Profile/dydxProfileViewBuilder.swift @@ -41,7 +41,7 @@ private protocol dydxProfileViewPresenterProtocol: HostedViewPresenterProtocol { private class dydxProfileViewPresenter: HostedViewPresenter, dydxProfileViewPresenterProtocol { private let buttonsPresenter: dydxProfileButtonsViewPresenter - private let settingsHelpRowPresenter: dydxSettingsHelpRowViewPresenter + private let secondaryButtonsPresenter: dydxProfileSecondaryButtonsViewPresenter private let headerPresenter: dydxProfileHeaderViewPresenter private let historyPresenter: dydxProfileHistoryViewPresenter private let feesPresenter: dydxProfileFeesViewPresenter @@ -50,7 +50,7 @@ private class dydxProfileViewPresenter: HostedViewPresenter() -> T? { let presenter = dydxRateAppViewBuilderPresenter() let view = presenter.viewModel?.createView() ?? PlatformViewModel().createView() - return dydxRateAppViewBuilderController(presenter: presenter, view: view, configuration: .default) as? T + return dydxRateAppViewController(presenter: presenter, view: view, configuration: .default) as? T } } -private class dydxRateAppViewBuilderController: HostingViewController { +private class dydxRateAppViewController: HostingViewController { override public func arrive(to request: RoutingRequest?, animated: Bool) -> Bool { if request?.path == "/rate_app" { diff --git a/dydx/dydxPresenters/dydxPresenters/_v4/RootTab/dydxV4TabBarBuilder.swift b/dydx/dydxPresenters/dydxPresenters/_v4/RootTab/dydxV4TabBarBuilder.swift index a0a474d3..dfd94cb6 100644 --- a/dydx/dydxPresenters/dydxPresenters/_v4/RootTab/dydxV4TabBarBuilder.swift +++ b/dydx/dydxPresenters/dydxPresenters/_v4/RootTab/dydxV4TabBarBuilder.swift @@ -32,20 +32,11 @@ public class dydxV4TabBarBuilder: NSObject, ObjectBuilderProtocol { } } - override public var selectedIndex: Int { - didSet { - if selectedIndex != oldValue { - update(index: oldValue, selected: false) - update(index: selectedIndex, selected: true) - } - } - } - public override func viewDidLoad() { super.viewDidLoad() createCenterButton() - routingMap = dydxBoolFeatureFlag.isVaultEnabled.isEnabled ? "tabs_v4_vault.json" : "tabs_v4.json" + maps = dydxBoolFeatureFlag.isVaultEnabled.isEnabled ? Self.tabBarItemInfosV2 : Self.tabBarItemInfos } override public func viewWillAppear(_ animated: Bool) { @@ -87,28 +78,53 @@ public class dydxV4TabBarBuilder: NSObject, ObjectBuilderProtocol { private func updateCenterButton() { centerButton?.buttonImage = UIImage.named("icon_trade", bundles: Bundle.particles) } +} - private func update(index: Int, selected: Bool) { - if index != NSNotFound { - if let item = tabBar.items?[index] { - update(item: item, index: index, selected: selected) - } - } - } - - private func update(item: UITabBarItem, index: Int, selected: Bool) { - item.title = selected ? "●" : " " -// if selected, [0, 3, 4].contains(index), wallet === nil { -// promptLogin() -// } - } - - override public func tabBar(_ tabBar: UITabBar, didSelect item: UITabBarItem) { - if let items = tabBar.items { - for index in 0 ..< items.count { - let tab = items[index] - update(item: tab, index: index, selected: tab === item) - } - } - } +private extension dydxV4TabBarController { + static let tabBarItemInfos: [TabbarItemInfo] = [ + .init(path: "/portfolio", + title: DataLocalizer.localize(path: "APP.PORTFOLIO.PORTFOLIO"), + image: "icon_portfolio", + split: true), + .init(path: "/markets", + title: DataLocalizer.localize(path: "APP.GENERAL.MARKETS"), + image: "icon_market", + split: true), + .init(path: "/trade", + title: DataLocalizer.localize(path: "APP.GENERAL.TRADE"), + image: "icon_trade", + split: true), + .init(path: "/alerts", + title: DataLocalizer.localize(path: "APP.GENERAL.ALERTS"), + image: "icon_alerts", + split: true), + .init(path: "/my-profile", + title: DataLocalizer.localize(path: "APP.GENERAL.PROFILE"), + image: "icon_profile", + split: true) + ] + + static let tabBarItemInfosV2: [TabbarItemInfo] = [ + .init(path: "/portfolio", + title: DataLocalizer.localize(path: "APP.PORTFOLIO.PORTFOLIO"), + image: "icon_portfolio", + split: true), + .init(path: "/markets", + title: DataLocalizer.localize(path: "APP.GENERAL.MARKETS"), + image: "icon_market", + split: true), + .init(path: "/trade", + title: DataLocalizer.localize(path: "APP.GENERAL.TRADE"), + image: "icon_trade", + split: true), + .init(path: "/vault", + title: DataLocalizer.localize(path: "APP.VAULTS.EARN"), + image: "icon_earn", + split: true), + .init(path: "/my-profile", + title: DataLocalizer.localize(path: "APP.GENERAL.PROFILE"), + image: "icon_profile", + split: true) + ] } + diff --git a/dydx/dydxViews/dydxViews.xcodeproj/project.pbxproj b/dydx/dydxViews/dydxViews.xcodeproj/project.pbxproj index 86e8f1fd..b4f6d504 100644 --- a/dydx/dydxViews/dydxViews.xcodeproj/project.pbxproj +++ b/dydx/dydxViews/dydxViews.xcodeproj/project.pbxproj @@ -75,7 +75,6 @@ 0253178A29C126EE00D6CC9B /* dydxTradingNetworkView.swift in Sources */ = {isa = PBXBuildFile; fileRef = 0253178929C126EE00D6CC9B /* dydxTradingNetworkView.swift */; }; 0256F53629AFFC9800A083C0 /* dydxOnboardConnectView.swift in Sources */ = {isa = PBXBuildFile; fileRef = 0256F53529AFFC9800A083C0 /* dydxOnboardConnectView.swift */; }; 025892C728BE82B900AAABF5 /* Media.xcassets in Resources */ = {isa = PBXBuildFile; fileRef = 024B7BE328B80C2A00F7C386 /* Media.xcassets */; }; - 0258B9E42991BC7A0098E1BE /* dydxNewsAlertsView.swift in Sources */ = {isa = PBXBuildFile; fileRef = 0258B9E32991BC7A0098E1BE /* dydxNewsAlertsView.swift */; }; 0258BA1D2992949D0098E1BE /* dydxProfileView.swift in Sources */ = {isa = PBXBuildFile; fileRef = 0258BA1C2992949D0098E1BE /* dydxProfileView.swift */; }; 0258BA2629929D1B0098E1BE /* dydxProfileButtonsView.swift in Sources */ = {isa = PBXBuildFile; fileRef = 0258BA2529929D1B0098E1BE /* dydxProfileButtonsView.swift */; }; 025BA65A290100CD00CDAE99 /* LeverageRisk.swift in Sources */ = {isa = PBXBuildFile; fileRef = 025BA659290100CD00CDAE99 /* LeverageRisk.swift */; }; @@ -203,7 +202,7 @@ 27AAA9862ACE34C800AF3C56 /* SwiftMessages+Banner.swift in Sources */ = {isa = PBXBuildFile; fileRef = 27AAA9852ACE34C800AF3C56 /* SwiftMessages+Banner.swift */; }; 27AFE4EA2C1902BF00168B0B /* dydxReceiptChangeItemView.swift in Sources */ = {isa = PBXBuildFile; fileRef = 27AFE4DD2C1902BF00168B0B /* dydxReceiptChangeItemView.swift */; }; 27BAAF112BD851B500F650C3 /* dydxTakeProfitStopLossStatusViewModel.swift in Sources */ = {isa = PBXBuildFile; fileRef = 27BAAF102BD851B500F650C3 /* dydxTakeProfitStopLossStatusViewModel.swift */; }; - 27C027452AFD734800E92CCB /* dydxSettingsHelpRowView.swift in Sources */ = {isa = PBXBuildFile; fileRef = 27C027442AFD734800E92CCB /* dydxSettingsHelpRowView.swift */; }; + 27C027452AFD734800E92CCB /* dydxProfileSecondaryButtonsView.swift in Sources */ = {isa = PBXBuildFile; fileRef = 27C027442AFD734800E92CCB /* dydxProfileSecondaryButtonsView.swift */; }; 27C6AE182C618055005517B5 /* RadioButtons.swift in Sources */ = {isa = PBXBuildFile; fileRef = 27C6AE172C618055005517B5 /* RadioButtons.swift */; }; 27C6E4C92BC8C30E00ED892A /* dydxCustomLimitPriceViewModel.swift in Sources */ = {isa = PBXBuildFile; fileRef = 27C6E4BC2BC8C30E00ED892A /* dydxCustomLimitPriceViewModel.swift */; }; 27CDA3D42BBF1AD700FEAFFE /* dydxMultipleOrdersExistViewModel.swift in Sources */ = {isa = PBXBuildFile; fileRef = 27CDA3D32BBF1AD700FEAFFE /* dydxMultipleOrdersExistViewModel.swift */; }; @@ -465,7 +464,6 @@ 0253155029BFA62700D6CC9B /* dydxOnboardScanInstructionsView.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = dydxOnboardScanInstructionsView.swift; sourceTree = ""; }; 0253178929C126EE00D6CC9B /* dydxTradingNetworkView.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = dydxTradingNetworkView.swift; sourceTree = ""; }; 0256F53529AFFC9800A083C0 /* dydxOnboardConnectView.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = dydxOnboardConnectView.swift; sourceTree = ""; }; - 0258B9E32991BC7A0098E1BE /* dydxNewsAlertsView.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = dydxNewsAlertsView.swift; sourceTree = ""; }; 0258BA1C2992949D0098E1BE /* dydxProfileView.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = dydxProfileView.swift; sourceTree = ""; }; 0258BA2529929D1B0098E1BE /* dydxProfileButtonsView.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = dydxProfileButtonsView.swift; sourceTree = ""; }; 025BA659290100CD00CDAE99 /* LeverageRisk.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = LeverageRisk.swift; sourceTree = ""; }; @@ -590,7 +588,7 @@ 27AAA9852ACE34C800AF3C56 /* SwiftMessages+Banner.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = "SwiftMessages+Banner.swift"; sourceTree = ""; }; 27AFE4DD2C1902BF00168B0B /* dydxReceiptChangeItemView.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = dydxReceiptChangeItemView.swift; sourceTree = ""; }; 27BAAF102BD851B500F650C3 /* dydxTakeProfitStopLossStatusViewModel.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = dydxTakeProfitStopLossStatusViewModel.swift; sourceTree = ""; }; - 27C027442AFD734800E92CCB /* dydxSettingsHelpRowView.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = dydxSettingsHelpRowView.swift; sourceTree = ""; }; + 27C027442AFD734800E92CCB /* dydxProfileSecondaryButtonsView.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = dydxProfileSecondaryButtonsView.swift; sourceTree = ""; }; 27C6AE172C618055005517B5 /* RadioButtons.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = RadioButtons.swift; sourceTree = ""; }; 27C6E4BC2BC8C30E00ED892A /* dydxCustomLimitPriceViewModel.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = dydxCustomLimitPriceViewModel.swift; sourceTree = ""; }; 27CDA3D32BBF1AD700FEAFFE /* dydxMultipleOrdersExistViewModel.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = dydxMultipleOrdersExistViewModel.swift; sourceTree = ""; }; @@ -736,7 +734,7 @@ 6453A7AD299C26B60041A0C4 /* ClosePosition */, 02B8419B28EF67B300C4D25B /* MarketInfo */, 0230376B28C11B0E00412B72 /* Markets */, - 0258B9D62991BC5C0098E1BE /* NewsAlerts */, + 0258B9D62991BC5C0098E1BE /* Alerts */, 02FF0BBF29AE924300781EDA /* Onboarding */, 0238FC31296DA527002E1C1A /* OrderDetails */, 02D9516D2C926A7D007BB2B4 /* Primers */, @@ -1115,13 +1113,12 @@ path = Connect; sourceTree = ""; }; - 0258B9D62991BC5C0098E1BE /* NewsAlerts */ = { + 0258B9D62991BC5C0098E1BE /* Alerts */ = { isa = PBXGroup; children = ( 02E430CC2A03031B00A648CD /* Components */, - 0258B9E32991BC7A0098E1BE /* dydxNewsAlertsView.swift */, ); - path = NewsAlerts; + path = Alerts; sourceTree = ""; }; 0258BA0F2992947E0098E1BE /* Profile */ = { @@ -1149,7 +1146,7 @@ 028DB33D2A0589270090BE58 /* dydxProfileHeaderView.swift */, 02F95A8B2A1D6A9200828F9A /* dydxProfileHistoryView.swift */, 02F6E7102A8292FC0018F00C /* dydxProfileFeesView.swift */, - 27C027442AFD734800E92CCB /* dydxSettingsHelpRowView.swift */, + 27C027442AFD734800E92CCB /* dydxProfileSecondaryButtonsView.swift */, 277E8F9E2B1A847D005CCBCB /* dydxTitledCardView.swift */, ); path = Components; @@ -2081,7 +2078,7 @@ 0273A1382ACCC49C001B89F5 /* dydxHistoryView.swift in Sources */, 0246DE5E28B984C700A7FF1F /* Wallets2View.swift in Sources */, 023AB3C62BEAD5E9005230B2 /* dydxTargetLeverageView.swift in Sources */, - 27C027452AFD734800E92CCB /* dydxSettingsHelpRowView.swift in Sources */, + 27C027452AFD734800E92CCB /* dydxProfileSecondaryButtonsView.swift in Sources */, 0253155129BFA62700D6CC9B /* dydxOnboardScanInstructionsView.swift in Sources */, 27CDA3D42BBF1AD700FEAFFE /* dydxMultipleOrdersExistViewModel.swift in Sources */, 024B7B5C28B7F90100F7C386 /* dydxViewBundleClass.swift in Sources */, @@ -2265,7 +2262,6 @@ 0276B9C828E6477500101791 /* dydxMarketSummaryView.swift in Sources */, 024B44F32983D57200E35D54 /* SharedFillView.swift in Sources */, 0238FEC72970D26C002E1C1A /* SharedAccountView.swift in Sources */, - 0258B9E42991BC7A0098E1BE /* dydxNewsAlertsView.swift in Sources */, 64A4DB7A296635BE008D8E20 /* dydxReceiptBuyingPowerView.swift in Sources */, 028DB33E2A0589270090BE58 /* dydxProfileHeaderView.swift in Sources */, 0232C03229AEF583006B2C51 /* dydxSyncDesktopView.swift in Sources */, diff --git a/dydx/dydxViews/dydxViews/Media.xcassets/icon_earn.imageset/Contents.json b/dydx/dydxViews/dydxViews/Media.xcassets/icon_earn.imageset/Contents.json new file mode 100644 index 00000000..2a177052 --- /dev/null +++ b/dydx/dydxViews/dydxViews/Media.xcassets/icon_earn.imageset/Contents.json @@ -0,0 +1,12 @@ +{ + "images" : [ + { + "filename" : "icon_earn.pdf", + "idiom" : "universal" + } + ], + "info" : { + "author" : "xcode", + "version" : 1 + } +} diff --git a/dydx/dydxViews/dydxViews/Media.xcassets/icon_earn.imageset/icon_earn.pdf b/dydx/dydxViews/dydxViews/Media.xcassets/icon_earn.imageset/icon_earn.pdf new file mode 100644 index 0000000000000000000000000000000000000000..8116bc9f53866eb8285640a15242e17216bef0f6 GIT binary patch literal 2588 zcmaJ@dpMJQA17K`480vZRBmKBZ?mjqM$try5QQ*ylS5l=Lkf{n$(#xasfQ9pERnKQ z7|kiTmf79tlE)P})NXZj8^MUug5-L7o4LTx?p=&p^4$Z_B zwcNWhZx(u`_Kk~nSE4bhjAj4ai1J6!>J*SpE+iR z-q-%F8D4mIq^f!Juq@d$a;{6>%gJs~R%TdVD|Y)}SoWFVEGT2e7^j@jP_A;qDx|n) zOO24uK{sWpK4qv_Rm|RCPs*@+GR8N1z|$g3g&TZ6djQ3T3hCUu$abxKz;KiA%J$L4 zA!H}vk32e5^HUva|lItQ3Q|9MbMdP)aJiRPty?qL9+l zCgjy)d|O#**W+!~wdZaIc^ZrwRPb>ID%PPmr5Z^>rF7=oJcZImx;7_0Ld7>*VLhh* zwjW%6MU6@+gtG{_#j%(Z!?e*?uef)RFIiNrP~PaOuNo_S;<`3DA-`fuV_)n!X^UDt zi<5_1aBO;f+&kM~U8{kH3|Bq7K>7-KKK)wvYuRZciKRuEKE zMz&)njx*$5^a-onSw}L}*L6HT0`G~8=PKTrl>AzSroQj#@|Q?)6-2C2Jbw@DV5>ph$6Iz-T|!8XgKQG2>V(-IW_ zf)Jmrm(8nwiUjte2ocHaMh8oB)2HoXFEV+`&&Q*>JY~3`{`sx(uxAvDTN*ElSkp3T z1obBhsKz9(%)5ycjiO_^n72(Dhu<{mr{&+n$1S-MWGHaWBAA^F47WZk9Tf;9foL-0jw$up{CfgdU%Y?d`dGT1&cCtDy1I z5Un> z@?b~bj4w<^g_T>T9JOKkCca*CoZ(MXqDMzdK&x~j)Rdk}J-;i3{CswCF#S@4Q@BGw zJtb^oo7De%(v7nl)Y;Bp7ylZl9plDgO5b`Zp@b~_yD+rC%*i>`dDN(FtD3g~oA;o# zIV<9#ivM-D(ye~$qBZ<{OR+^p4%k{@-1kT6K48L-HIrp?Uco66$q?|HDm=M$dL{D4Zs^nU6GHz%vMDB&+2U5)DKi>!$dgQ&0*l~HP;Jjs`gHMp$i`oNS(+!k@tF_qY04NXp_@%zW{TP`+ zyG-d>0vQ~>w_@N5!xCQ)fonS$#Tr-Cbkbj!DXrE?@OcPO{yt5dEBAVRYfO8p*}B;6+)6 zQ0jKv%$6a<0O~=U1JIn;jT>`8z%m{jNAu`*UfzM-j(UEy$^MMGk0^f4h7!mH$|Mqi z-}|y<4uWT84U38V2NN$)x|pNCQ$5NUW&D%rH~xf03IMT{L?Y9ufZKr|{O%NX7z7aZ z1iuBs-vtu=3ERj=0XG0?fc$2^4u+To=+|i>k^@L32UC1NDj?PzVzD6B4;Ew+4J3&& ziUr34XiuPsFu>>s^eFfo~^(^bJ-~g z$PkI%^aq6bUq?ejv}kj`JED=l9BCASe-KE4innKNDH?|sm3#=)2DJQ%+TVwQa3GUu ifVkmr14cOd9|J|zf75CN3hi4vhG+~1s;Rl%4*y>h$ae_< literal 0 HcmV?d00001 diff --git a/dydx/dydxViews/dydxViews/Media.xcassets/icon_market.imageset/Contents.json b/dydx/dydxViews/dydxViews/Media.xcassets/icon_market.imageset/Contents.json index 19e3c6f8..eb657bfe 100644 --- a/dydx/dydxViews/dydxViews/Media.xcassets/icon_market.imageset/Contents.json +++ b/dydx/dydxViews/dydxViews/Media.xcassets/icon_market.imageset/Contents.json @@ -1,7 +1,7 @@ { "images" : [ { - "filename" : "Vector-23.pdf", + "filename" : "icon_market.pdf", "idiom" : "universal" } ], diff --git a/dydx/dydxViews/dydxViews/Media.xcassets/icon_market.imageset/Vector-23.pdf b/dydx/dydxViews/dydxViews/Media.xcassets/icon_market.imageset/Vector-23.pdf deleted file mode 100644 index 1898811277f55a8314563f546a4fb600063eebc4..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 2977 zcmZuzU2ohr5Pava;EREzKqQj-BoG8>?4~H%qVA<{K_9NN;#_ejwWmvw_SbhPk+Zzm zdN9@_ad&ohq}!YOyLYc_(J5uM(eodFDy?6?)^FaZae4^`J^j=yYSR< zIgk63D(}XB4#T+n{;j@!pZ_;3>ThKWvtHVy;1#2%_jqeKDO32~nWn}`-`m>sA@Hv9 zMlZvp>Xgs*DLN@v_{!U=)&knXJKNb_yRK-uzUeA$3jiT-ZPB~FcC8*zu6DL|T>wo7 z7^0-at|?4w`nJg+)(=NxkHn6GMM~jlED#xa;SmYdph3Fvaj)6a(=tQ`u%+P0#qU6k<_waxeAEqC^UN#h~+^=o+An_f>KQ>BBBc$iI9`D(-}-p@AmaQ5E)pkwjruv7z-kdKs3Lf&X^+Q$#X~3NIgv7 z7j^5K7IpZf?F$d{H5dR{0Bd079&XKQ19jGPcI6vc0!wws;tGp*QJYUPIA&m%m`Rm3 z5d#$Iv?*BgMc!?qCGBCH>!n3`LJ*Nu35u@FCaq^xMI*8kDcOTS>=jihxsVDru_PhU z=^BmWwN0{#?UGG^MVkPN5yXLaHyZ(sHnH_)6MUe^3Ro0MFr2QoVRZSEcquoVWEou= z$5m~|c?e7PjviAtIVLtCN|LY%K}rlLnvsJ5^o&i&n}e11M0x5!2r^JGf}*Qr;{Y<7 z$fSfFlSmJQ*ej|MlxVdHzaf?pY{D2(6xMU%{8-?<-@YX_d!Ic$!WSPeTKFQtB2=8z z1R7Lq0S4i7TcfSfC=ne;LGr319N9_7>>-Ef4T9u!RK%z%3s8FUU@+iZuruiLarVTN zEJI{aREQX5WG1Se)#FgeN=8TO0lRiWS;NY2r)j<{`or&7%W##y{rlIb%lrM~7=fS1hr|Bu{6&9|wS-jU=TD-PX*VwO z=kqWwIxK#>nC^C-F5`rXVe3oa{r(J0V|!VlY&Q%LcgFI^!vm=5(7{fpI=Ay@oV8E* zFF>+P?Nz3&&D;HDf1DrV(a`kr9EmUI@uM=jQ=9DJuWp;BYBb<@S) z1AYzF{%fdp&?a2WXcJN0zl9RnWM@Bg^gbB747{JxF9yp|R52I33jDB=*SH3&`;BCad$%n7b-Li@6hKQN`?=8y~*DlNAG&Wr_ zFCvI{mu5xbs&y67oHjnukxHeH1x>#GTP<_dk$qjR=-k-+xl?a{e7!)f#i=1`f=WqA zz3=Ia)(s2fvR123bTM2yY2#i#Z`Cvz!|o0H|Nc95vot1J+se6&cWZf@{qlsE8L!U7 zb*c7*~e!0) zsm~2P8K+d++8#38IHPF6E%tN95uPi}Y&<2MPcgsOGEkdV*vPwX=PB)Gi!Xw&9sD@w z+}3!}?yR?Sk(R`i)K>`>Yj>En<#4G^SMlp@3Ophfa8WclV{d8Gqc~~(D^bG!yJC(h z7*+f`5N3XE&GngUueh}*Z#rn2wE9uEf%Wf0XSVBKyY>0&Z5bZLt88fk9?xH8ZEM)O zD)-dg$jSE(w=K}ydoIL<$#zomrR%egH|^dmsC1pfbIwh{R2JsPjq5p>_IGl7ysl6c z&f0Rp$nJpSkrJ+>CEF%^knUh)@LXMd?X$gKeb#H58DWZsL#u6_WmjrU7?`Xxj*Pw2anJ4$r^uEJ`c+OUPQy>}B z+}s$R-Av%3pzP|HmzQ5stPmXw&14~!1*r=90g36bT<4pbl9}j~U!f2U%)+1y49voC zhLH(O2*HAx6qH(=Us{x$TC4ynAV4`5l!=}5^GZ_lfHs11Jxnklu?Q%pUxv8288ks4YkU-H7%Fi!R0C^Z3!1}?N aRjEMNgA2^Wq7txo42?`Jxl~nM{oMd7bsk0l literal 0 HcmV?d00001 diff --git a/dydx/dydxViews/dydxViews/Media.xcassets/icon_portfolio.imageset/Contents.json b/dydx/dydxViews/dydxViews/Media.xcassets/icon_portfolio.imageset/Contents.json new file mode 100644 index 00000000..624a796d --- /dev/null +++ b/dydx/dydxViews/dydxViews/Media.xcassets/icon_portfolio.imageset/Contents.json @@ -0,0 +1,12 @@ +{ + "images" : [ + { + "filename" : "icon_portfolio.pdf", + "idiom" : "universal" + } + ], + "info" : { + "author" : "xcode", + "version" : 1 + } +} diff --git a/dydx/dydxViews/dydxViews/Media.xcassets/icon_portfolio.imageset/icon_portfolio.pdf b/dydx/dydxViews/dydxViews/Media.xcassets/icon_portfolio.imageset/icon_portfolio.pdf new file mode 100644 index 0000000000000000000000000000000000000000..8c0750783da928ed30b2152e1bb017f4b555eccc GIT binary patch literal 1453 zcmY!laBvK;I`dFTEr~!5FAK2q*+Jp}3?dH8Gc~f-!aK**;ZM9=GpbMYg&rC0lQl z&1dX1{lF34?C?sCv-im7;-J{z(42=Kr7lZ!iD7 z|N8Z}^UHku@~7u_%dfxsz54p2ulqcUFLJT=Nv)dP8t!rK@9Wp6A6Crxk#}vCP4=7j z2P9S+m%rBibtdI%%;}nUW)>Uw?cJVuIavP1R>^z8H!Ch|Kf9$@)ACod(1zWa+?p$7 z#WBBzpH;jncX`8AZif3opLG8nJ@yJ(<%qzQ*_^;r@-qXe#WS=wC@VDmk zSELoGx*tDRvtDV!`_Spvzg@riNp9Qf^@-fCKKygMo1~|;Zec|_+tFiMA2SvPv+e7M zO%m#k?9FQpe|xrS`Ul(TUygjp4L-E$m(Bt&k)I82RVB9(P_DU+~|S$|EZ( zohOuiT*#k)NiE5u%C$Ck^6R9SxqCHCCNZmCta5t0E&7Z}@w&}zik}5JW;$|mUTEL( z_TI8D*pGx9E;jFiRpJ0^qVHV!qX09nT+f&ms zJ4y8LkLHvPSEoCNZ=7md=_&WzjqBp~n~yqX+dL1 zdh+TMY?C6-#GB4+E$eW9rqOY=WY(5*tj*!F&x~BJ?VNKZRx#y5_RBS;uG7wzygMqj zbIGeszxJf%`)x0^KG}2Kc;}QIp^0`A7u(KU*t#iXLVfRv-Z*I`&pGYi+m1e6l-~3I zDKDcBQ^do#xn``z8tv)Hjl`1l=yt%_*-L;7f zsXmkIjJ&E{R$cR*8_&8TY-Mt!ZtU?Vb`Ju>KlVpUU48kr>#VWD+{*!RK1)Ad@GI_Q zUaWpNao;MRdcJS}#gq2R)c@O1d$aELKju2_m;zANg60iaCIjUfNai!QFokD56Syca zOX@r3<>i+YD@4aaGh9ezL8^j&Kw>&92l}R_WF|W0S13d)80Z;*0fJ#<0uw^8U?v5n z7U!21C8riEfC>Rn?geFN=lr~q)I6Y#pb`Kk7?4;56jLyT3L%vfAR&19q3@lU0(7bZ z$Ol0RFngTyOM!X~G2CAaDKB7wVTNK7$b-dj3qcNpc-%R$BrzvH9aU>ZQED2Ofr2>~ z#QPvp!OYau*i->13V3KqwB$;Rg@|Xm*>TXp3&0+=3olud;EmE47wWr2X}Mlx>pT zga<=@B4_5kc^qBc-n@CiIx59vX#V{VMfCC|y?Uj_>8|`$w#SE`#_9g}ksQEH*|i)G z!(Cu_t5%!$28 zBHp)5LOAH@=} zk42od&&Hcj-b-X}6ItYE9}`YD%xZrkh|>*qIwi5ZW;{o9h zM(r6vak{dxsj{uS8-~-Y#ab5vHI$8JBUYGN#H>wNY4xcQn?-`5RwGKVNuniNsWhnL z+`uYMjn*`*S^pem(PB7?Bd0@v0gBloC+7lrY=^YC3@}F)NGzon4laW3IzXrxDQJOS443F& zj2A=D!3M-c$Yf%G8M20Z#g=mj0V_qA!DugtkP*SdTnP}P|KfsMLkKfWXtjyfSdXI_ z39Lhf0HaMI;WcZUZ7Lg~O2C3gn`{+By14HAB~E&8v5d@^_1Zxm$Sf*RT&FyA({=Hd_@`KUF=ncFAKYnS~CE7%m<%a z#{dOMiQ(hcSor*D|B*FFNFvQ8sBOK)ra`-}80-PI`|ypL)UT=x$@2ufjLR|^Ph*sA zjzMZD|xX}CGFm17hcmMo3(r~-IAJ4$g$Jb^F?oa*zO<3gTl9Q_~8a}JX_|+@i{%)-#tHxGHmAg gNQLk!@bGs3?}+NxZ{+rHTXc8|>XDYRGfvxyW8OrN{Mebmcd)^<8+RZm7I)qJ{m`nU$W+C!%f2OLL~5 zzFPi%-=BYlbw9s6Jp1um@$TFH&y#;&eRuEk$F~~`moG2Apj)wb(O13+n{G+`zE*jE zg>@k-^A@9LE)PUaK2_MrOPzkJ_gi;Y{+d|l?3lo9a?Tu28+RV@m>rn0<8f{Y_vVhr zIUUV2T=?bgdfb>`Y&Cm{ve%W1OcQ%grrpugD4)7uO61?Ai#Trdmt2Y4>$-dO?ptT# zbdK)g75$d%uUtLL^!u?1zMIuNV=pju1}05!vV1-BbNpQQ>s|r71A6)lZyc!d-L&xZ z3GO?$)?`h1?0V>`XqL`eaqAO>(Wj)CB%~h19J_nt=05YiwmN1Jb>YF=Zb-~=oh7t_ zgU_yLmd9z0KNI2}CN&iqO#7r^E#f38a$v3FxgAUQw)GoMY;q5jNn)!r?*F~Vxv1j& zky*^Hy(bo!>=96uV0Ch4=9nD2#(}XiVynoOnc6{`cRt0Pi!|UV)tjgjVz6VOgKWwH z&M)Vt**ddJeUv%z>F3tYjfWQ8NtSbo-rCxzw}a=r!}M0C(69}Szjh}bU{`8sjg3k^ znsTyb&e4g62NpDC3flNHRY&YniDz%?-E&Iu%_Y{f%^~bZb>*hb`eE>Am7&81Z(fa` zo46drG*38u*rV^@7`LM|QoH8=`)?ObZI&H<*t6VNx6ghK@7(_zulvt<_j>iW3wGP= zcl!SL4oYUwbOK9opcDj2u%;%4@MLHL7X>9_$Gp7!l46DESZLx4sVqoU&<{vVhowf} z)RfFbr~C?qXkgL?C2U~QhBJ(e^^DDp4NS}xj7(vYFq48(i}Op1l2eNnKp6*=l0k{v zIX|x?H4kVbC^x_a0}_jXVhW~EAz+G!c>yGZ$aCJADL|(xfP4_70JFzAzZ9s~5X1e& zkh}vk$qdCLkOzz57J?iG@wjthNn%cZI;z%+qSQ1l0|j#~i1)!kU}kD+Y^nehh5|!i zsDLH%;6mm=ccKcJSz4kCnHvE^2UV4YC5A>zGYhz?lA^@SoYW#NQ0#fS0E0uLI6pU4 wQ$Zs$MH3Pz`a${mB?=%9g9BJUII}7h=z4HLl2}v%_Ku-}kvW&Ds;j>n0FA1&M*si- literal 0 HcmV?d00001 diff --git a/dydx/dydxViews/dydxViews/SwiftUIHosting/HostingViewController.swift b/dydx/dydxViews/dydxViews/SwiftUIHosting/HostingViewController.swift index 1a6c3262..3a724cc6 100644 --- a/dydx/dydxViews/dydxViews/SwiftUIHosting/HostingViewController.swift +++ b/dydx/dydxViews/dydxViews/SwiftUIHosting/HostingViewController.swift @@ -16,6 +16,7 @@ import UIToolkits import PlatformRouting import FloatingPanel import Utilities +import Combine public struct HostingViewControllerConfiguration { public init(ignoreSafeArea: Bool = true, fixedHeight: CGFloat? = nil, gradientTabbar: Bool = false, disableNavigationController: Bool = false) { @@ -33,16 +34,20 @@ public struct HostingViewControllerConfiguration { public static let `default` = HostingViewControllerConfiguration(ignoreSafeArea: false, fixedHeight: nil, gradientTabbar: false) public static let ignoreSafeArea = HostingViewControllerConfiguration(ignoreSafeArea: true) public static let tabbarItemView = HostingViewControllerConfiguration(ignoreSafeArea: false, fixedHeight: nil, gradientTabbar: true) - public static let nav = HostingViewControllerConfiguration(ignoreSafeArea: false, fixedHeight: nil, gradientTabbar: false, disableNavigationController: false) } open class HostingViewController: TrackingViewController, UIViewControllerEmbeddingProtocol { - + private var hostingController: UIHostingController? private let presenterView = ObjectPresenterView() private var configuration: HostingViewControllerConfiguration = .default - - private let gradientView = UIImageView() + private var subscriptions = Set() + + static private var gradientColors: [UIColor] { [ThemeColor.SemanticColor.layer2.uiColor.withAlphaComponent(0.01), + ThemeColor.SemanticColor.layer2.uiColor.withAlphaComponent(0.90)] } + private let gradientView = GradientView(gradientColors: HostingViewController.gradientColors, + startPoint: CGPoint(x: 0.5, y: 0), + endPoint: CGPoint(x: 0.5, y: 0.25)) public private(set) var presenter: HostedViewPresenter? @@ -98,14 +103,16 @@ open class HostingViewController: TrackingViewCo tabBarController?.tabBar.shadowImage = UIImage() tabBarController?.tabBar.backgroundImage = UIImage() - gradientView.backgroundColor = .clear - gradientView.contentMode = .scaleToFill view.addSubview(gradientView) gradientView.snp.updateConstraints { make in make.leading.trailing.bottom.equalToSuperview() - make.height.equalTo(83) + make.height.equalTo(96) } } + + dydxThemeSettings.shared.$currentThemeType.sink { [weak self] _ in + self?.updateTabItemGradient() + }.store(in: &subscriptions) } open override func viewWillAppear(_ animated: Bool) { @@ -144,7 +151,7 @@ open class HostingViewController: TrackingViewCo } override public var preferredStatusBarStyle: UIStatusBarStyle { - switch currentThemeType { + switch dydxThemeSettings.shared.currentThemeType { case .dark, .system, .classicDark: return .lightContent case .light: @@ -156,9 +163,9 @@ open class HostingViewController: TrackingViewCo super.traitCollectionDidChange(previousTraitCollection) if ThemeSettings.respondsToSystemTheme { - if UITraitCollection.current.userInterfaceStyle == .dark, currentThemeType != .dark { + if UITraitCollection.current.userInterfaceStyle == .dark, dydxThemeSettings.shared.currentThemeType != .dark { ThemeSettings.applyDarkTheme() - } else if UITraitCollection.current.userInterfaceStyle == .light, currentThemeType != .light { + } else if UITraitCollection.current.userInterfaceStyle == .light, dydxThemeSettings.shared.currentThemeType != .light { ThemeSettings.applyLightTheme() } updateTabItemGradient() @@ -206,8 +213,7 @@ open class HostingViewController: TrackingViewCo } private func updateTabItemGradient() { - let gradientImage = UIImage.named("gradient_tabbar", bundles: Bundle.particles) - gradientView.image = gradientImage?.withTintColor(ThemeColor.SemanticColor.layer2.uiColor) + gradientView.gradientColors = HostingViewController.gradientColors } } diff --git a/dydx/dydxViews/dydxViews/Themes/dydxThemes.swift b/dydx/dydxViews/dydxViews/Themes/dydxThemes.swift index 25f7e842..3a6135a3 100644 --- a/dydx/dydxViews/dydxViews/Themes/dydxThemes.swift +++ b/dydx/dydxViews/dydxViews/Themes/dydxThemes.swift @@ -13,6 +13,11 @@ import UIKit import SwiftUI import Utilities +class dydxThemeSettings { + static let shared = dydxThemeSettings() + @Published fileprivate(set) var currentThemeType: dydxThemeType = .dark +} + public enum dydxThemeType: String { case dark case classicDark = "classic_dark" @@ -34,7 +39,6 @@ public enum dydxThemeType: String { } } -public var currentThemeType = dydxThemeType.dark private var loadFontOnce: Void = { let fonts = Bundle(for: dydxViewBundleClass.self).urls(forResourcesWithExtension: "otf", subdirectory: nil) @@ -86,7 +90,7 @@ public extension ThemeSettings { case .classicDark, .dark, .light: if let config = theme.config { shared.themeConfig = config - currentThemeType = theme + dydxThemeSettings.shared.currentThemeType = theme } else { assertionFailure("\(theme.configFileName ?? "theme config file") not found") } diff --git a/dydx/dydxViews/dydxViews/_v4/NewsAlerts/Components/Alerts/dydxAlertItem.swift b/dydx/dydxViews/dydxViews/_v4/Alerts/Components/Alerts/dydxAlertItem.swift similarity index 100% rename from dydx/dydxViews/dydxViews/_v4/NewsAlerts/Components/Alerts/dydxAlertItem.swift rename to dydx/dydxViews/dydxViews/_v4/Alerts/Components/Alerts/dydxAlertItem.swift diff --git a/dydx/dydxViews/dydxViews/_v4/Alerts/Components/Alerts/dydxAlertsView.swift b/dydx/dydxViews/dydxViews/_v4/Alerts/Components/Alerts/dydxAlertsView.swift new file mode 100644 index 00000000..c74261ea --- /dev/null +++ b/dydx/dydxViews/dydxViews/_v4/Alerts/Components/Alerts/dydxAlertsView.swift @@ -0,0 +1,99 @@ +// +// dydxAlertsView.swift +// dydxUI +// +// Created by Rui Huang on 5/3/23. +// Copyright © 2023 dYdX Trading Inc. All rights reserved. +// + +import SwiftUI +import PlatformUI +import Utilities + +public class dydxAlertsViewModel: PlatformViewModel { + @Published public var listViewModel: PlatformListViewModel + @Published public var backAction: (() -> Void)? + + public init() { + self.listViewModel = PlatformListViewModel(intraItemSeparator: false) + } + + public static var previewValue: dydxAlertsViewModel { + let vm = dydxAlertsViewModel() + vm.listViewModel = .init(items: [ + dydxAlertItemModel.previewValue, + dydxAlertItemModel.previewValue + ]) + return vm + } + + private func createAlertsView(parentStyle: ThemeStyle) -> some View { + ScrollView(showsIndicators: false) { + LazyVStack(pinnedViews: [.sectionHeaders]) { + self.listViewModel.createView(parentStyle: parentStyle) + .padding(.horizontal, 8) + } + } + } + + private func createHeader(parentStyle: ThemeStyle) -> some View { + HStack(spacing: 16) { + let buttonContent = PlatformIconViewModel(type: .system(name: "chevron.left"), size: CGSize(width: 16, height: 16), templateColor: .textTertiary) + PlatformButtonViewModel(content: buttonContent, type: .iconType) {[weak self] in + self?.backAction?() + } + .createView() + .padding([.leading, .vertical], 8) + Text(DataLocalizer.localize(path: "APP.GENERAL.ALERTS", params: nil)) + .themeFont(fontType: .base, fontSize: .largest) + .themeColor(foreground: .textPrimary) + Spacer() + } + } + + public override func createView(parentStyle: ThemeStyle = ThemeStyle.defaultStyle, styleKey: String? = nil) -> PlatformView { + PlatformView(viewModel: self, parentStyle: parentStyle, styleKey: styleKey) { [weak self] style in + guard let self = self else { return AnyView(PlatformView.nilView) } + + return VStack(spacing: 20) { + self.createHeader(parentStyle: style) + .frame(height: 48) + .padding([.leading, .trailing]) + + self.createAlertsView(parentStyle: style) + } + // offset for tab bar. comes from dydxV4TabBarBuilder's center button height + .padding(.bottom, 30) + .themeColor(background: .layer2) + .wrappedInAnyView() + } + } +} + +#if DEBUG +struct dydxAlertsView_Previews_Dark: PreviewProvider { + @StateObject static var themeSettings = ThemeSettings.shared + + static var previews: some View { + ThemeSettings.applyDarkTheme() + ThemeSettings.applyStyles() + return dydxAlertsViewModel.previewValue + .createView() + // .edgesIgnoringSafeArea(.bottom) + .previewLayout(.sizeThatFits) + } +} + +struct dydxAlertsView_Previews_Light: PreviewProvider { + @StateObject static var themeSettings = ThemeSettings.shared + + static var previews: some View { + ThemeSettings.applyLightTheme() + ThemeSettings.applyStyles() + return dydxAlertsViewModel.previewValue + .createView() + // .edgesIgnoringSafeArea(.bottom) + .previewLayout(.sizeThatFits) + } +} +#endif diff --git a/dydx/dydxViews/dydxViews/_v4/Auth/dydxSecurityView.swift b/dydx/dydxViews/dydxViews/_v4/Auth/dydxSecurityView.swift index 238a65e1..69d1567a 100644 --- a/dydx/dydxViews/dydxViews/_v4/Auth/dydxSecurityView.swift +++ b/dydx/dydxViews/dydxViews/_v4/Auth/dydxSecurityView.swift @@ -71,7 +71,7 @@ public class dydxSecurityViewModel: PlatformViewModel { private func logoImage(parentStyle: ThemeStyle, styleKey: String?) -> PlatformView { let imageName: String - if currentThemeType == .light { + if dydxThemeSettings.shared.currentThemeType == .light { imageName = "brand_light" } else { imageName = "brand_dark" diff --git a/dydx/dydxViews/dydxViews/_v4/NewsAlerts/Components/Alerts/dydxAlertsView.swift b/dydx/dydxViews/dydxViews/_v4/NewsAlerts/Components/Alerts/dydxAlertsView.swift deleted file mode 100644 index 66469648..00000000 --- a/dydx/dydxViews/dydxViews/_v4/NewsAlerts/Components/Alerts/dydxAlertsView.swift +++ /dev/null @@ -1,54 +0,0 @@ -// -// dydxAlertsView.swift -// dydxUI -// -// Created by Rui Huang on 5/3/23. -// Copyright © 2023 dYdX Trading Inc. All rights reserved. -// - -import SwiftUI -import PlatformUI -import Utilities - -public class dydxAlertsViewModel: PlatformListViewModel { - public init() { - super.init(intraItemSeparator: false) - } - - public static var previewValue: dydxAlertsViewModel { - let vm = dydxAlertsViewModel() - vm.items = [ - dydxAlertItemModel.previewValue, - dydxAlertItemModel.previewValue - ] - return vm - } -} - -#if DEBUG -struct dydxAlertsView_Previews_Dark: PreviewProvider { - @StateObject static var themeSettings = ThemeSettings.shared - - static var previews: some View { - ThemeSettings.applyDarkTheme() - ThemeSettings.applyStyles() - return dydxAlertsViewModel.previewValue - .createView() - // .edgesIgnoringSafeArea(.bottom) - .previewLayout(.sizeThatFits) - } -} - -struct dydxAlertsView_Previews_Light: PreviewProvider { - @StateObject static var themeSettings = ThemeSettings.shared - - static var previews: some View { - ThemeSettings.applyLightTheme() - ThemeSettings.applyStyles() - return dydxAlertsViewModel.previewValue - .createView() - // .edgesIgnoringSafeArea(.bottom) - .previewLayout(.sizeThatFits) - } -} -#endif diff --git a/dydx/dydxViews/dydxViews/_v4/NewsAlerts/dydxNewsAlertsView.swift b/dydx/dydxViews/dydxViews/_v4/NewsAlerts/dydxNewsAlertsView.swift deleted file mode 100644 index 197707a2..00000000 --- a/dydx/dydxViews/dydxViews/_v4/NewsAlerts/dydxNewsAlertsView.swift +++ /dev/null @@ -1,151 +0,0 @@ -// -// dydxNewsAlertsView.swift -// dydxViews -// -// Created by Rui Huang on 2/7/23. -// Copyright © 2023 dYdX Trading Inc. All rights reserved. -// - -import SwiftUI -import PlatformUI -import Utilities - -public class dydxNewsAlertsViewModel: PlatformViewModel { - @Published public var selectionBar: SelectionBarModel? - @Published public var blog = PlatformWebViewModel() - @Published public var alerts: dydxAlertsViewModel? - @Published public var canGoBack: Bool = false - @Published public var canGoForward: Bool = false - - public init() { - super.init() - blog.pageLoaded = { [weak self] in - self?.canGoBack = self?.blog.canGoBack ?? false - self?.canGoForward = self?.blog.canGoForward ?? false - } - } - - public static var previewValue: dydxNewsAlertsViewModel { - let vm = dydxNewsAlertsViewModel() - vm.selectionBar = .previewValue - vm.blog = .previewValue - return vm - } - - public override func createView(parentStyle: ThemeStyle = ThemeStyle.defaultStyle, styleKey: String? = nil) -> PlatformView { - PlatformView(viewModel: self, parentStyle: parentStyle, styleKey: styleKey) { [weak self] style in - guard let self = self else { return AnyView(PlatformView.nilView) } - - let view = VStack { - if let selectionBar = self.selectionBar { - selectionBar.createView(parentStyle: style) - .animation(.default, value: self.selectionBar?.items) - - VStack { - // alerts selected - if self.selectionBar?.currentSelectionIndex == 0 { - self.createAlertsView(parentStyle: style) - // news selected - } else if self.selectionBar?.currentSelectionIndex == 1 { - self.blog.createView(parentStyle: style) - .frame(maxHeight: .infinity) - } - - Spacer() - } - } else { - self.createHeader(parentStyle: style) - .frame(height: 48) - .padding([.leading, .trailing]) - - self.createAlertsView(parentStyle: style) - } - } - .themeColor(background: .layer2) - - // make it visible under the tabbar for dark mode only (since the news site is dark only) - if currentThemeType == .light { - return AnyView(view) - } else { - return AnyView(view.ignoresSafeArea(edges: [.bottom])) - } - } - } - - private func createAlertsView(parentStyle: ThemeStyle) -> some View { - ScrollView(showsIndicators: false) { - LazyVStack(pinnedViews: [.sectionHeaders]) { - self.alerts?.createView(parentStyle: parentStyle) - .padding(.horizontal, 8) - Spacer(minLength: 80) - } - } - } - - private func createHeader(parentStyle: ThemeStyle) -> some View { - HStack { - Text(DataLocalizer.localize(path: "APP.GENERAL.ALERTS", params: nil)) - .themeFont(fontType: .plus, fontSize: .largest) - - Spacer() - -// if selectionBar?.currentSelectionIndex == 1 { -// let iconBack = self.createIcon(imageName: "chevron.compact.left", isEnabled: self.canGoBack) -// PlatformButtonViewModel(content: iconBack, -// type: .iconType, -// state: self.canGoBack ? .secondary: .disabled, -// action: { [weak self] in self?.blog.goBack() }) -// .createView(parentStyle: parentStyle) -// .animation(.default) -// -// let iconForward = self.createIcon(imageName: "chevron.compact.right", isEnabled: self.canGoForward) -// PlatformButtonViewModel(content: iconForward, -// type: .iconType, -// state: self.canGoForward ? .secondary: .disabled, -// action: { [weak self] in self?.blog.goForward() }) -// .createView(parentStyle: parentStyle) -// .animation(.default) -// } - } - } - - private func createIcon(imageName: String, isEnabled: Bool) -> PlatformIconViewModel { - if isEnabled { - return PlatformIconViewModel(type: .system(name: imageName), - clip: .circle(background: .layer3, spacing: 24, borderColor: .layer6), - size: CGSize(width: 42, height: 42)) - } else { - return PlatformIconViewModel(type: .system(name: imageName), - clip: .circle(background: .layer1, spacing: 24, borderColor: .layer6), - size: CGSize(width: 42, height: 42), templateColor: .textTertiary) - } - } -} - -#if DEBUG -struct dydxNewsAlertsView_Previews_Dark: PreviewProvider { - @StateObject static var themeSettings = ThemeSettings.shared - - static var previews: some View { - ThemeSettings.applyDarkTheme() - ThemeSettings.applyStyles() - return dydxNewsAlertsViewModel.previewValue - .createView() - // .edgesIgnoringSafeArea(.bottom) - .previewLayout(.sizeThatFits) - } -} - -struct dydxNewsAlertsView_Previews_Light: PreviewProvider { - @StateObject static var themeSettings = ThemeSettings.shared - - static var previews: some View { - ThemeSettings.applyLightTheme() - ThemeSettings.applyStyles() - return dydxNewsAlertsViewModel.previewValue - .createView() - // .edgesIgnoringSafeArea(.bottom) - .previewLayout(.sizeThatFits) - } -} -#endif diff --git a/dydx/dydxViews/dydxViews/_v4/Profile/Components/dydxSettingsHelpRowView.swift b/dydx/dydxViews/dydxViews/_v4/Profile/Components/dydxProfileSecondaryButtonsView.swift similarity index 53% rename from dydx/dydxViews/dydxViews/_v4/Profile/Components/dydxSettingsHelpRowView.swift rename to dydx/dydxViews/dydxViews/_v4/Profile/Components/dydxProfileSecondaryButtonsView.swift index 437b40c8..15400e49 100644 --- a/dydx/dydxViews/dydxViews/_v4/Profile/Components/dydxSettingsHelpRowView.swift +++ b/dydx/dydxViews/dydxViews/_v4/Profile/Components/dydxProfileSecondaryButtonsView.swift @@ -1,5 +1,5 @@ // -// dydxSettingsHelpRowView.swift +// dydxProfileSecondaryButtonsView.swift // dydxViews // // Created by Michael Maguire on 11/9/23. @@ -9,44 +9,62 @@ import SwiftUI import PlatformUI import Utilities -public class dydxSettingsHelpRowViewModel: PlatformViewModel { +public class dydxProfileSecondaryButtonsViewModel: PlatformViewModel { @Published public var settingsAction: (() -> Void)? @Published public var helpAction: (() -> Void)? + @Published public var alertsAction: (() -> Void)? public init() { } - public static var previewValue: dydxSettingsHelpRowViewModel { - let vm = dydxSettingsHelpRowViewModel() + public static var previewValue: dydxProfileSecondaryButtonsViewModel { + let vm = dydxProfileSecondaryButtonsViewModel() return vm } - + + @ViewBuilder + private var settingsHelpRow: some View { + if let settingsAction, let helpAction { + HStack(spacing: 16) { + self.createButton(imageName: "icon_settings", + title: DataLocalizer.localize(path: "APP.EMAIL_NOTIFICATIONS.SETTINGS"), + action: settingsAction) + + self.createButton(imageName: "icon_tutorial", + title: DataLocalizer.localize(path: "APP.HEADER.HELP"), + action: helpAction) + } + } + } + + @ViewBuilder + private var alertsRow: some View { + if let alertsAction { + self.createButton(imageName: "icon_alerts", + title: DataLocalizer.localize(path: "APP.GENERAL.ALERTS"), + action: alertsAction) + } + } + public override func createView(parentStyle: ThemeStyle = ThemeStyle.defaultStyle, styleKey: String? = nil) -> PlatformUI.PlatformView { PlatformView(viewModel: self, parentStyle: parentStyle, styleKey: styleKey) { [weak self] style in guard let self = self else { return AnyView(PlatformView.nilView) } return AnyView( - HStack(spacing: 16) { - self.createButton(parentStyle: style, - imageName: "icon_settings", - title: DataLocalizer.localize(path: "APP.EMAIL_NOTIFICATIONS.SETTINGS"), - action: self.settingsAction) - - self.createButton(parentStyle: style, - imageName: "icon_tutorial", - title: DataLocalizer.localize(path: "APP.HEADER.HELP"), - action: self.helpAction) + VStack(spacing: 16) { + self.settingsHelpRow + self.alertsRow } ) } } - private func createButton(parentStyle: ThemeStyle, imageName: String, title: String, action: (() -> Void)?) -> some View { + private func createButton(imageName: String, title: String, action: (() -> Void)?) -> some View { HStack(spacing: 8) { PlatformIconViewModel(type: .asset(name: imageName, bundle: Bundle.dydxView), clip: .noClip, size: CGSize(width: 24, height: 24), templateColor: .textTertiary) - .createView(parentStyle: parentStyle) + .createView() Text(title) .themeFont(fontSize: .medium) @@ -66,26 +84,26 @@ public class dydxSettingsHelpRowViewModel: PlatformViewModel { } #if DEBUG -struct dydxSettingsHelpRowView_Previews_Dark: PreviewProvider { +struct dydxProfileSecondaryButtonsViewModel_Previews_Dark: PreviewProvider { @StateObject static var themeSettings = ThemeSettings.shared static var previews: some View { ThemeSettings.applyDarkTheme() ThemeSettings.applyStyles() - return dydxSettingsHelpRowViewModel.previewValue + return dydxProfileSecondaryButtonsViewModel.previewValue .createView() // .edgesIgnoringSafeArea(.bottom) .previewLayout(.sizeThatFits) } } -struct dydxSettingsHelpRowView_Previews_Light: PreviewProvider { +struct dydxProfileSecondaryButtonsViewModel_Previews_Light: PreviewProvider { @StateObject static var themeSettings = ThemeSettings.shared static var previews: some View { ThemeSettings.applyLightTheme() ThemeSettings.applyStyles() - return dydxSettingsHelpRowViewModel.previewValue + return dydxProfileSecondaryButtonsViewModel.previewValue .createView() // .edgesIgnoringSafeArea(.bottom) .previewLayout(.sizeThatFits) diff --git a/dydx/dydxViews/dydxViews/_v4/Profile/dydxProfileView.swift b/dydx/dydxViews/dydxViews/_v4/Profile/dydxProfileView.swift index 75d7fc5d..620c92b4 100644 --- a/dydx/dydxViews/dydxViews/_v4/Profile/dydxProfileView.swift +++ b/dydx/dydxViews/dydxViews/_v4/Profile/dydxProfileView.swift @@ -14,7 +14,7 @@ import dydxFormatter public class dydxProfileViewModel: PlatformViewModel { @Published public var header = dydxProfileHeaderViewModel() @Published public var buttons = dydxProfileButtonsViewModel() - @Published public var settingsHelp = dydxSettingsHelpRowViewModel() + @Published public var secondaryButtons = dydxProfileSecondaryButtonsViewModel() @Published public var history: dydxProfileHistoryViewModel? = dydxProfileHistoryViewModel() @Published public var fees: dydxProfileFeesViewModel? = dydxProfileFeesViewModel() @Published public var balances: dydxProfileBalancesViewModel? = dydxProfileBalancesViewModel() @@ -40,7 +40,7 @@ public class dydxProfileViewModel: PlatformViewModel { self.buttons .createView(parentStyle: style) - self.settingsHelp + self.secondaryButtons .createView(parentStyle: style) .padding(.top, 8) diff --git a/dydx/dydxViews/dydxViews/_v4/Update/dydxUpdateView.swift b/dydx/dydxViews/dydxViews/_v4/Update/dydxUpdateView.swift index 8bc83e07..42cad1e2 100644 --- a/dydx/dydxViews/dydxViews/_v4/Update/dydxUpdateView.swift +++ b/dydx/dydxViews/dydxViews/_v4/Update/dydxUpdateView.swift @@ -85,7 +85,7 @@ public class dydxUpdateViewModel: PlatformViewModel { private func logoImage(parentStyle: ThemeStyle, styleKey: String?) -> PlatformView { let imageName: String - if currentThemeType == .light { + if dydxThemeSettings.shared.currentThemeType == .light { imageName = "brand_light" } else { imageName = "brand_dark"