diff --git a/Sources/BraveWallet/Crypto/Asset Details/AssetDetailView.swift b/Sources/BraveWallet/Crypto/Asset Details/AssetDetailView.swift index 4b1320a04064..0038f667b63f 100644 --- a/Sources/BraveWallet/Crypto/Asset Details/AssetDetailView.swift +++ b/Sources/BraveWallet/Crypto/Asset Details/AssetDetailView.swift @@ -35,6 +35,7 @@ struct AssetDetailView: View { private var buySendSwapDestination: Binding @Environment(\.openURL) private var openWalletURL + @ObservedObject private var isShowingBalances = Preferences.Wallet.isShowingBalances @ViewBuilder private var accountsBalanceView: some View { Section( @@ -69,13 +70,19 @@ struct AssetDetailView: View { .font(.footnote) .foregroundColor(Color(.secondaryBraveLabel)) } else { - VStack(alignment: .trailing) { - Text(showFiatPlaceholder ? "$0.00" : viewModel.fiatBalance) - .redacted(reason: showFiatPlaceholder ? .placeholder : []) - .shimmer(assetDetailStore.isLoadingPrice) - Text(showBalancePlaceholder ? "0.0000 \(assetDetailStore.assetDetailToken.symbol)" : "\(viewModel.balance) \(assetDetailStore.assetDetailToken.symbol)") - .redacted(reason: showBalancePlaceholder ? .placeholder : []) - .shimmer(assetDetailStore.isLoadingAccountBalances) + Group { + if isShowingBalances.value { + VStack(alignment: .trailing) { + Text(showFiatPlaceholder ? "$0.00" : viewModel.fiatBalance) + .redacted(reason: showFiatPlaceholder ? .placeholder : []) + .shimmer(assetDetailStore.isLoadingPrice) + Text(showBalancePlaceholder ? "0.0000 \(assetDetailStore.assetDetailToken.symbol)" : "\(viewModel.balance) \(assetDetailStore.assetDetailToken.symbol)") + .redacted(reason: showBalancePlaceholder ? .placeholder : []) + .shimmer(assetDetailStore.isLoadingAccountBalances) + } + } else { + Text("****") + } } .font(.footnote) .foregroundColor(Color(.secondaryBraveLabel)) diff --git a/Sources/BraveWallet/Crypto/CryptoPagesView.swift b/Sources/BraveWallet/Crypto/CryptoPagesView.swift index 50fce28d3285..466cd15288a5 100644 --- a/Sources/BraveWallet/Crypto/CryptoPagesView.swift +++ b/Sources/BraveWallet/Crypto/CryptoPagesView.swift @@ -15,11 +15,11 @@ struct CryptoPagesView: View { @ObservedObject var cryptoStore: CryptoStore @ObservedObject var keyringStore: KeyringStore + @State private var isShowingMainMenu: Bool = false @State private var isShowingSettings: Bool = false @State private var isShowingSearch: Bool = false @State private var fetchedPendingRequestsThisSession: Bool = false - - @Environment(\.openURL) private var openWalletURL + @State private var selectedPageIndex: Int = 0 private var isConfirmationButtonVisible: Bool { if case .transactions(let txs) = cryptoStore.pendingRequest { @@ -33,7 +33,10 @@ struct CryptoPagesView: View { keyringStore: keyringStore, cryptoStore: cryptoStore, isShowingPendingRequest: $cryptoStore.isPresentingPendingRequest, - isConfirmationsButtonVisible: isConfirmationButtonVisible + isConfirmationsButtonVisible: isConfirmationButtonVisible, + selectedIndexChanged: { selectedIndex in + selectedPageIndex = selectedIndex + } ) .onAppear { // If a user chooses not to confirm/reject their requests we shouldn't @@ -97,29 +100,21 @@ struct CryptoPagesView: View { .labelStyle(.iconOnly) .foregroundColor(Color(.braveBlurpleTint)) } - Menu { - Button(action: { - keyringStore.lock() - }) { - Label(Strings.Wallet.lock, braveSystemImage: "leo.lock") - .imageScale(.medium) // Menu inside nav bar implicitly gets large - } - Button(action: { isShowingSettings = true }) { - Label(Strings.Wallet.settings, braveSystemImage: "leo.settings") - .imageScale(.medium) // Menu inside nav bar implicitly gets large - } - Divider() - Button(action: { openWalletURL(WalletConstants.braveWalletSupportURL) }) { - Label(Strings.Wallet.helpCenter, braveSystemImage: "leo.info.outline") - } - } label: { - Label(Strings.Wallet.otherWalletActionsAccessibilityTitle, systemImage: "ellipsis.circle") + Button(action: { self.isShowingMainMenu = true }) { + Label(Strings.Wallet.otherWalletActionsAccessibilityTitle, braveSystemImage: "leo.more.horizontal") .labelStyle(.iconOnly) .foregroundColor(Color(.braveBlurpleTint)) } .accessibilityLabel(Strings.Wallet.otherWalletActionsAccessibilityTitle) } } + .sheet(isPresented: $isShowingMainMenu) { + MainMenuView( + isFromPortfolio: selectedPageIndex == 0, + isShowingSettings: $isShowingSettings, + keyringStore: keyringStore + ) + } } private struct _CryptoPagesView: UIViewControllerRepresentable { @@ -127,12 +122,14 @@ struct CryptoPagesView: View { var cryptoStore: CryptoStore var isShowingPendingRequest: Binding var isConfirmationsButtonVisible: Bool + var selectedIndexChanged: (Int) -> Void func makeUIViewController(context: Context) -> CryptoPagesViewController { CryptoPagesViewController( keyringStore: keyringStore, cryptoStore: cryptoStore, - isShowingPendingRequest: isShowingPendingRequest + isShowingPendingRequest: isShowingPendingRequest, + selectedIndexChanged: selectedIndexChanged ) } func updateUIViewController(_ uiViewController: CryptoPagesViewController, context: Context) { @@ -145,18 +142,21 @@ private class CryptoPagesViewController: TabbedPageViewController { private let keyringStore: KeyringStore private let cryptoStore: CryptoStore let pendingRequestsButton = ConfirmationsButton() + let selectedIndexChanged: (Int) -> Void @Binding private var isShowingPendingRequest: Bool init( keyringStore: KeyringStore, cryptoStore: CryptoStore, - isShowingPendingRequest: Binding + isShowingPendingRequest: Binding, + selectedIndexChanged: @escaping (Int) -> Void ) { self.keyringStore = keyringStore self.cryptoStore = cryptoStore self._isShowingPendingRequest = isShowingPendingRequest - super.init(nibName: nil, bundle: nil) + self.selectedIndexChanged = selectedIndexChanged + super.init(selectedIndexChanged: selectedIndexChanged) } @available(*, unavailable) diff --git a/Sources/BraveWallet/Crypto/MainMenuView.swift b/Sources/BraveWallet/Crypto/MainMenuView.swift new file mode 100644 index 000000000000..01c4b6df6517 --- /dev/null +++ b/Sources/BraveWallet/Crypto/MainMenuView.swift @@ -0,0 +1,173 @@ +/* Copyright 2023 The Brave Authors. All rights reserved. + * This Source Code Form is subject to the terms of the Mozilla Public + * License, v. 2.0. If a copy of the MPL was not distributed with this + * file, You can obtain one at http://mozilla.org/MPL/2.0/. */ + +import SwiftUI +import Strings +import Preferences + +struct MainMenuView: View { + + let isFromPortfolio: Bool + @Binding var isShowingSettings: Bool + let keyringStore: KeyringStore + + @ObservedObject private var isShowingBalances = Preferences.Wallet.isShowingBalances + @ObservedObject private var isShowingGraph = Preferences.Wallet.isShowingGraph + @ObservedObject private var isShowingNFTs = Preferences.Wallet.isShowingNFTsTab + + @Environment(\.presentationMode) @Binding private var presentationMode + @Environment(\.openURL) private var openWalletURL + + @ScaledMetric var rowHeight: CGFloat = 52 + @State private var viewHeight: CGFloat = 0 + + var body: some View { + ScrollView { + LazyVStack(spacing: 0) { + Button(action: { + presentationMode.dismiss() + keyringStore.lock() + }) { + MenuRowView( + iconBraveSystemName: "leo.lock", + title: Strings.Wallet.lockWallet + ) + } + .frame(height: rowHeight) + + Button(action: { + isShowingSettings = true + presentationMode.dismiss() + }) { + MenuRowView( + iconBraveSystemName: "leo.settings", + title: Strings.Wallet.walletSettings + ) + } + .frame(height: rowHeight) + + if isFromPortfolio { + Divider() + portfolioSettings + } + + Divider() + Button(action: { + openWalletURL(WalletConstants.braveWalletSupportURL) + }) { + MenuRowView( + iconBraveSystemName: "leo.help.outline", + title: Strings.Wallet.helpCenter, + accessoryContent: { + Image(braveSystemName: "leo.launch") + .imageScale(.large) + .foregroundColor(Color(braveSystemName: .buttonBackground)) + } + ) + } + .frame(height: rowHeight) + } + .padding(.vertical, 8) + .readSize { size in + self.viewHeight = size.height + } + } + .background(Color(braveSystemName: .containerBackground)) + .osAvailabilityModifiers({ view in + if #available(iOS 16, *) { + view + .presentationDetents([ + .height(viewHeight) + ]) + } else { + view + } + }) + } + + @ViewBuilder private var portfolioSettings: some View { + MenuRowView( + iconBraveSystemName: "leo.eye.on", + title: Strings.Wallet.balances, + accessoryContent: { + Toggle(isOn: $isShowingBalances.value) { + EmptyView() + } + .tint(Color(braveSystemName: .buttonBackground)) + } + ) + .frame(height: rowHeight) + + MenuRowView( + iconBraveSystemName: "leo.graph", + title: Strings.Wallet.graph, + accessoryContent: { + Toggle(isOn: $isShowingGraph.value) { + EmptyView() + } + .tint(Color(braveSystemName: .buttonBackground)) + } + ) + .frame(height: rowHeight) + + MenuRowView( + iconBraveSystemName: "leo.nft", + title: Strings.Wallet.nftsTab, + accessoryContent: { + Toggle(isOn: $isShowingNFTs.value) { + EmptyView() + } + .tint(Color(braveSystemName: .buttonBackground)) + } + ) + .frame(height: rowHeight) + } +} + +#if DEBUG +struct MainMenuView_Previews: PreviewProvider { + static var previews: some View { + Color.white + .sheet(isPresented: .constant(true), content: { + MainMenuView( + isFromPortfolio: true, + isShowingSettings: .constant(false), + keyringStore: .previewStoreWithWalletCreated + ) + }) + } +} +#endif + +private struct MenuRowView: View { + + let iconBraveSystemName: String + let title: String + let accessoryContent: () -> AccessoryContent + + init( + iconBraveSystemName: String, + title: String, + accessoryContent: @escaping () -> AccessoryContent = { EmptyView() } + ) { + self.iconBraveSystemName = iconBraveSystemName + self.title = title + self.accessoryContent = accessoryContent + } + + var body: some View { + HStack(spacing: 12) { + Image(braveSystemName: iconBraveSystemName) + .imageScale(.medium) + .foregroundColor(Color(braveSystemName: .iconDefault)) + Text(title) + .foregroundColor(Color(braveSystemName: .textPrimary)) + Spacer() + accessoryContent() + } + .font(.callout.weight(.semibold)) + .padding(.horizontal) + } +} diff --git a/Sources/BraveWallet/Crypto/Portfolio/PortfolioAssetView.swift b/Sources/BraveWallet/Crypto/Portfolio/PortfolioAssetView.swift index 23040d3e8b14..66ccfc577416 100644 --- a/Sources/BraveWallet/Crypto/Portfolio/PortfolioAssetView.swift +++ b/Sources/BraveWallet/Crypto/Portfolio/PortfolioAssetView.swift @@ -4,6 +4,7 @@ * file, You can obtain one at http://mozilla.org/MPL/2.0/. */ import SwiftUI +import Preferences struct PortfolioAssetView: View { var image: AssetIconView @@ -12,6 +13,27 @@ struct PortfolioAssetView: View { let networkName: String var amount: String var quantity: String + let shouldHideBalance: Bool + + @ObservedObject private var isShowingBalances = Preferences.Wallet.isShowingBalances + + init( + image: AssetIconView, + title: String, + symbol: String, + networkName: String, + amount: String, + quantity: String, + shouldHideBalance: Bool = false + ) { + self.image = image + self.title = title + self.symbol = symbol + self.networkName = networkName + self.amount = amount + self.quantity = quantity + self.shouldHideBalance = shouldHideBalance + } var body: some View { AssetView( @@ -20,14 +42,20 @@ struct PortfolioAssetView: View { symbol: symbol, networkName: networkName, accessoryContent: { - VStack(alignment: .trailing) { - Text(amount.isEmpty ? "0.0" : amount) - .fontWeight(.semibold) - Text(verbatim: "\(quantity) \(symbol)") + Group { + if shouldHideBalance && !isShowingBalances.value { + Text("****") + } else { + VStack(alignment: .trailing) { + Text(amount.isEmpty ? "0.0" : amount) + .fontWeight(.semibold) + Text(verbatim: "\(quantity) \(symbol)") + } + .multilineTextAlignment(.trailing) + } } .font(.footnote) .foregroundColor(Color(.braveLabel)) - .multilineTextAlignment(.trailing) } ) .accessibilityLabel("\(title), \(quantity) \(symbol), \(amount)") @@ -97,7 +125,7 @@ struct AssetView: View { let title: String let symbol: String let networkName: String - let accessoryContent: () -> AccessoryContent + @ViewBuilder var accessoryContent: () -> AccessoryContent var body: some View { HStack { diff --git a/Sources/BraveWallet/Crypto/Portfolio/PortfolioAssetsView.swift b/Sources/BraveWallet/Crypto/Portfolio/PortfolioAssetsView.swift index b423c9529e38..ef7489294259 100644 --- a/Sources/BraveWallet/Crypto/Portfolio/PortfolioAssetsView.swift +++ b/Sources/BraveWallet/Crypto/Portfolio/PortfolioAssetsView.swift @@ -6,6 +6,7 @@ import SwiftUI import DesignSystem import BraveCore +import Preferences struct PortfolioAssetsView: View { @@ -18,6 +19,7 @@ struct PortfolioAssetsView: View { @State private var isPresentingFiltersDisplaySettings: Bool = false @State private var selectedToken: BraveWallet.BlockchainToken? @State private var groupToggleState: [AssetGroupViewModel.ID: Bool] = [:] + @ObservedObject private var isShowingBalances = Preferences.Wallet.isShowingBalances var body: some View { LazyVStack(spacing: 16) { @@ -153,7 +155,8 @@ struct PortfolioAssetsView: View { symbol: asset.token.symbol, networkName: asset.network.chainName, amount: asset.fiatAmount(currencyFormatter: portfolioStore.currencyFormatter), - quantity: asset.quantity + quantity: asset.quantity, + shouldHideBalance: true ) } } @@ -184,7 +187,8 @@ struct PortfolioAssetsView: View { symbol: asset.token.symbol, networkName: asset.network.chainName, amount: asset.fiatAmount(currencyFormatter: portfolioStore.currencyFormatter), - quantity: asset.quantity + quantity: asset.quantity, + shouldHideBalance: true ) } } @@ -224,7 +228,7 @@ struct PortfolioAssetsView: View { } .multilineTextAlignment(.leading) Spacer() - Text(portfolioStore.currencyFormatter.string(from: NSNumber(value: group.totalFiatValue)) ?? "") + Text(isShowingBalances.value ? portfolioStore.currencyFormatter.string(from: NSNumber(value: group.totalFiatValue)) ?? "" : "****") .font(.callout.weight(.semibold)) .foregroundColor(Color(WalletV2Design.textPrimary)) .multilineTextAlignment(.trailing) diff --git a/Sources/BraveWallet/Crypto/Portfolio/PortfolioHeaderView.swift b/Sources/BraveWallet/Crypto/Portfolio/PortfolioHeaderView.swift index d08ff8de8a70..385e42352192 100644 --- a/Sources/BraveWallet/Crypto/Portfolio/PortfolioHeaderView.swift +++ b/Sources/BraveWallet/Crypto/Portfolio/PortfolioHeaderView.swift @@ -6,6 +6,7 @@ import SwiftUI import DesignSystem import BraveCore +import Preferences struct PortfolioHeaderView: View { @@ -20,6 +21,8 @@ struct PortfolioHeaderView: View { @State private var isPresentingBackup = false @State private var dismissedBackupBannerThisSession = false @State private var selectedBalance: BalanceTimePrice? + @ObservedObject private var isShowingGraph = Preferences.Wallet.isShowingGraph + @ObservedObject private var isShowingBalances = Preferences.Wallet.isShowingBalances private var isShowingBackupBanner: Bool { !keyringStore.defaultKeyring.isBackedUp && !dismissedBackupBannerThisSession @@ -46,7 +49,9 @@ struct PortfolioHeaderView: View { Spacer().frame(height: 24) - lineChart + if isShowingGraph.value { + lineChart + } } .padding() .frame(maxWidth: .infinity) @@ -79,13 +84,13 @@ struct PortfolioHeaderView: View { private var balanceAndPriceChanges: some View { VStack(spacing: 12) { - Text(balance) + Text(isShowingBalances.value ? balance : "****") .frame(maxWidth: .infinity) .opacity(selectedBalance == nil ? 1 : 0) .overlay( Group { if let dataPoint = selectedBalance { - Text(dataPoint.formattedPrice) + Text(isShowingBalances.value ? dataPoint.formattedPrice : "****") } } ) @@ -94,10 +99,10 @@ struct PortfolioHeaderView: View { if let balanceDifference { HStack { - Text(balanceDifference.priceDifference) + Text(isShowingBalances.value ? balanceDifference.priceDifference : "****") .font(.footnote) .foregroundColor(Color(braveSystemName: balanceDifference.isBalanceUp ? .systemfeedbackSuccessText : .systemfeedbackErrorText)) - Text(balanceDifference.percentageChange) + Text(isShowingBalances.value ? balanceDifference.percentageChange : "****") .font(.footnote) .padding(4) .foregroundColor(Color(braveSystemName: balanceDifference.isBalanceUp ? .green50 : .red50)) diff --git a/Sources/BraveWallet/Crypto/Portfolio/PortfolioView.swift b/Sources/BraveWallet/Crypto/Portfolio/PortfolioView.swift index 1e3470a64eb5..5d6172597b25 100644 --- a/Sources/BraveWallet/Crypto/Portfolio/PortfolioView.swift +++ b/Sources/BraveWallet/Crypto/Portfolio/PortfolioView.swift @@ -25,6 +25,7 @@ struct PortfolioView: View { private var buySendSwapDestination: Binding @State private var selectedContent: PortfolioSegmentedControl.SelectedContent = .assets + @ObservedObject private var isShowingNFTsTab = Preferences.Wallet.isShowingNFTsTab var body: some View { ScrollView { @@ -51,11 +52,13 @@ struct PortfolioView: View { private var contentDrawer: some View { LazyVStack { - PortfolioSegmentedControl(selected: $selectedContent) - .padding(.horizontal) - .padding(.bottom, 6) + if isShowingNFTsTab.value { + PortfolioSegmentedControl(selected: $selectedContent) + .padding(.horizontal) + .padding(.bottom, 6) + } Group { - if selectedContent == .assets { + if selectedContent == .assets || !isShowingNFTsTab.value { PortfolioAssetsView( cryptoStore: cryptoStore, keyringStore: keyringStore, diff --git a/Sources/BraveWallet/Crypto/Stores/TabbedPageViewController.swift b/Sources/BraveWallet/Crypto/Stores/TabbedPageViewController.swift index dcd4d461d9e1..b10b5887d37a 100644 --- a/Sources/BraveWallet/Crypto/Stores/TabbedPageViewController.swift +++ b/Sources/BraveWallet/Crypto/Stores/TabbedPageViewController.swift @@ -68,7 +68,21 @@ class TabbedPageViewController: UIViewController { ) private var contentOffsetObservation: NSKeyValueObservation? - + + private let selectedIndexChanged: ((Int) -> Void)? + + public init( + selectedIndexChanged: ((Int) -> Void)? + ) { + self.selectedIndexChanged = selectedIndexChanged + super.init(nibName: nil, bundle: nil) + } + + @available(*, unavailable) + required init?(coder: NSCoder) { + fatalError("init(coder:) has not been implemented") + } + override func viewDidLoad() { super.viewDidLoad() @@ -219,6 +233,7 @@ class TabbedPageViewController: UIViewController { self.updateTabsBarSelectionIndicator(pageIndex: indexPath.item) }.startAnimation() pageViewController.setViewControllers([vc], direction: direction, animated: true) + selectedIndexChanged?(indexPath.item) } } @@ -282,6 +297,7 @@ extension TabbedPageViewController: UIPageViewControllerDelegate { } self.pageTransitionContext = nil if let currentIndex = currentIndex { + selectedIndexChanged?(currentIndex) // Update the selected tab for accessibility purposes and also in case UIPageViewController // ever changes how its `UIScrollView` is managed this will continue to show the user what the // selected tab is even if it doesn't interpolate while scrolling diff --git a/Sources/BraveWallet/WalletHostingViewController.swift b/Sources/BraveWallet/WalletHostingViewController.swift index 768bc8cd6f23..83a3ed298d66 100644 --- a/Sources/BraveWallet/WalletHostingViewController.swift +++ b/Sources/BraveWallet/WalletHostingViewController.swift @@ -88,14 +88,18 @@ public class WalletHostingViewController: UIHostingController { if !isLocked { onUnlock?() } - // SwiftUI has a bug where nested sheets do not dismiss correctly if the root View holding onto - // the sheet is removed from the view hierarchy. The root's sheet stays visible even though the - // root doesn't exist anymore. + // Prior to iOS 16.4, SwiftUI has a bug where nested sheets do not dismiss correctly if the + // root View holding onto the sheet is removed from the view hierarchy. The root's sheet + // stays visible even though the root doesn't exist anymore. // // As a workaround to this issue, we can just watch keyring's `isLocked` value from here // and dismiss the first sheet ourselves to ensure we dont get stuck with a child view visible // while the wallet is locked. - if let self = self, isLocked, self.presentedViewController != nil { + if #unavailable(iOS 16.4), + let self = self, + isLocked, + let presentedViewController = self.presentedViewController, + !presentedViewController.isBeingDismissed { self.dismiss(animated: true) } } diff --git a/Sources/BraveWallet/WalletPreferences.swift b/Sources/BraveWallet/WalletPreferences.swift index 22676b8358db..6b759144a7b1 100644 --- a/Sources/BraveWallet/WalletPreferences.swift +++ b/Sources/BraveWallet/WalletPreferences.swift @@ -47,6 +47,11 @@ extension Preferences { /// The option for users to turn off aurora popup public static let showAuroraPopup = Option(key: "wallet.show-aurora-popup", default: true) + // MARK: Portfolio settings + public static let isShowingGraph = Option(key: "wallet.isShowingGraph", default: true) + public static let isShowingBalances = Option(key: "wallet.isShowingBalances", default: true) + public static let isShowingNFTsTab = Option(key: "wallet.isShowingNFTsTab", default: true) + // MARK: Portfolio & NFT filters public static let groupByFilter = Option(key: "wallet.groupByFilter", default: GroupBy.none.rawValue) public static let sortOrderFilter = Option(key: "wallet.sortOrderFilter", default: SortOrder.valueDesc.rawValue) diff --git a/Sources/BraveWallet/WalletStrings.swift b/Sources/BraveWallet/WalletStrings.swift index 6c460d8a54ef..0e3716c7897d 100644 --- a/Sources/BraveWallet/WalletStrings.swift +++ b/Sources/BraveWallet/WalletStrings.swift @@ -1850,6 +1850,13 @@ extension Strings { value: "Lock", comment: "The title of the lock option inside the menu when user clicks the three dots button beside assets search button." ) + public static let lockWallet = NSLocalizedString( + "wallet.lockWallet", + tableName: "BraveWallet", + bundle: .module, + value: "Lock Wallet", + comment: "The title of the lock option inside the menu when user clicks the three dots button beside assets search button." + ) public static let settings = NSLocalizedString( "wallet.settings", tableName: "BraveWallet", @@ -1857,6 +1864,34 @@ extension Strings { value: "Settings", comment: "The title of the settings option inside the menu when user clicks the three dots button beside assets search button." ) + public static let walletSettings = NSLocalizedString( + "wallet.walletSettings", + tableName: "BraveWallet", + bundle: .module, + value: "Wallet Settings", + comment: "The title of the settings option inside the menu when user clicks the three dots button beside assets search button." + ) + public static let balances = NSLocalizedString( + "wallet.balances", + tableName: "BraveWallet", + bundle: .module, + value: "Balances", + comment: "The title of the settings option inside the menu when user clicks the three dots button beside assets search button with Portfolio tab open." + ) + public static let graph = NSLocalizedString( + "wallet.graph", + tableName: "BraveWallet", + bundle: .module, + value: "Graph", + comment: "The title of the settings option inside the menu when user clicks the three dots button beside assets search button with Portfolio tab open." + ) + public static let nftsTab = NSLocalizedString( + "wallet.nftsTab", + tableName: "BraveWallet", + bundle: .module, + value: "NFTs Tab", + comment: "The title of the settings option inside the menu when user clicks the three dots button beside assets search button with Portfolio tab open." + ) public static let helpCenter = NSLocalizedString( "wallet.helpCenter", tableName: "BraveWallet", diff --git a/Sources/DesignSystem/Icons/Symbols.xcassets/leo.graph.symbolset/Contents.json b/Sources/DesignSystem/Icons/Symbols.xcassets/leo.graph.symbolset/Contents.json new file mode 100644 index 000000000000..2f415ce6e4c0 --- /dev/null +++ b/Sources/DesignSystem/Icons/Symbols.xcassets/leo.graph.symbolset/Contents.json @@ -0,0 +1,11 @@ +{ + "info" : { + "author" : "xcode", + "version" : 1 + }, + "symbols" : [ + { + "idiom" : "universal" + } + ] +} diff --git a/Sources/DesignSystem/Icons/Symbols.xcassets/leo.help.outline.symbolset/Contents.json b/Sources/DesignSystem/Icons/Symbols.xcassets/leo.help.outline.symbolset/Contents.json new file mode 100644 index 000000000000..2f415ce6e4c0 --- /dev/null +++ b/Sources/DesignSystem/Icons/Symbols.xcassets/leo.help.outline.symbolset/Contents.json @@ -0,0 +1,11 @@ +{ + "info" : { + "author" : "xcode", + "version" : 1 + }, + "symbols" : [ + { + "idiom" : "universal" + } + ] +} diff --git a/Sources/DesignSystem/Icons/Symbols.xcassets/leo.launch.symbolset/Contents.json b/Sources/DesignSystem/Icons/Symbols.xcassets/leo.launch.symbolset/Contents.json new file mode 100644 index 000000000000..2f415ce6e4c0 --- /dev/null +++ b/Sources/DesignSystem/Icons/Symbols.xcassets/leo.launch.symbolset/Contents.json @@ -0,0 +1,11 @@ +{ + "info" : { + "author" : "xcode", + "version" : 1 + }, + "symbols" : [ + { + "idiom" : "universal" + } + ] +} diff --git a/Sources/DesignSystem/Icons/Symbols.xcassets/leo.nft.symbolset/Contents.json b/Sources/DesignSystem/Icons/Symbols.xcassets/leo.nft.symbolset/Contents.json new file mode 100644 index 000000000000..2f415ce6e4c0 --- /dev/null +++ b/Sources/DesignSystem/Icons/Symbols.xcassets/leo.nft.symbolset/Contents.json @@ -0,0 +1,11 @@ +{ + "info" : { + "author" : "xcode", + "version" : 1 + }, + "symbols" : [ + { + "idiom" : "universal" + } + ] +}