Skip to content

Commit

Permalink
ABW 1018 Transaction Review Follow Ups (#422)
Browse files Browse the repository at this point in the history
  • Loading branch information
kugel3 committed Mar 31, 2023
1 parent da4c6ec commit 9f2449f
Show file tree
Hide file tree
Showing 30 changed files with 467 additions and 591 deletions.
1 change: 0 additions & 1 deletion Package.swift
Original file line number Diff line number Diff line change
Expand Up @@ -53,7 +53,6 @@ package.addModules([
"MainFeature",
"OnboardingFeature",
"SplashFeature",
"TransactionReviewFeature",
],
tests: .yes()
),
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -19,8 +19,8 @@ extension EngineToolkitClient: TestDependencyKey {
accountAddressesNeedingToSignTransaction: { _ in [] },
accountAddressesSuitableToPayTransactionFee: { _ in [] },
knownEntityAddresses: { _ in throw NoopError() },
generateTransactionReview: unimplemented("\(Self.self).generateTransactionReview"),
decodeAddress: unimplemented("\(Self.self).decodeAddress")
generateTransactionReview: { _ in throw NoopError() },
decodeAddress: { _ in throw NoopError() }
)

public static let testValue = Self(
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -43,3 +43,95 @@ extension GatewayAPIClient {

public typealias TransactionPreview = @Sendable (GatewayAPI.TransactionPreviewRequest) async throws -> GatewayAPI.TransactionPreviewResponse
}

extension GatewayAPIClient {
public func getDappDefinition(_ address: String) async throws -> GatewayAPI.EntityMetadataCollection {
let entityMetadata = try await getEntityMetadata(address)

guard let dappDefinitionAddress = entityMetadata.dappDefinition else {
throw GatewayAPI.EntityMetadataCollection.MetadataError.missingDappDefinition
}

let dappDefinition = try await getEntityMetadata(dappDefinitionAddress)

guard dappDefinition.accountType == .dappDefinition else {
throw GatewayAPI.EntityMetadataCollection.MetadataError.accountTypeNotDappDefinition
}

guard let claimedEntities = dappDefinition.claimedEntities else {
throw GatewayAPI.EntityMetadataCollection.MetadataError.missingClaimedEntities
}

guard claimedEntities.contains(address) else {
throw GatewayAPI.EntityMetadataCollection.MetadataError.entityNotClaimed
}

return dappDefinition
}
}

extension GatewayAPI.EntityMetadataCollection {
public var description: String? {
self["description"]?.asString
}

public var symbol: String? {
self["symbol"]?.asString
}

public var name: String? {
self["name"]?.asString
}

public var domain: String? {
self["domain"]?.asString
}

public var url: String? {
self["url"]?.asString
}

public var dappDefinition: String? {
self["dapp_definition"]?.asString
}

public var claimedEntities: [String]? {
self["claimed_entities"]?.asStringCollection
}

public var claimedWebsites: [String]? {
self["claimed_websites"]?.asStringCollection
}

public var accountType: AccountType? {
self["account_type"]?.asString.flatMap(AccountType.init)
}

public subscript(key: String) -> GatewayAPI.EntityMetadataItemValue? {
items.first { $0.key == key }?.value
}

public enum AccountType: String {
case dappDefinition = "dapp definition"
}

public enum MetadataError: Error, CustomStringConvertible {
case missingDappDefinition
case accountTypeNotDappDefinition
case missingClaimedEntities
case entityNotClaimed

public var description: String {
switch self {
case .missingDappDefinition:
return "The entity has no dApp definition address"
case .accountTypeNotDappDefinition:
return "The account is not of the type `dapp definition`"
case .missingClaimedEntities:
return "The dapp definition has no claimed_entities key"
case .entityNotClaimed:
return "The entity is not claimed by the dapp definition"
}
}
}
}
4 changes: 2 additions & 2 deletions Sources/Core/DesignSystem/Components/Card.swift
Original file line number Diff line number Diff line change
Expand Up @@ -84,8 +84,8 @@ extension View {
// MARK: - SpeechbubbleShape
public struct SpeechbubbleShape: Shape {
let cornerRadius: CGFloat
public static let triangleSize: CGSize = .init(width: 20, height: 10) // TODO:  constant
public static let triangleInset: CGFloat = 50 // TODO:  constant
public static let triangleSize: CGSize = .init(width: 20, height: 10)
public static let triangleInset: CGFloat = 50

public init(cornerRadius: CGFloat) {
self.cornerRadius = cornerRadius
Expand Down
4 changes: 4 additions & 0 deletions Sources/Core/DesignSystem/Fonts.swift
Original file line number Diff line number Diff line change
Expand Up @@ -63,6 +63,10 @@ extension SwiftUI.Font.App {
public var button: SwiftUI.Font {
.custom(FontFamily.IBMPlexSans.bold, size: 16)
}

public var monospace: SwiftUI.Font {
.system(size: 13, design: .monospaced)
}
}

/// UIFont/NSFont depending on platform.
Expand Down
2 changes: 1 addition & 1 deletion Sources/Core/DesignSystem/Grid.swift
Original file line number Diff line number Diff line change
Expand Up @@ -46,7 +46,7 @@ extension CGFloat {
public static let standardButtonHeight: Self = 50

/// 32
public static let toolbatButtonHeight: Self = 32
public static let toolbarButtonHeight: Self = 32

/// 250
public static let standardButtonWidth: Self = 250
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -16,7 +16,7 @@ public struct SecondaryRectangularButtonStyle: ButtonStyle {
}
.foregroundColor(foregroundColor)
.font(.app.body1Header)
.frame(height: isInToolbar ? .toolbatButtonHeight : .standardButtonHeight)
.frame(height: isInToolbar ? .toolbarButtonHeight : .standardButtonHeight)
.frame(maxWidth: shouldExpand ? .infinity : nil)
.padding(.horizontal, isInToolbar ? .small1 : .medium1)
.background(.app.gray4)
Expand Down
180 changes: 34 additions & 146 deletions Sources/Core/DesignSystem/ViewModifiers/TextStyleModifier.swift
Original file line number Diff line number Diff line change
Expand Up @@ -15,159 +15,47 @@ public enum TextStyle {
case body2Regular
case body2Link
case button
}

extension View {
@ViewBuilder public func textStyle(_ style: TextStyle) -> some View {
switch style {
case .sheetTitle:
modifier(TextStyle.SheetTitle())
case .sectionHeader:
modifier(TextStyle.SectionHeader())
case .secondaryHeader:
modifier(TextStyle.SecondaryHeader())
case .body1Header:
modifier(TextStyle.Body1Header())
case .body1HighImportance:
modifier(TextStyle.Body1HighImportance())
case .body1Regular:
modifier(TextStyle.Body1Regular())
case .body1StandaloneLink:
modifier(TextStyle.Body1StandaloneLink())
case .body1Link:
modifier(TextStyle.Body1Link())
case .body2Header:
modifier(TextStyle.Body2Header())
case .body2HighImportance:
modifier(TextStyle.Body2HighImportance())
case .body2Regular:
modifier(TextStyle.Body2Regular())
case .body2Link:
modifier(TextStyle.Body2Link())
case .button:
modifier(TextStyle.Button())
}
}
case monospace
}

extension TextStyle {
fileprivate struct SheetTitle: ViewModifier {
func body(content: Content) -> some View {
content
.font(.app.sheetTitle)
.lineSpacing(.lineSpacing(.𝟛𝟞))
}
}

fileprivate struct SectionHeader: ViewModifier {
func body(content: Content) -> some View {
content
.font(.app.sectionHeader)
.lineSpacing(.lineSpacing(.𝟚𝟛))
}
}

fileprivate struct SecondaryHeader: ViewModifier {
func body(content: Content) -> some View {
content
.font(.app.secondaryHeader)
.lineSpacing(.lineSpacing(.𝟚𝟛))
}
}

fileprivate struct Body1Header: ViewModifier {
func body(content: Content) -> some View {
content
.font(.app.body1Header)
.lineSpacing(.lineSpacing(.𝟚𝟛))
}
}

fileprivate struct Body1HighImportance: ViewModifier {
func body(content: Content) -> some View {
content
.font(.app.body1HighImportance)
.lineSpacing(.lineSpacing(.𝟚𝟛))
}
}

fileprivate struct Body1Regular: ViewModifier {
func body(content: Content) -> some View {
content
.font(.app.body1Regular)
.lineSpacing(.lineSpacing(.𝟚𝟛))
}
}

fileprivate struct Body1StandaloneLink: ViewModifier {
func body(content: Content) -> some View {
content
.font(.app.body1StandaloneLink)
.lineSpacing(.lineSpacing(.𝟚𝟛))
}
}

fileprivate struct Body1Link: ViewModifier {
func body(content: Content) -> some View {
content
.font(.app.body1Link)
.lineSpacing(.lineSpacing(.𝟚𝟛))
}
}

fileprivate struct Body2Header: ViewModifier {
func body(content: Content) -> some View {
content
.font(.app.body2Header)
.lineSpacing(.lineSpacing(.𝟙𝟠))
}
}

fileprivate struct Body2HighImportance: ViewModifier {
func body(content: Content) -> some View {
content
.font(.app.body2HighImportance)
.lineSpacing(.lineSpacing(.𝟙𝟠))
}
}

fileprivate struct Body2Regular: ViewModifier {
func body(content: Content) -> some View {
content
.font(.app.body2Regular)
.lineSpacing(.lineSpacing(.𝟙𝟠))
}
}

fileprivate struct Body2Link: ViewModifier {
func body(content: Content) -> some View {
content
.font(.app.body2Link)
.lineSpacing(.lineSpacing(.𝟙𝟠))
}
}

fileprivate struct Button: ViewModifier {
func body(content: Content) -> some View {
content
.font(.app.button)
.lineSpacing(.lineSpacing(.𝟙𝟠))
var font: Font {
switch self {
case .sheetTitle: return .app.sheetTitle
case .sectionHeader: return .app.sectionHeader
case .secondaryHeader: return .app.secondaryHeader
case .body1Header: return .app.body1Header
case .body1HighImportance: return .app.body1HighImportance
case .body1Regular: return .app.body1Regular
case .body1StandaloneLink: return .app.body1StandaloneLink
case .body1Link: return .app.body1Link
case .body2Header: return .app.body2Header
case .body2HighImportance: return .app.body2HighImportance
case .body2Regular: return .app.body2Regular
case .body2Link: return .app.body2Link
case .button: return .app.button
case .monospace: return .app.monospace
}
}

var lineSpacing: CGFloat {
switch self {
case .sheetTitle:
return 36 / 4
case .sectionHeader, .secondaryHeader, .body1Header,
.body1HighImportance, .body1Regular, .body1StandaloneLink, .body1Link:
return 23 / 4
case .body2Header, .body2HighImportance, .body2Regular,
.body2Link, .button, .monospace:
return 18 / 4
}
}
}

extension CGFloat {
fileprivate static func lineSpacing(_ value: LineSpacing) -> CGFloat {
value.rawValue / 4
}
}

// MARK: - CGFloat.LineSpacing
extension CGFloat {
fileprivate enum LineSpacing: CGFloat {
case 𝟛𝟞 = 36
case 𝟚𝟛 = 23
case 𝟙𝟠 = 18
extension View {
public func textStyle(_ style: TextStyle) -> some View {
font(style.font)
.lineSpacing(style.lineSpacing)
}
}

Expand Down
6 changes: 4 additions & 2 deletions Sources/Core/Resources/Generated/L10n.generated.swift
Original file line number Diff line number Diff line change
Expand Up @@ -776,7 +776,7 @@ public enum L10n {
/// Customize Guarantees
public static let customizeGuaranteesButtonTitle = L10n.tr("Localizable", "transactionReview.customizeGuaranteesButtonTitle", fallback: "Customize Guarantees")
/// Depositing
public static let depositingHeading = L10n.tr("Localizable", "transactionReview.depositingHeading", fallback: "Depositing")
public static let depositsHeading = L10n.tr("Localizable", "transactionReview.depositsHeading", fallback: "Depositing")
/// Estimated
public static let estimated = L10n.tr("Localizable", "transactionReview.estimated", fallback: "Estimated")
/// Account
Expand All @@ -793,10 +793,12 @@ public enum L10n {
public static let sendingToHeading = L10n.tr("Localizable", "transactionReview.sendingToHeading", fallback: "Sending to")
/// Review Transaction
public static let title = L10n.tr("Localizable", "transactionReview.title", fallback: "Review Transaction")
/// Unknown
public static let unknown = L10n.tr("Localizable", "transactionReview.unknown", fallback: "Unknown")
/// Using dApps
public static let usingDappsHeading = L10n.tr("Localizable", "transactionReview.usingDappsHeading", fallback: "Using dApps")
/// Withdrawing
public static let withdrawingHeading = L10n.tr("Localizable", "transactionReview.withdrawingHeading", fallback: "Withdrawing")
public static let withdrawalsHeading = L10n.tr("Localizable", "transactionReview.withdrawalsHeading", fallback: "Withdrawing")
public enum Guarantees {
/// Apply
public static let applyButtonText = L10n.tr("Localizable", "transactionReview.guarantees.applyButtonText", fallback: "Apply")
Expand Down
5 changes: 3 additions & 2 deletions Sources/Core/Resources/Resources/en.lproj/Localizable.strings
Original file line number Diff line number Diff line change
Expand Up @@ -151,10 +151,11 @@

"transactionReview.title" = "Review Transaction";

"transactionReview.unknown" = "Unknown";
"transactionReview.messageHeading" = "Message";
"transactionReview.usingDappsHeading" = "Using dApps";
"transactionReview.withdrawingHeading" = "Withdrawing";
"transactionReview.depositingHeading" = "Depositing";
"transactionReview.withdrawalsHeading" = "Withdrawing";
"transactionReview.depositsHeading" = "Depositing";
"transactionReview.sendingToHeading" = "Sending to";
"transactionReview.presentingHeading" = "Presenting";
"transactionReview.customizeGuaranteesButtonTitle" = "Customize Guarantees";
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -10,7 +10,7 @@ public struct RemoveMetadata: InstructionProtocol {

// MARK: Stored properties

public let entityAddress: Address_ // TODO:  What should this actually be?
public let entityAddress: Address_
public let key: String

// MARK: Init
Expand Down
Loading

0 comments on commit 9f2449f

Please sign in to comment.