Skip to content

Commit

Permalink
Help and Welcome
Browse files Browse the repository at this point in the history
  • Loading branch information
ruixhuang committed Jan 24, 2025
1 parent c75743a commit 071c355
Show file tree
Hide file tree
Showing 9 changed files with 160 additions and 14 deletions.
8 changes: 4 additions & 4 deletions Utilities/Utilities/_Extensions/AttributedString+Ext.swift
Original file line number Diff line number Diff line change
Expand Up @@ -9,16 +9,16 @@
import Foundation

extension AttributedString {
public init(text: String, url: URL?) {
public init(text: String, url: URL?, foregroundColor: UIColor? = .link) {
self.init(text)
if let url = url {
self.link = url
self.foregroundColor = .link
self.foregroundColor = foregroundColor
}
}

public init(text: String, urlString: String?) {
self.init(text: text, url: createUrl(string: urlString))
public init(text: String, urlString: String?, foregroundColor: UIColor? = .link) {
self.init(text: text, url: createUrl(string: urlString), foregroundColor: foregroundColor)
}
}

Expand Down
4 changes: 4 additions & 0 deletions dydx/dydxPresenters/dydxPresenters.xcodeproj/project.pbxproj
Original file line number Diff line number Diff line change
Expand Up @@ -22,6 +22,7 @@
0204924D2D3DFDC400394CBE /* dydxSimpleUIFeesViewPresenter.swift in Sources */ = {isa = PBXBuildFile; fileRef = 0204924C2D3DFDC300394CBE /* dydxSimpleUIFeesViewPresenter.swift */; };
020492532D3EDA3100394CBE /* dydxSimpleUITradeStatusViewBuilder.swift in Sources */ = {isa = PBXBuildFile; fileRef = 020492522D3EDA3000394CBE /* dydxSimpleUITradeStatusViewBuilder.swift */; };
020494362D42D1DC00394CBE /* dydxSimpleUITradeInputPositionViewPresenter.swift in Sources */ = {isa = PBXBuildFile; fileRef = 020494282D42D1DB00394CBE /* dydxSimpleUITradeInputPositionViewPresenter.swift */; };
0204946D2D43F6D500394CBE /* dydxProfileHelpViewPresenter.swift in Sources */ = {isa = PBXBuildFile; fileRef = 0204945F2D43F6CC00394CBE /* dydxProfileHelpViewPresenter.swift */; };
0207FC9D2D269C00004C2C9F /* dydxSimpleUITradeInputValidationViewPresenter.swift in Sources */ = {isa = PBXBuildFile; fileRef = 0207FC8F2D269BFF004C2C9F /* dydxSimpleUITradeInputValidationViewPresenter.swift */; };
0207FC9F2D27BA6B004C2C9F /* dydxSimpleUITradeInputCtaButtonViewPresenter.swift in Sources */ = {isa = PBXBuildFile; fileRef = 0207FC9E2D27BA62004C2C9F /* dydxSimpleUITradeInputCtaButtonViewPresenter.swift */; };
0207FCA32D2A181D004C2C9F /* dydxSimpleUIMarketsHeaderViewPresenter.swift in Sources */ = {isa = PBXBuildFile; fileRef = 0207FCA22D2A181C004C2C9F /* dydxSimpleUIMarketsHeaderViewPresenter.swift */; };
Expand Down Expand Up @@ -446,6 +447,7 @@
0204924C2D3DFDC300394CBE /* dydxSimpleUIFeesViewPresenter.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = dydxSimpleUIFeesViewPresenter.swift; sourceTree = "<group>"; };
020492522D3EDA3000394CBE /* dydxSimpleUITradeStatusViewBuilder.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = dydxSimpleUITradeStatusViewBuilder.swift; sourceTree = "<group>"; };
020494282D42D1DB00394CBE /* dydxSimpleUITradeInputPositionViewPresenter.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = dydxSimpleUITradeInputPositionViewPresenter.swift; sourceTree = "<group>"; };
0204945F2D43F6CC00394CBE /* dydxProfileHelpViewPresenter.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = dydxProfileHelpViewPresenter.swift; sourceTree = "<group>"; };
0207FC8F2D269BFF004C2C9F /* dydxSimpleUITradeInputValidationViewPresenter.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = dydxSimpleUITradeInputValidationViewPresenter.swift; sourceTree = "<group>"; };
0207FC9E2D27BA62004C2C9F /* dydxSimpleUITradeInputCtaButtonViewPresenter.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = dydxSimpleUITradeInputCtaButtonViewPresenter.swift; sourceTree = "<group>"; };
0207FCA22D2A181C004C2C9F /* dydxSimpleUIMarketsHeaderViewPresenter.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = dydxSimpleUIMarketsHeaderViewPresenter.swift; sourceTree = "<group>"; };
Expand Down Expand Up @@ -1078,6 +1080,7 @@
0258BA2729929E7D0098E1BE /* Components */ = {
isa = PBXGroup;
children = (
0204945F2D43F6CC00394CBE /* dydxProfileHelpViewPresenter.swift */,
277E8FC82B1E576B005CCBCB /* dydxProfileRewardsViewPresenter.swift */,
027F3F052AB93B3700602E5B /* dydxProfileBalancesViewPresenter.swift */,
0258BA2829929E870098E1BE /* dydxProfileButtonsViewPresenter.swift */,
Expand Down Expand Up @@ -2363,6 +2366,7 @@
027886042D1F4BD300366321 /* dydxSimpleUITradeInputViewBuilder.swift in Sources */,
277437642CAC9AD800F9A6B9 /* Kotlin+Ext.swift in Sources */,
0207FC9F2D27BA6B004C2C9F /* dydxSimpleUITradeInputCtaButtonViewPresenter.swift in Sources */,
0204946D2D43F6D500394CBE /* dydxProfileHelpViewPresenter.swift in Sources */,
);
runOnlyForDeploymentPostprocessing = 0;
};
Expand Down
Original file line number Diff line number Diff line change
@@ -0,0 +1,29 @@
//
// dydxProfileHelpViewPresenter.swift
// dydxPresenters
//
// Created by Rui Huang on 24/01/2025.
//

import Utilities
import dydxViews
import PlatformParticles
import RoutingKit
import ParticlesKit
import PlatformUI

protocol dydxProfileHelpViewPresenterProtocol: HostedViewPresenterProtocol {
var viewModel: dydxProfileHelpViewModel? { get }
}

class dydxProfileHelpViewPresenter: HostedViewPresenter<dydxProfileHelpViewModel>, dydxProfileHelpViewPresenterProtocol {
override init() {
super.init()

viewModel = dydxProfileHelpViewModel()

viewModel?.helpAction = {
Router.shared?.navigate(to: RoutingRequest(path: "/help"), animated: true, completion: nil)
}
}
}
Original file line number Diff line number Diff line change
Expand Up @@ -49,6 +49,7 @@ private class dydxProfileViewPresenter: HostedViewPresenter<dydxProfileViewModel
private let rewardsPresenter: dydxProfileRewardsViewPresenter
private let balancesPresenter: dydxProfileBalancesViewPresenter
private let topButtonsPresenter = dydxProfileTopButtonsViewPresenter()
private let helpPresenter = dydxProfileHelpViewPresenter()

private lazy var childPresenters: [HostedViewPresenterProtocol] = [
buttonsPresenter,
Expand All @@ -58,7 +59,8 @@ private class dydxProfileViewPresenter: HostedViewPresenter<dydxProfileViewModel
feesPresenter,
rewardsPresenter,
balancesPresenter,
topButtonsPresenter
topButtonsPresenter,
helpPresenter
]

override init() {
Expand All @@ -81,6 +83,7 @@ private class dydxProfileViewPresenter: HostedViewPresenter<dydxProfileViewModel

if dydxBoolFeatureFlag.simple_ui.isEnabled {
topButtonsPresenter.$viewModel.assign(to: &viewModel.$topButtons)
helpPresenter.$viewModel.assign(to: &viewModel.$help)
} else {
secondaryButtonsPresenter.$viewModel.assign(to: &viewModel.$secondaryButtons)
}
Expand Down
4 changes: 4 additions & 0 deletions dydx/dydxViews/dydxViews.xcodeproj/project.pbxproj
Original file line number Diff line number Diff line change
Expand Up @@ -27,6 +27,7 @@
020492502D3EDA1200394CBE /* dydxSimpleUITradeStatusView.swift in Sources */ = {isa = PBXBuildFile; fileRef = 0204924F2D3EDA1200394CBE /* dydxSimpleUITradeStatusView.swift */; };
020494192D41ED8D00394CBE /* dydxSimpleUIClosePercentView.swift in Sources */ = {isa = PBXBuildFile; fileRef = 020494182D41ED8D00394CBE /* dydxSimpleUIClosePercentView.swift */; };
020494272D42D1CD00394CBE /* dydxSimpleUITradeInputPositionView.swift in Sources */ = {isa = PBXBuildFile; fileRef = 020494262D42D1CD00394CBE /* dydxSimpleUITradeInputPositionView.swift */; };
020494502D43F46900394CBE /* dydxProfileHelpView.swift in Sources */ = {isa = PBXBuildFile; fileRef = 0204944F2D43F46900394CBE /* dydxProfileHelpView.swift */; };
0207FCA12D2A17DF004C2C9F /* dydxSimpleUIMarketsHeaderView.swift in Sources */ = {isa = PBXBuildFile; fileRef = 0207FCA02D2A17DF004C2C9F /* dydxSimpleUIMarketsHeaderView.swift */; };
02084B2D297FC2CD00CF9522 /* dydxTransferFaucetView.swift in Sources */ = {isa = PBXBuildFile; fileRef = 02084B2C297FC2CD00CF9522 /* dydxTransferFaucetView.swift */; };
02084C682981253200CF9522 /* dydxValidationView.swift in Sources */ = {isa = PBXBuildFile; fileRef = 02084C672981253200CF9522 /* dydxValidationView.swift */; };
Expand Down Expand Up @@ -453,6 +454,7 @@
0204924F2D3EDA1200394CBE /* dydxSimpleUITradeStatusView.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = dydxSimpleUITradeStatusView.swift; sourceTree = "<group>"; };
020494182D41ED8D00394CBE /* dydxSimpleUIClosePercentView.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = dydxSimpleUIClosePercentView.swift; sourceTree = "<group>"; };
020494262D42D1CD00394CBE /* dydxSimpleUITradeInputPositionView.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = dydxSimpleUITradeInputPositionView.swift; sourceTree = "<group>"; };
0204944F2D43F46900394CBE /* dydxProfileHelpView.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = dydxProfileHelpView.swift; sourceTree = "<group>"; };
0207FCA02D2A17DF004C2C9F /* dydxSimpleUIMarketsHeaderView.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = dydxSimpleUIMarketsHeaderView.swift; sourceTree = "<group>"; };
02084B2C297FC2CD00CF9522 /* dydxTransferFaucetView.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = dydxTransferFaucetView.swift; sourceTree = "<group>"; };
02084C672981253200CF9522 /* dydxValidationView.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = dydxValidationView.swift; sourceTree = "<group>"; };
Expand Down Expand Up @@ -1276,6 +1278,7 @@
02F6E7102A8292FC0018F00C /* dydxProfileFeesView.swift */,
27C027442AFD734800E92CCB /* dydxProfileSecondaryButtonsView.swift */,
277E8F9E2B1A847D005CCBCB /* dydxTitledCardView.swift */,
0204944F2D43F46900394CBE /* dydxProfileHelpView.swift */,
);
path = Components;
sourceTree = "<group>";
Expand Down Expand Up @@ -2458,6 +2461,7 @@
0230A2A328B84A160036DDF3 /* HostingViewController.swift in Sources */,
025BA65A290100CD00CDAE99 /* LeverageRisk.swift in Sources */,
027887BB2D268FE800366321 /* ValidationErrorView.swift in Sources */,
020494502D43F46900394CBE /* dydxProfileHelpView.swift in Sources */,
024F487A29657D7900E40247 /* dydxUserFavoriteView.swift in Sources */,
02D6DBB42D134723008AAEA1 /* dydxSimpleUIMarketView.swift in Sources */,
02B27A3A2AE8BC5A00A995EC /* dydxHelpView.swift in Sources */,
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -25,19 +25,26 @@ public class dydxOnboardWelcomeViewModel: PlatformViewModel {
private func createHeader() -> some View {
VStack(alignment: .leading, spacing: 8) {
Text(DataLocalizer.localize(path: "APP.ONBOARDING.WELCOME"))
.themeFont(fontType: .base, fontSize: .largest)
.themeFont(fontType: .plus, fontSize: .largest)
.themeColor(foreground: .textPrimary)
.leftAligned()
Text(DataLocalizer.localize(path: "APP.ONBOARDING.WELCOME_TEXT"))
.themeFont(fontSize: .small)
.themeColor(foreground: .textTertiary)
.frame(minHeight: 48)
.leftAligned()
}
.padding(.horizontal, 8)
.padding(.top, 16)
.frame(maxWidth: .infinity)
}

private func createHighlightView(assetName: String, titlePath: String, subtitlePath: String, style: ThemeStyle) -> some View {
HStack {
HStack(spacing: 16) {
PlatformIconViewModel(type: .asset(name: assetName, bundle: Bundle.dydxView),
clip: .circle(background: .layer5, spacing: 30),
size: CGSize(width: 60, height: 60))
size: CGSize(width: 60, height: 60),
templateColor: .textPrimary)
.createView(parentStyle: style)

VStack(alignment: .leading, spacing: 6) {
Expand All @@ -52,12 +59,14 @@ public class dydxOnboardWelcomeViewModel: PlatformViewModel {

Spacer()
}
.padding(.horizontal, 8)
.frame(maxWidth: .infinity)
}

private func createCta(style: ThemeStyle) -> some View {
let ctaContent = Text(DataLocalizer.localize(path: "APP.ONBOARDING.GET_STARTED"))
let ctaContent = Text(DataLocalizer.localize(path: "APP.COMPLIANCE_MODAL.CONTINUE"))
return PlatformButtonViewModel(content: ctaContent.wrappedViewModel,
type: .defaultType(minHeight: 56),
state: .primary) { [weak self] in
self?.ctaAction?()
}
Expand All @@ -80,7 +89,8 @@ public class dydxOnboardWelcomeViewModel: PlatformViewModel {
}
Spacer()
}
.padding()
.padding(.horizontal, 16)
.padding(.vertical, 8)
.themeColor(background: .layer3)
.makeSheet()

Expand All @@ -100,8 +110,8 @@ public class dydxOnboardWelcomeViewModel: PlatformViewModel {
let tosText = DataLocalizer.localize(path: "APP.HEADER.TERMS_OF_USE")
let privacyText = DataLocalizer.localize(path: "APP.ONBOARDING.PRIVACY_POLICY")

let tos = AttributedString(text: tosText, urlString: tosUrl)
let privacy = AttributedString(text: privacyText, urlString: privacyPolicyUrl)
let tos = AttributedString(text: tosText, urlString: tosUrl, foregroundColor: ThemeColor.SemanticColor.colorPurple.uiColor)
let privacy = AttributedString(text: privacyText, urlString: privacyPolicyUrl, foregroundColor: ThemeColor.SemanticColor.colorPurple.uiColor)

let agreementText = DataLocalizer.localize(path: "APP.ONBOARDING.YOU_AGREE_TO_TERMS")
var result = AttributedString(agreementText)
Expand Down
Original file line number Diff line number Diff line change
@@ -0,0 +1,85 @@
//
// dydxProfileHelpView.swift
// dydxUI
//
// Created by Rui Huang on 24/01/2025.
// Copyright © 2025 dYdX Trading Inc. All rights reserved.
//

import SwiftUI
import PlatformUI
import Utilities

public class dydxProfileHelpViewModel: PlatformViewModel {
@Published public var helpAction: (() -> Void)?

public init() { }

public static var previewValue: dydxProfileHelpViewModel {
let vm = dydxProfileHelpViewModel()
return vm
}

public override func createView(parentStyle: ThemeStyle = ThemeStyle.defaultStyle, styleKey: String? = nil) -> PlatformView {
PlatformView(viewModel: self, parentStyle: parentStyle, styleKey: styleKey) { [weak self] _ in
guard let self = self else { return AnyView(PlatformView.nilView) }

let view = HStack(spacing: 8) {
PlatformIconViewModel(type: .asset(name: "icon_tutorial", bundle: Bundle.dydxView),
clip: .noClip,
size: CGSize(width: 24, height: 24),
templateColor: .textTertiary)
.createView()

Text(DataLocalizer.localize(path: "APP.HEADER.HELP"))
.themeFont(fontSize: .medium)
.themeColor(foreground: .textPrimary)
.lineLimit(1)

Spacer()
}
.padding(.horizontal, 16)
.padding(.vertical, 22)
.themeColor(background: .layer3)
.cornerRadius(12, corners: .allCorners)
.frame(maxWidth: .infinity)
.onTapGesture {
self.helpAction?()
}

return AnyView(view)
}
}
}

#if DEBUG
struct dydxProfileHelpView_Previews_Dark: PreviewProvider {
@StateObject static var themeSettings = ThemeSettings.shared

static var previews: some View {
ThemeSettings.applyDarkTheme()
ThemeSettings.applyStyles()
return dydxProfileHelpViewModel.previewValue
.createView()
.themeColor(background: .layer0)
.environmentObject(themeSettings)
// .edgesIgnoringSafeArea(.bottom)
.previewLayout(.sizeThatFits)
}
}

struct dydxProfileHelpView_Previews_Light: PreviewProvider {
@StateObject static var themeSettings = ThemeSettings.shared

static var previews: some View {
ThemeSettings.applyLightTheme()
ThemeSettings.applyStyles()
return dydxProfileHelpViewModel.previewValue
.createView()
.themeColor(background: .layer0)
.environmentObject(themeSettings)
// .edgesIgnoringSafeArea(.bottom)
.previewLayout(.sizeThatFits)
}
}
#endif
12 changes: 12 additions & 0 deletions dydx/dydxViews/dydxViews/_v4/Profile/dydxProfileView.swift
Original file line number Diff line number Diff line change
Expand Up @@ -21,12 +21,21 @@ public class dydxProfileViewModel: PlatformViewModel {
@Published public var rewards: dydxProfileRewardsViewModel? = dydxProfileRewardsViewModel()
@Published public var share: dydxInlineShareViewModel? = dydxInlineShareViewModel()
@Published public var topButtons: dydxProfileTopButtonsViewModel?
@Published public var help: dydxProfileHelpViewModel?

public init() { }

public static var previewValue: dydxProfileViewModel {
let vm = dydxProfileViewModel()
vm.buttons = .previewValue
vm.header = .previewValue
vm.secondaryButtons = .previewValue
vm.history = .previewValue
vm.balances = .previewValue
vm.rewards = .previewValue
vm.share = .previewValue
vm.topButtons = .previewValue
vm.help = .previewValue
return vm
}

Expand Down Expand Up @@ -60,6 +69,9 @@ public class dydxProfileViewModel: PlatformViewModel {
self.history?
.createView(parentStyle: style)

self.help?
.createView(parentStyle: style)

self.share?
.createView(parentStyle: style)

Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -89,10 +89,9 @@ public class dydxSimpleUIMarketViewModel: PlatformViewModel {
self.createSideSizeValue(style: style)
}
}
.leftAligned()
Spacer()

self.createPriceChange(style: style)
.rightAligned()
}
.lineLimit(1)
.minimumScaleFactor(0.5)
Expand Down

0 comments on commit 071c355

Please sign in to comment.