Skip to content

Commit

Permalink
essentially done
Browse files Browse the repository at this point in the history
  • Loading branch information
kugel3 committed May 4, 2023
1 parent a47eb94 commit 3fcf4d8
Show file tree
Hide file tree
Showing 4 changed files with 66 additions and 48 deletions.
11 changes: 0 additions & 11 deletions Sources/Clients/GatewayAPI/GatewayAPI+Utils.swift
Original file line number Diff line number Diff line change
Expand Up @@ -45,17 +45,6 @@ extension GatewayAPI.StateEntityDetailsResponseItemDetails {
}
return nil
}

public var type: GatewayAPI.StateEntityDetailsResponseItemDetailsType {
switch self {
case .fungibleResource: return .fungibleResource
case .nonFungibleResource: return .nonFungibleResource
case .fungibleVault: return .fungibleVault
case .nonFungibleVault: return .nonFungibleVault
case .package: return .package
case .component: return .component
}
}
}

extension GatewayAPI.EntityMetadataCollection {
Expand Down
32 changes: 22 additions & 10 deletions Sources/Core/DesignSystem/Components/PlainListRow.swift
Original file line number Diff line number Diff line change
Expand Up @@ -8,22 +8,34 @@ public struct PlainListRow<Icon: View>: View {
let icon: Icon
let action: () -> Void

public init(showChevron: Bool = true,
title: String,
action: @escaping () -> Void,
@ViewBuilder icon: () -> Icon)
{
public init(
showChevron: Bool = true,
title: String,
action: @escaping () -> Void,
@ViewBuilder icon: () -> Icon
) {
self.isShowingChevron = showChevron
self.title = title
self.icon = icon()
self.action = action
}

public init(showChevron: Bool = true,
title: String,
asset: ImageAsset,
action: @escaping () -> Void) where Icon == AssetIcon
{
public init(
title: String,
@ViewBuilder icon: () -> Icon
) {
self.isShowingChevron = false
self.title = title
self.icon = icon()
self.action = {}
}

public init(
showChevron: Bool = true,
title: String,
asset: ImageAsset,
action: @escaping () -> Void
) where Icon == AssetIcon {
self.isShowingChevron = showChevron
self.title = title
self.icon = AssetIcon(asset: asset)
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -179,7 +179,7 @@ extension DappDetails.View {
var body: some View {
WithViewStore(store, observe: \.viewState.fungibleTokens, send: { .view($0) }) { viewStore in
ListWithHeading(heading: L10n.DAppDetails.tokens, elements: viewStore.state, title: \.name) { token in
TokenThumbnail(.known(token.thumbnail), size: .small)
TokenThumbnail(.known(token.iconURL), size: .small)
} action: { id in
viewStore.send(.fungibleTokenTapped(id))
}
Expand All @@ -194,7 +194,7 @@ extension DappDetails.View {
var body: some View {
WithViewStore(store, observe: \.viewState.nonFungibleTokens, send: { .view($0) }) { viewStore in
ListWithHeading(heading: L10n.DAppDetails.nfts, elements: viewStore.state, title: \.name) { token in
NFTThumbnail(token.thumbnail, size: .small)
NFTThumbnail(token.iconURL, size: .small)
} action: { id in
viewStore.send(.nonFungibleTokenTapped(id))
}
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -57,6 +57,7 @@ public struct DappDetails: Sendable, FeatureReducer {
// TODO: This should be consolidated with other types that represent resources
public struct ResourceDetails: Identifiable, Hashable, Sendable {
public var id: ResourceAddress { resourceAddress }

public let resourceAddress: ResourceAddress
public let fungibility: Fungibility
public let name: String
Expand All @@ -77,8 +78,8 @@ public struct DappDetails: Sendable, FeatureReducer {
public enum ViewAction: Sendable, Equatable {
case appeared
case openURLTapped(URL)
case fungibleTokenTapped(ComponentAddress)
case nonFungibleTokenTapped(ComponentAddress)
case fungibleTokenTapped(ResourceAddress)
case nonFungibleTokenTapped(ResourceAddress)
case dismissPersonaTapped
case forgetThisDappTapped
case confirmDisconnectAlert(PresentationAction<ConfirmDisconnectAlert>)
Expand Down Expand Up @@ -194,10 +195,12 @@ public struct DappDetails: Sendable, FeatureReducer {
case let .metadataLoaded(metadata):
state.$metadata = metadata

let dappDefinitionAddress = state.dApp.dAppDefinitionAddress
if let claimedEntities = state.metadata?.claimedEntities, !claimedEntities.isEmpty {
return .task {
let result = await TaskResult {
try await tokens(addresses: claimedEntities)
// try await tokens(addresses: claimedEntities, validated: dappDefinitionAddress)
}
return .internal(.tokensLoaded(.init(result: result)))
}
Expand Down Expand Up @@ -228,32 +231,22 @@ public struct DappDetails: Sendable, FeatureReducer {
}

private func tokens(addresses: [String]) async throws -> State.Tokens {
func resourceFungibility(itemDetails: GatewayAPI.StateEntityDetailsResponseItemDetails) -> State.Tokens.ResourceDetails.Fungibility? {
switch itemDetails.type {
case .fungibleResource:
return .fungible
case .nonFungibleResource:
return .nonFungible
case .fungibleVault, .nonFungibleVault, .package, .component:
return nil
}
}
let allResourceItems = try await gatewayAPIClient.fetchResourceDetails(addresses)
.items
.compactMap(\.resourceDetails)

let allResourceItems = try await gatewayAPIClient.fetchResourceDetails(addresses).items

let allResources = allResourceItems.compactMap { item -> State.Tokens.ResourceDetails? in
guard let details = item.details, let fungibility = resourceFungibility(itemDetails: details) else { return nil }
return .init(fungible: allResourceItems.filter { $0.fungibility == .fungible },
nonFungible: allResourceItems.filter { $0.fungibility == .nonFungible })
}

return .init(resourceAddress: .init(address: item.address),
fungibility: fungibility,
name: item.metadata.name ?? L10n.DAppDetails.unknownTokenName,
symbol: item.metadata.symbol,
description: item.metadata.description,
iconURL: item.metadata.iconURL)
}
let grouped = Dictionary(grouping: allResources, by: \.fungibility)
private func tokens(addresses: [String], validated dAppDefinitionAddress: DappDefinitionAddress) async throws -> State.Tokens {
let allResourceItems = try await gatewayAPIClient.fetchResourceDetails(addresses)
.items
.filter { $0.metadata.dappDefinition == dAppDefinitionAddress.address }
.compactMap(\.resourceDetails)

return .init(fungible: grouped[.fungible] ?? [], nonFungible: grouped[.nonFungible] ?? [])
return .init(fungible: allResourceItems.filter { $0.fungibility == .fungible },
nonFungible: allResourceItems.filter { $0.fungibility == .nonFungible })
}

private func update(dAppID: DappDefinitionAddress, dismissPersonaDetails: Bool) -> EffectTask<Action> {
Expand All @@ -279,6 +272,30 @@ public struct DappDetails: Sendable, FeatureReducer {
}
}

extension GatewayAPI.StateEntityDetailsResponseItem {
var resourceDetails: DappDetails.State.Tokens.ResourceDetails? {
guard let fungibility else { return nil }
return .init(resourceAddress: .init(address: address),
fungibility: fungibility,
name: metadata.name ?? L10n.DAppDetails.unknownTokenName,
symbol: metadata.symbol,
description: metadata.description,
iconURL: metadata.iconURL)
}

private var fungibility: DappDetails.State.Tokens.ResourceDetails.Fungibility? {
guard let details else { return nil }
switch details {
case .fungibleResource:
return .fungible
case .nonFungibleResource:
return .nonFungible
case .fungibleVault, .nonFungibleVault, .package, .component:
return nil
}
}
}

extension AlertState<DappDetails.ViewAction.ConfirmDisconnectAlert> {
static var confirmDisconnect: AlertState {
AlertState {
Expand Down

0 comments on commit 3fcf4d8

Please sign in to comment.