From de8e99247663f25a811871346f21c8933b0cf619 Mon Sep 17 00:00:00 2001 From: Juan Patricio Marroquin Date: Mon, 20 Nov 2023 18:06:39 -0500 Subject: [PATCH 01/61] feat: move old collections page to MyCollections folder --- .../Pages/Collections/MyCollections/Index.tsx | 217 ++++++++++++++++++ 1 file changed, 217 insertions(+) create mode 100644 resources/js/Pages/Collections/MyCollections/Index.tsx diff --git a/resources/js/Pages/Collections/MyCollections/Index.tsx b/resources/js/Pages/Collections/MyCollections/Index.tsx new file mode 100644 index 000000000..a53680777 --- /dev/null +++ b/resources/js/Pages/Collections/MyCollections/Index.tsx @@ -0,0 +1,217 @@ +import { type PageProps } from "@inertiajs/core"; +import { Head, router, usePage } from "@inertiajs/react"; +import { useEffect, useState } from "react"; +import { useTranslation } from "react-i18next"; +import { CollectionsGrid } from "@/Components/Collections/CollectionsGrid"; +import { CollectionsTable } from "@/Components/Collections/CollectionsTable"; +import { EmptyBlock } from "@/Components/EmptyBlock/EmptyBlock"; +import { useToasts } from "@/Hooks/useToasts"; +import { DefaultLayout } from "@/Layouts/DefaultLayout"; +import { CollectionDisplayType, CollectionsFilter } from "@/Pages/Collections/Components/CollectionsFilter"; +import { CollectionsHeading } from "@/Pages/Collections/Components/CollectionsHeading"; +import { useCollections } from "@/Pages/Collections/Hooks"; +import { getQueryParameters } from "@/Utils/get-query-parameters"; +import { isTruthy } from "@/Utils/is-truthy"; +import { replaceUrlQuery } from "@/Utils/replace-url-query"; + +const sort = ({ + sortBy, + direction, + selectedChainIds, +}: { + sortBy: string; + direction?: string; + selectedChainIds?: number[]; +}): void => { + router.get( + route("collections"), + { + ...getQueryParameters(), + sort: sortBy, + direction, + chain: isTruthy(selectedChainIds) && selectedChainIds.length > 0 ? selectedChainIds.join(",") : undefined, + }, + { + preserveState: false, + }, + ); +}; + +const CollectionsIndex = ({ + auth, + initialStats, + title, + sortBy = "received", + sortDirection, + selectedChainIds: initialSelectedChainIds, +}: { + title: string; + auth: PageProps["auth"]; + initialStats: App.Data.Collections.CollectionStatsData; + sortBy: string | null; + sortDirection: "asc" | "desc"; + selectedChainIds?: string[]; +}): JSX.Element => { + const { props } = usePage(); + + const { t } = useTranslation(); + const queryParameters = getQueryParameters(); + + const [displayType, setDisplayType] = useState( + queryParameters.view === "grid" ? CollectionDisplayType.Grid : CollectionDisplayType.List, + ); + + const { showToast } = useToasts(); + + const showHidden = queryParameters.showHidden === "true"; + + const { + collections, + isLoading, + loadMore, + reload, + hiddenCollectionAddresses, + alreadyReportedByCollection, + reportByCollectionAvailableIn, + availableNetworks, + query, + stats, + search, + isSearching, + reportCollection, + selectedChainIds, + setSelectedChainIds, + } = useCollections({ + showHidden, + sortBy, + view: displayType, + initialStats, + onSearchError: () => { + showToast({ + message: t("pages.collections.search.error"), + type: "error", + }); + }, + initialSelectedChainIds, + }); + + const selectDisplayTypeHandler = (displayType: CollectionDisplayType): void => { + setDisplayType(displayType); + + replaceUrlQuery({ + view: displayType, + }); + }; + + const handleSelectedChainIds = (chainId: number): void => { + const chainIds = selectedChainIds.includes(chainId) + ? selectedChainIds.filter((id) => id !== chainId) + : [...selectedChainIds, chainId]; + + setSelectedChainIds(chainIds); + }; + + useEffect(() => { + if (!auth.authenticated) { + return; + } + + reload({ selectedChainIds }); + }, [selectedChainIds, auth.authenticated, auth.wallet?.address]); + + return ( + + +
+
+ + + { + reload({ showHidden: isHidden, selectedChainIds, page: 1 }); + }} + availableNetworks={availableNetworks} + handleSelectedChainIds={handleSelectedChainIds} + selectedChainIds={selectedChainIds} + collectionsCount={collections.length} + /> +
+ +
+ {!isLoading && collections.length === 0 && ( +
+ {isSearching ? ( + {t("pages.collections.search.loading_results")} + ) : ( + <> + {query !== "" ? ( + {t("pages.collections.search.no_results")} + ) : ( + <> + {hiddenCollectionAddresses.length === 0 ? ( + {t("pages.collections.no_collections")} + ) : ( + {t("pages.collections.all_collections_hidden")} + )} + + )} + + )} +
+ )} + + {displayType === CollectionDisplayType.List && ( + { + reload({ page: 1 }); + }} + onReportCollection={reportCollection} + selectedChainIds={selectedChainIds} + /> + )} + + {displayType === CollectionDisplayType.Grid && ( + + )} +
+
+
+ ); +}; + +export default CollectionsIndex; From d29ae714437960ec8047f35d1cd91ef15f178deb Mon Sep 17 00:00:00 2001 From: Juan Patricio Marroquin Date: Mon, 20 Nov 2023 18:06:53 -0500 Subject: [PATCH 02/61] feat: MyCollectionsController --- .../Controllers/MyCollectionsController.php | 129 ++++++++++++++++++ 1 file changed, 129 insertions(+) create mode 100644 app/Http/Controllers/MyCollectionsController.php diff --git a/app/Http/Controllers/MyCollectionsController.php b/app/Http/Controllers/MyCollectionsController.php new file mode 100644 index 000000000..f5e9f538d --- /dev/null +++ b/app/Http/Controllers/MyCollectionsController.php @@ -0,0 +1,129 @@ +user(); + + if ($user === null) { + return Inertia::render('Collections/MyCollections/Index', [ + 'title' => trans('metatags.my-collections.title'), + 'stats' => new CollectionStatsData( + nfts: 0, + collections: 0, + value: 0, + ), + 'sortBy' => null, + 'sortDirection' => 'desc', + 'showHidden' => false, + 'view' => 'list', + ]); + } + + $hiddenCollections = $user->hiddenCollections->pluck('address'); + $showHidden = $request->get('showHidden') === 'true'; + + $selectedChainIds = array_filter(explode(',', $request->get('chain', ''))); + $selectedChainIds = array_filter($selectedChainIds, fn ($id) => is_numeric($id)); + + if ($showHidden && $hiddenCollections->isEmpty()) { + return redirect()->route('collections', $request->except('showHidden')); + } + + $cache = new UserCache($user); + + $sortBy = in_array($request->query('sort'), ['oldest', 'received', 'name', 'floor-price', 'value', 'chain']) ? $request->query('sort') : null; + $defaultSortDirection = $sortBy === null ? 'desc' : 'asc'; + + $sortDirection = in_array($request->query('direction'), ['asc', 'desc']) ? $request->query('direction') : $defaultSortDirection; + $networks = NetworkWithCollectionsData::fromModel($user, $showHidden); + + $selectedChainIds = array_filter($selectedChainIds, function ($id) use ($networks) { + return $networks->firstWhere('chainId', $id)?->collectionsCount > 0; + }); + + if ($request->wantsJson()) { + $searchQuery = $request->get('query'); + + /** @var LengthAwarePaginator $collections */ + $collections = $user->collections() + ->when($showHidden, fn ($q) => $q->whereIn('collections.id', $user->hiddenCollections->modelKeys())) + ->when(! $showHidden, fn ($q) => $q->whereNotIn('collections.id', $user->hiddenCollections->modelKeys())) + ->when(count($selectedChainIds) > 0, fn ($q) => $q->whereIn('collections.network_id', Network::whereIn('chain_id', $selectedChainIds)->pluck('id'))) + ->when($sortBy === 'name', fn ($q) => $q->orderByName($sortDirection)) + ->when($sortBy === 'floor-price', fn ($q) => $q->orderByFloorPrice($sortDirection, $user->currency())) + ->when($sortBy === 'value', fn ($q) => $q->orderByValue($user->wallet, $sortDirection, $user->currency())) + ->when($sortBy === 'chain', fn ($q) => $q->orderByChainId($sortDirection)) + ->when($sortBy === 'oldest', fn ($q) => $q->orderByMintDate('asc')) + ->when($sortBy === 'received' || $sortBy === null, fn ($q) => $q->orderByReceivedDate($user->wallet, 'desc')) + ->search($user, $searchQuery) + ->with([ + 'reports', + 'network', + 'floorPriceToken', + 'nfts' => fn ($q) => $q->where('wallet_id', $user->wallet_id)->limit(4), + ]) + ->withCount(['nfts' => fn ($q) => $q->where('wallet_id', $user->wallet_id)]) + ->paginate(25); + + $reportByCollectionAvailableIn = $collections->mapWithKeys(function ($collection) use ($request) { + return [$collection->address => RateLimiterHelpers::collectionReportAvailableInHumanReadable($request, $collection)]; + }); + + $alreadyReportedByCollection = $collections->mapWithKeys(function ($collection) use ($user) { + return [$collection->address => $collection->wasReportedByUserRecently($user, useRelationship: true)]; + }); + + return new JsonResponse([ + 'collections' => CollectionData::collection( + $collections->through(fn ($collection) => CollectionData::fromModel($collection, $user->currency())) + ), + 'reportByCollectionAvailableIn' => $reportByCollectionAvailableIn, + 'alreadyReportedByCollection' => $alreadyReportedByCollection, + 'hiddenCollectionAddresses' => $hiddenCollections, + 'availableNetworks' => $networks, + 'selectedChainIds' => $selectedChainIds, + 'stats' => new CollectionStatsData( + nfts: $showHidden ? $cache->hiddenNftsCount() : $cache->shownNftsCount(), + collections: $showHidden ? $cache->hiddenCollectionsCount() : $cache->shownCollectionsCount(), + value: $user->collectionsValue($user->currency(), readFromDatabase: false, onlyHidden: $showHidden), + ), + ]); + } + + return Inertia::render('Collections/MyCollections/Index', [ + 'title' => trans('metatags.my-collections.title'), + 'initialStats' => new CollectionStatsData( + nfts: $showHidden ? $cache->hiddenNftsCount() : $cache->shownNftsCount(), + collections: $showHidden ? $cache->hiddenCollectionsCount() : $cache->shownCollectionsCount(), + value: $user->collectionsValue($user->currency(), readFromDatabase: false, onlyHidden: $showHidden), + ), + 'sortBy' => $sortBy, + 'sortDirection' => $sortDirection, + 'showHidden' => $showHidden, + 'selectedChainIds' => $selectedChainIds, + 'view' => $request->get('view') === 'grid' ? 'grid' : 'list', + 'availableNetworks' => $networks, + ]); + } +} From 62702fe94de47ba7e80945fb0c7a11c6ca073260 Mon Sep 17 00:00:00 2001 From: Juan Patricio Marroquin Date: Mon, 20 Nov 2023 18:07:19 -0500 Subject: [PATCH 03/61] feat: update titles for metatags --- lang/en/metatags.php | 4 ++++ resources/js/I18n/Locales/en.json | 2 +- 2 files changed, 5 insertions(+), 1 deletion(-) diff --git a/lang/en/metatags.php b/lang/en/metatags.php index 2b5cbed7d..b6e7ee6dc 100644 --- a/lang/en/metatags.php +++ b/lang/en/metatags.php @@ -63,6 +63,10 @@ ], ], + 'my-collections' => [ + 'title' => 'My Collections | Dashbrd', + ], + 'nfts' => [ 'view' => [ 'title' => ':nft NFT | Dashbrd', diff --git a/resources/js/I18n/Locales/en.json b/resources/js/I18n/Locales/en.json index 5ad9e2114..f57add3ff 100644 --- a/resources/js/I18n/Locales/en.json +++ b/resources/js/I18n/Locales/en.json @@ -1 +1 @@ -{"auth.welcome":"Welcome to Dashbrd","auth.logged_in":"You're logged in!","auth.log_out":"Log out","auth.failed":"These credentials do not match our records.","auth.session_timeout":"Your session has timed out. Please refresh the page and try connecting your account again.","auth.session_timeout_modal":"Seems like your session has timed out. Please connnect your wallet again.","auth.password":"The provided password is incorrect.","auth.throttle":"Too many login attempts. Please try again in {{seconds}} seconds.","auth.wallet.connecting":"Connecting …","auth.wallet.waiting_for_signature":"Waiting for Signature …","auth.wallet.switching_wallet":"Switching Wallet …","auth.wallet.connect":"Connect Wallet","auth.wallet.connect_long":"Connect Your Wallet to Get Started","auth.wallet.sign_subtitle":"Connect Your Wallet to Continue","auth.wallet.disconnect":"Disconnect Wallet","auth.wallet.install":"Install MetaMask","auth.wallet.install_long":"Install MetaMask to Get Started","auth.wallet.sign":"Sign Message","auth.wallet.sign_message":"Welcome to Dashbrd. In order to login, sign this message with your wallet. It doesn't cost you anything!\n\nSigning ID (you can ignore this): {{nonce}}","auth.wallet.connect_subtitle":"Click on the MetaMask icon in your browser to confirm the action and connect your wallet.","auth.wallet.requires_signature":"In order to prevent impersonation, we require a signature to perform this action. This signature is only a signed message and does not give any access to your wallet.","auth.errors.metamask.no_account":"No account found. Please connect your wallet and try again.","auth.errors.metamask.generic":"Connection attempt error. Please retry and follow the steps to connect your wallet.","auth.errors.metamask.invalid_network":"Please switch to Polygon or Ethereum Mainnet in your MetaMask plugin to connect to Dashbrd.","auth.errors.metamask.provider_missing":"You don't have MetaMask installed in your browser. Please install and try again.","auth.errors.metamask.user_rejected":"It looks like you cancelled signing of the authentication message. Please try again.","auth.errors.metamask.provider_not_set":"Ethereum provider is not set","auth.validation.wallet_login_failed":"There was a problem trying to verify your signature. Please try again.","auth.validation.invalid_address":"Your wallet address is invalid. Please try again.","auth.validation.invalid_signature":"Signature is invalid. Please try again.","auth.validation.invalid_network":"Please switch to Polygon or Ethereum Mainnet in your MetaMask plugin to connect to Dashbrd.","common.author":"Author","common.add":"Add","common.amount":"Amount","common.balance":"Balance","common.cancel":"Cancel","common.delete":"Delete","common.edit":"Edit","common.confirm":"Confirm","common.connect":"Connect","common.continue":"Continue","common.done":"Done","common.filter":"Filter","common.items":"Items","common.receive":"Receive","common.received":"Received","common.retry":"Retry","common.records":"Records","common.save":"Save","common.send":"Send","common.sent":"Sent","common.show":"Show","common.searching":"Searching...","common.other":"Other","common.owned":"Owned","common.token":"Token","common.tokens":"Tokens","common.wallet":"Wallet","common.pending":"Pending","common.publish":"Publish","common.published":"Published","common.empty":"Empty","common.your_address":"Your Address","common.warning":"Warning","common.my_address":"My Address","common.my_wallet":"My Wallet","common.my_balance":"My Balance","common.na":"N/A","common.simple_plural_without_data":"One comment|Many comments","common.simple_plural_with_data":"{{count}} comment|{{count}} comments","common.advanced_plural_without_data":"{0} no comments yet|{1} 1 comment|[2,*] Many comments","common.advanced_plural_with_data":"{0} no comments yet|{1} 1 comment|[2,*] {{count}} comments","common.copy_clipboard":"Copy to Clipboard","common.copy":"Copy","common.download":"Download","common.zoom":"Zoom","common.my_collection":"My Collection","common.max":"Max","common.chain":"Chain","common.copied":"Copied!","common.coming_soon":"Coming Soon","common.more_details":"More Details","common.close":"Close","common.close_toast":"Close toast","common.loading":"Loading","common.price":"Price","common.articles":"Articles","common.most_popular":"Most Popular","common.market_cap":"Market Cap","common.volume":"Volume {{frequency}}","common.value":"Value","common.last_n_days":"Last {{count}} Days","common.details":"Details","common.view_all":"View All","common.view_more_on_polygonscan":"View More on Polygonscan","common.view_more_on_etherscan":"View More on Etherscan","common.view_nft_on_etherscan":"View NFT on Etherscan","common.view_nft_on_polygonscan":"View NFT on Polygonscan","common.view_nft_on_goerli_tesnet":"View NFT on Goerli Testnet Explorer","common.view_nft_on_mumbai_tesnet":"View NFT on Mumbai Testnet Explorer","common.polygonscan":"Polygonscan","common.etherscan":"Etherscan","common.featured":"Featured","common.floor_price":"Floor Price","common.floor":"Floor","common.supply":"Supply","common.owners":"Owners","common.created":"Created","common.nft":"NFT","common.collection":"Collection","common.collections":"Collections","common.gallery":"Gallery","common.basic_gallery":"Basic Gallery","common.gallery_name":"Gallery Name","common.create_gallery":"Create Gallery","common.external_link":"External Link","common.follow_link":"Follow Link","common.cover":"Cover","common.template":"Template","common.page":"Page","common.polygon":"Polygon","common.ethereum":"Ethereum","common.mumbai":"Mumbai","common.goerli":"Goerli","common.of":"of","common.pagination_input_placeholder":"Enter the page number","common.pagination_input_placeholder_mobile":"Page number","common.nft_count":"{0} {{count}} NFTs|{1} {{count}} NFT|[2,*] {{count}} NFTs","common.nft_gallery":"NFT Gallery","common.unable_to_retrieve_image":"Unable to retrieve your NFT image at this time","common.optional":"Optional","common.selected":"Selected","common.select":"Select","common.preview":"Preview","common.image_size_error":"Image size must not exceed 2MB","common.image_dimensions_error":"Image dimensions must exceed 287px x 190px","common.write_to_confirm":"Write {{word}} to confirm","common.n_hours":"{0} {{count}} hour|{1} {{count}} hour|[2,*] {{count}} hours","common.n_minutes":"{0} {{count}} minute|{1} {{count}} minute|[2,*] {{count}} minutes","common.report":"Report","common.n_nfts":"{0}NFTs|{1}NFT|[2,*]NFTs","common.n_collections":"{0}collections|{1}collection|[2,*]collections","common.back":"Back","common.back_to":"Back to","common.name":"Name","common.type":"Type","common.from":"From","common.to":"To","common.sale_price":"Sale Price","common.recent_activity":"Recent Activity","common.time":"Time","common.datetime.few_seconds_ago":"A few seconds ago","common.datetime.minutes_ago":"{0} Less than a minute ago|{1} A minute ago|[2,*] {{count}} minutes ago","common.datetime.hours_ago":"{0} Less than an hour ago|{1} An hour ago|[2,*] {{count}} hours ago","common.datetime.days_ago":"{0} Less than a day ago|{1} A day ago|[2,*] {{count}} days ago","common.datetime.weeks_ago":"{0} Less than a week ago|{1} A week ago|[2,*] {{count}} weeks ago","common.datetime.months_ago":"{0} Less than a month ago|{1} A month ago|[2,*] {{count}} months ago","common.datetime.years_ago":"{0} Less than a year ago|{1} A year ago|[2,*] {{count}} years ago","common.no_traits_found":"No traits found.","common.empty_transactions":"You don't have any transactions yet. Once transactions have been made, they will show up here.","common.error":"Error","common.refresh":"Refresh","common.refresh_metadata":"Refresh Metadata","common.refreshing_metadata":"Refreshing Metadata... Please check back later.","common.refreshing_activity":"Refreshing Activity... Please check back later.","common.pending_confirmation":"Pending Confirmation","common.confirmed_transaction":"Confirmed Transaction","common.transaction_error":"Transaction Error","common.transaction_error_description_first_part":"Your transaction encountered an error. View this transaction on","common.transaction_error_description_second_part":"for more details.","common.home":"Home","common.contact":"Contact","common.menu":"Menu","common.website":"Website","common.twitter":"Twitter","common.discord":"Discord","common.facebook":"Facebook","common.reddit":"Reddit","common.x":"X","common.sort":"Sort","common.drafts":"Drafts","common.draft":"Draft","common.delete_draft":"Delete Draft","common.share_on":"Share on {{platform}}","footer.copyright":"{{year}} © Dashbrd. All rights reserved.","footer.all_rights_reserved":"All rights reserved","footer.privacy_policy":"Privacy Policy","footer.terms_of_service":"Terms of Service","footer.powered_by":"Powered by","format.fiat":"{{ value, currency }}","format.number":"{{ value, number }}","metatags.home.title":"Dashbrd | Web3 Portfolio Management Made Simple","metatags.home.description":"Simplify your Web3 journey with Dashbrd. Manage your portfolio of tokens, NFTs, and other digital collectibles across the Ethereum and Polygon blockchains.","metatags.home.image":"/images/meta/home.png","metatags.error.title":"Error {{code}} | Dashbrd","metatags.wallet.title":"My Wallet | Dashbrd","metatags.galleries.title":"Top NFT Galleries | Dashbrd","metatags.galleries.image":"/images/meta/nft-galleries.png","metatags.galleries.description":"Explore user published NFT galleries to find custom curated PFPs, Digital Collectibles, & More.","metatags.galleries.most_popular.title":"Most Popular Galleries | Dashbrd","metatags.galleries.most_popular.image":"/images/meta/most-popular-nft-galleries.png","metatags.galleries.most_popular.description":"Explore and discover Most Popular NFT Galleries created by our users featuring custom curated PFPs, Digital Collectibles, & More.","metatags.galleries.newest.title":"Newest Galleries | Dashbrd","metatags.galleries.newest.image":"/images/meta/newest-nft-galleries.png","metatags.galleries.newest.description":"Explore and discover most recent NFT galleries created by our users featuring custom curated PFPs, Digital Collectibles, & More","metatags.galleries.most_valuable.title":"Most Valuable Galleries | Dashbrd","metatags.galleries.most_valuable.image":"/images/meta/most-valuable-nft-galleries.png","metatags.galleries.most_valuable.description":"Explore and discover Most Valuable NFT Galleries created by our users featuring custom curated PFPs, Digital Collectibles, & More.","metatags.galleries.view.title":"{{name}} | Dashbrd","metatags.galleries.view.description":"{{name}} | A Curated NFT Gallery at Dashbrd","metatags.galleries.view.image":"/images/meta/nft-gallery.png","metatags.my_galleries.title":"My Galleries | Dashbrd","metatags.my_galleries.title_draft":"My Draft Galleries | Dashbrd","metatags.my_galleries.create.title":"Create Gallery | Dashbrd","metatags.my_galleries.edit.title":"Edit {{name}} | Dashbrd","metatags.collections.title":"Collections | Dashbrd","metatags.collections.view.title":"{{name}} Collection | Dashbrd","metatags.collections.view.description":"Immerse yourself in the intricate details of {{name}} collection, featuring remarkable digital assets. Start your NFT journey today!","metatags.collections.view.image":"/images/meta/nft-collection.png","metatags.nfts.view.title":"{{nft}} NFT | Dashbrd","metatags.nfts.view.description":"Uncover the complete story of {{nft}} NFT from the {{collection}} collection, delving into its unique attributes and distinctive features.","metatags.nfts.view.image":"/images/meta/nft-details.png","metatags.settings.title":"Settings | Dashbrd","metatags.articles.title":"Articles | Dashbrd","metatags.articles.view.title":"{{title}} | Dashbrd","metatags.login.title":"Login | Dashbrd","metatags.privacy_policy.title":"Privacy Policy | Dashbrd","metatags.privacy_policy.description":"Dashbrd’s privacy policy outlines the information we collect and explains your choices surrounding how we use information about you.","metatags.terms_of_service.title":"Terms of Service | Dashbrd","metatags.terms_of_service.description":"These Terms of Service cover your use and access to services, products or websites of Dashbrd.","metatags.cookie_policy.title":"Cookie Policy | Dashbrd","metatags.cookie_policy.description":"Dashbrd uses cookies to make the website more user-friendly. Find out about the main types of cookies we use, and what we use them for.","metatags.welcome.title":"Welcome to Dashbrd | Web3 Simplified","pages.onboarding.title":"Get Started","pages.onboarding.heading":"Your monkeys were bored and ran off, we are trying to round them up.","pages.onboarding.message":"We are setting up your account. This process usually takes just a few minutes, but can take up to 15 minutes.","pages.error.heading":"Oops, something went wrong ...","pages.error.message":"Please try again or get in touch if the issue persists.","pages.maintenance.title":"Dashbrd is currently down for scheduled maintenance.","pages.maintenance.description":"We expect to be back soon. Thanks for your patience.","pages.dashboard.title":"My Wallet","pages.dashboard.breakdown.title":"Portfolio Breakdown","pages.dashboard.line_chart.data_error":"Could not load chart data","pages.articles.title":"Articles","pages.articles.featured_collections":"Featured Collections","pages.articles.placeholder_more_soon":"More Soon","pages.articles.no_articles":"No articles have been published yet. Please check back later!","pages.articles.header_title":"Explore our collection of","pages.articles.header_suffix_one":"published article","pages.articles.header_suffix_other":"published articles","pages.articles.audio_version":"Audio version","pages.articles.consists_of_collections":"{0} This article highlights {{count}} collections|{1} This article highlights {{count}} collection|[2,*] This article highlights {{count}} collections","pages.collections.title":"Collections","pages.collections.collections":"Collections","pages.collections.collection_value":"Collection Value","pages.collections.nfts_owned":"NFTs Owned","pages.collections.header_title":"You own <0>{{nftsCount}} {{nfts}} across <0>{{collectionsCount}} {{collections}}, worth about <0><1>{{worth}}","pages.collections.search_placeholder":"Search by Collection","pages.collections.properties":"Properties","pages.collections.collections_network":"Collections Network","pages.collections.property_search_placeholder":"Feature Search","pages.collections.floor_price":"Floor Price","pages.collections.value":"Value","pages.collections.rarity":"Rarity","pages.collections.report":"Report","pages.collections.hide_collection":"Hide Collection","pages.collections.unhide_collection":"Unhide Collection","pages.collections.no_collections":"You do not own any NFTs yet. Once you do they will be shown here.","pages.collections.all_collections_hidden":"You have hidden all your collections. Unhide and they will appear here.","pages.collections.about_collection":"About Collection","pages.collections.show_hidden":"Show Hidden","pages.collections.show_my_collection":"Show My Collection","pages.collections.owned":"Owned","pages.collections.activities.loading_activities":"We're fetching Activity for this NFT, please hang tight, this can take a while.","pages.collections.activities.loading_activities_collection":"We're fetching Activity for this collection, please hang tight, this can take a while.","pages.collections.activities.ignores_activities":"We don't support activity history for this collection yet.","pages.collections.activities.no_activity":"This collection does not have any activity yet.","pages.collections.activities.types.LABEL_MINT":"Mint","pages.collections.activities.types.LABEL_TRANSFER":"Transfer","pages.collections.activities.types.LABEL_SALE":"Sale","pages.collections.articles.no_articles":"No articles have been linked to this collection as of now.","pages.collections.articles.no_articles_with_filters":"We could not find any articles matching your search criteria, please try again!","pages.collections.articles.search_placeholder":"Search in Articles","pages.collections.articles.sort_latest":"Latest","pages.collections.articles.sort_popularity":"Most Popular","pages.collections.search.loading_results":"Loading results...","pages.collections.search.no_results":"We could not find anything matching your search criteria, please try again!","pages.collections.search.no_results_with_filters":"We could not find anything matching your filters, please try again!","pages.collections.search.no_results_ownership":"You do not own any NFTs in this collection","pages.collections.search.error":"Could not load search results. Please try again later.","pages.collections.sorting.token_number":"Token Number","pages.collections.sorting.recently_received":"Recently Received","pages.collections.sorting.recently_created":"Recently Created","pages.collections.sorting.oldest_collection":"Oldest Collection","pages.collections.traits.description":"List of NFT traits by % of occurrence in the collection","pages.collections.traits.no_traits":"No Properties can be found for this NFT","pages.collections.menu.collection":"Collection","pages.collections.menu.articles":"Articles","pages.collections.menu.activity":"Activity","pages.collections.hidden_modal.collection_hidden":"Collection Hidden","pages.collections.hidden_modal.description":"This collection is currently set to Hidden. Are you sure you want to unhide this collection? You can\n reset the collection to hidden from the collection menu.","pages.collections.hidden_modal.unhide":"Unhide","pages.collections.hidden_modal.error":"Something went wrong. Please try again.","pages.collections.external_modal.you_wish_continue":"You are about to leave Dashbrd to an external website. Dashbrd has no control over the content of\n this site. Are you sure you wish to continue?","pages.collections.external_modal.not_show":"Do not show this message again.","pages.collections.refresh.title":"Refresh your collection","pages.collections.refresh.notice":"You can refresh data every 15 minutes.","pages.collections.refresh.notice_wait":"Please wait. You can refresh data every 15 minutes.","pages.collections.refresh.toast":"We're updating information for your collection.","pages.nfts.nft":"nft","pages.nfts.about_nft":"About NFT","pages.nfts.owned_by":"Owned by","pages.nfts.collection_image":"collection image","pages.nfts.menu.properties":"Properties","pages.nfts.menu.activity":"Activity","pages.reports.title":"Submit a Report","pages.reports.description":"Thanks for looking out by reporting things that break the rules. Let us know what's happening and we'll receive the report.","pages.reports.success":"Thank you for your report. We'll review it and see if it breaks our ToS.","pages.reports.failed":"Something went wrong. Please try again.","pages.reports.throttle":"You have made too many requests. Please wait {{time}} before reporting again.","pages.reports.reported":"You have already reported this {{model}}.","pages.reports.reasons.spam":"Spam","pages.reports.reasons.violence":"Promoting Violence","pages.reports.reasons.hate":"Hate","pages.reports.reasons.inappropriate_content":"Inappropriate Content","pages.reports.reasons.impersonation":"Impersonation","pages.reports.reasons.trademark":"Trademark or Copyright","pages.reports.reasons.selfharm":"Self-Harm","pages.reports.reasons.harassment":"Harassment","pages.galleries.title":"Galleries","pages.galleries.empty_title":"No galleries have been published yet. Once they do they will appear here.","pages.galleries.search.loading_results":"Loading results...","pages.galleries.search.no_results":"We could not find anything matching your search criteria, please try again!","pages.galleries.search.placeholder":"Search by name or curator address","pages.galleries.search.placeholder_nfts":"Search by NFTs","pages.galleries.search.error":"Could not load search results. Please try again later.","pages.galleries.my_galleries.title":"My Galleries","pages.galleries.my_galleries.subtitle":"Manage your galleries","pages.galleries.my_galleries.new_gallery":"New Gallery","pages.galleries.my_galleries.no_galleries":"You have not created any galleries yet. To create a gallery, click on the \"Create Gallery\" button.","pages.galleries.my_galleries.no_draft_galleries":"You have no draft galleries yet. To create a gallery, click on the \"Create Gallery\" button.","pages.galleries.my_galleries.succesfully_deleted":"Gallery has been successfully removed","pages.galleries.my_galleries.draft_succesfully_deleted":"Draft has been successfully removed","pages.galleries.my_galleries.successfully_created":"Gallery has been successfully created","pages.galleries.my_galleries.successfully_updated":"Gallery has been successfully updated","pages.galleries.my_galleries.new_gallery_no_nfts":"Creating a Gallery requires you to own an NFT.","pages.galleries.my_galleries.delete_modal.title":"Delete Draft","pages.galleries.my_galleries.delete_modal.text":"Are you sure you want to delete the draft? Everything you've done will be deleted and you won't be able to get it back.","pages.galleries.my_galleries.nfts_no_longer_owned":"NFTs no longer owned by this wallet have been removed from the draft”","pages.galleries.copy_gallery_link":"Copy Gallery Link","pages.galleries.my_nfts":"My NFTs","pages.galleries.value":"Value","pages.galleries.floor_price":"Floor Price","pages.galleries.nfts":"NFTs","pages.galleries.collections":"Collections","pages.galleries.galleries_count_simple":"{0} galleries|{1} gallery|[2,*] galleries","pages.galleries.galleries_count":"{0} {{count}} Galleries|{1} {{count}} Gallery|[2,*] {{count}} Galleries","pages.galleries.collections_count_simple":"{0} collections|{1} collection|[2,*] collections","pages.galleries.collections_count":"{0} {{count}} Collections|{1} {{count}} Collection|[2,*] {{count}} Collections","pages.galleries.nfts_count_simple":"{0} NFTs|{1} NFT|[2,*] NFTs","pages.galleries.nfts_count":"{0} {{count}} NFTs|{1} {{count}} NFT|[2,*] {{count}} NFTs","pages.galleries.users_count_simple":"{0} users|{1} user|[2,*] users","pages.galleries.users_count":"{0} {{count}} Users|{1} {{count}} User|[2,*] {{count}} Users","pages.galleries.featuring":"Featuring","pages.galleries.curated_by":"Curated by","pages.galleries.worth_about":"Worth About","pages.galleries.valued_at":"valued at","pages.galleries.from":"From","pages.galleries.most_popular_galleries":"Most Popular Galleries","pages.galleries.newest_galleries":"Newest Galleries","pages.galleries.most_valuable_galleries":"Most Valuable Galleries","pages.galleries.most_popular":"Most Popular","pages.galleries.newest":"Newest","pages.galleries.most_valuable":"Most Valuable","pages.galleries.create.search_by_nfts":"Search by NFTs","pages.galleries.create.input_placeholder":"Enter gallery name","pages.galleries.create.title_too_long":"Gallery name must not exceed {{max}} characters.","pages.galleries.create.already_selected_nft":"NFT already exists in this gallery","pages.galleries.create.nft_missing_image":"Only NFTs with images can be added to galleries","pages.galleries.create.nft_gallery_limit":"You can only add 16 NFTs per gallery","pages.galleries.create.gallery_cover":"Gallery Cover","pages.galleries.create.gallery_cover_description":"The cover is used for the card on the gallery list page. While the cover is not a requirement it will allow you to add personality and stand out from the crowd.","pages.galleries.create.gallery_cover_information":"Image dimensions must be at least 287px x 190px, with a max size of 2 MB (JPG, PNG or GIF)","pages.galleries.create.no_results":"We could not find anything matching your search criteria, please try again!","pages.galleries.create.templates.cover":"Cover","pages.galleries.create.templates.template":"Template","pages.galleries.create.templates.select":"Select Gallery Template","pages.galleries.create.templates.basic":"Basic Gallery","pages.galleries.create.templates.coming_soon":"More Coming Soon","pages.galleries.create.load_more_collections_one":"Load {{count}} More Collection","pages.galleries.create.load_more_collections_other":"Load {{count}} More Collections","pages.galleries.create.load_more_nfts":"Load More NFTs","pages.galleries.create.can_purchase":"You can purchase NFTs with these top NFT Marketplaces:","pages.galleries.create.must_own_one_nft":"You must own at least one (1) NFT in order to create a gallery.","pages.galleries.create.back_to_galleries":"Back to Galleries","pages.galleries.create.draft_saved":"Draft Saved","pages.galleries.create.saving_to_draft":"Saving to draft","pages.galleries.create.drafts_limit_modal_title":"Draft Gallery Limit","pages.galleries.create.drafts_limit_modal_message":"You’ve hit your limit for draft galleries. While you can still make new galleries and publish them, they won’t be saved as drafts. To Free up space, you can either delete existing drafts or publish them.","pages.galleries.create.drafts_limit_modal_cancel":"Go to Drafts","pages.galleries.delete_modal.title":"Delete Gallery","pages.galleries.delete_modal.confirmation_text":"Are you sure you want to delete the gallery? Deleting a Gallery is permanent, all associated views and likes will be lost.","pages.galleries.consists_of_collections":"{0} This gallery consists of {{count}} collections|{1} This gallery consists of {{count}} collection|[2,*] This gallery consists of {{count}} collections","pages.galleries.guest_banner.title":"Craft the ultimate","pages.galleries.guest_banner.subtitle":"Pick your favorites, curate your gallery, & share it with the world.","pages.profile.title":"Profile","pages.token_panel.balance_tooltip":"Total percentage of the portfolio held in this token","pages.token_panel.insufficient_funds":"Insufficient Balance","pages.token_panel.error":"Dashbrd has failed to load token information. Please try again later.","pages.token_panel.failed_to_retrieve_transactions":"We were unable to fetch your transactions.","pages.token_panel.tabs.transaction_history":"Transaction History","pages.token_panel.tabs.history":"History","pages.token_panel.tabs.market_data":"Market Data","pages.token_panel.details.current_price":"Current Price","pages.token_panel.details.title":"Token Details","pages.token_panel.details.market_cap":"Market Cap","pages.token_panel.details.volume":"Daily Volume","pages.token_panel.details.supply":"Minted Supply","pages.token_panel.details.ath":"All-Time High","pages.token_panel.details.atl":"All-Time Low","pages.token_panel.chart.failed":"Dashbrd has failed to load chart information. Please try again later.","pages.transaction_details_panel.title":"Transaction Details","pages.transaction_details_panel.details.blockchain":"Blockchain","pages.transaction_details_panel.details.timestamp":"Timestamp","pages.transaction_details_panel.details.transaction_hash":"Transaction Hash","pages.transaction_details_panel.details.transaction_fee":"Transaction Fee","pages.transaction_details_panel.details.gas_price":"Gas Price","pages.transaction_details_panel.details.gas_used":"Gas Used","pages.transaction_details_panel.details.nonce":"Nonce","pages.send_receive_panel.send.labels.token_and_amount":"Token and Amount","pages.send_receive_panel.send.labels.destination_address":"Destination Address","pages.send_receive_panel.send.labels.projected_fee":"Projected Fee","pages.send_receive_panel.send.placeholders.enter_amount":"Enter Amount","pages.send_receive_panel.send.placeholders.insert_recipient_address":"Insert Recipient Address","pages.send_receive_panel.send.placeholders.projected_fee":"Projected Fee","pages.send_receive_panel.send.errors.amount":"Insufficient Funds: You do not have enough to cover the amount + fee.","pages.send_receive_panel.send.errors.destination":"Destination address is not correct. Check and input again.","pages.send_receive_panel.send.hints.token_price":"Token Price","pages.send_receive_panel.send.fees.Fast":"Fast","pages.send_receive_panel.send.fees.Avg":"Avg","pages.send_receive_panel.send.fees.Slow":"Slow","pages.send_receive_panel.send.search_dropdown.placeholder":"Search token","pages.send_receive_panel.send.search_dropdown.no_results":"No Results","pages.send_receive_panel.send.search_dropdown.error":"Error occurred while searching tokens.","pages.send_receive_panel.send.transaction_time":"Transaction Time: ~{{ time }} minutes","pages.send_receive_panel.send.from":"From","pages.send_receive_panel.send.to":"To","pages.send_receive_panel.send.amount":"Amount","pages.send_receive_panel.send.fee":"Fee","pages.send_receive_panel.send.total_amount":"Total Amount","pages.send_receive_panel.send.waiting_message":"Review and verify the information on your MetaMask. Sign to send the transaction.","pages.send_receive_panel.send.waiting_spinner_text":"Waiting for confirmation...","pages.send_receive_panel.send.failed_message":"It looks like something went wrong while sending your transaction. Press 'Retry' to make another attempt.","pages.send_receive_panel.receive.alert":"Send only Polygon or Ethereum Network compatible tokens to this address or you could permanently lose your funds!","pages.settings.title":"Settings","pages.settings.sidebar.general":"General","pages.settings.sidebar.notifications":"Notifications","pages.settings.sidebar.session_history":"Sessions History","pages.settings.general.title":"Settings","pages.settings.general.subtitle":"Customize your App Experience","pages.settings.general.currency":"Currency","pages.settings.general.currency_subtitle":"Select your default currency which will be used throughout the app.","pages.settings.general.time_date":"Time & Date","pages.settings.general.time_date_subtitle":"Select how you want time and date be shown inside app.","pages.settings.general.date_format":"Date Format","pages.settings.general.time_format":"Time Format","pages.settings.general.timezone":"Timezone","pages.settings.general.set_defaults":"Set Defaults","pages.settings.general.set_defaults_content":"Reverting to the default settings will remove any customizations previously made. Are you sure?","pages.settings.general.save":"Save Settings","pages.settings.general.saved":"Your settings have been successfully saved","pages.wallet.title":"Wallet","pages.privacy_policy.title":"Privacy Policy","pages.terms_of_service.title":"Terms of Service","pagination.previous":"« Previous","pagination.next":"Next »","passwords.reset":"Your password has been reset!","passwords.sent":"We have emailed your password reset link!","passwords.throttled":"Please wait before retrying.","passwords.token":"This password reset token is invalid.","passwords.user":"We can't find a user with that email address.","urls.landing":"https://dashbrd.com","urls.cookie_policy":"https://dashbrd.com/cookie-policy","urls.privacy_policy":"https://dashbrd.com/privacy-policy","urls.terms_of_service":"https://dashbrd.com/terms-of-service","urls.twitter":"https://x.com/DashbrdApp","urls.discord":"https://discord.gg/MJyWKkCJ5k","urls.github":"https://github.com/ArdentHQ/dashbrd","urls.coingecko":"https://www.coingecko.com","urls.etherscan":"https://etherscan.io","urls.polygonscan":"https://polygonscan.com","urls.alchemy":"https://www.alchemy.com","urls.moralis":"https://moralis.io","urls.mnemonic":"https://www.mnemonichq.com","urls.opensea":"https://opensea.io/","urls.explorers.etherscan.token_transactions":"https://etherscan.io/token/{{token}}?a={{address}}","urls.explorers.etherscan.addresses":"https://etherscan.io/address/{{address}}","urls.explorers.etherscan.transactions":"https://etherscan.io/tx/{{id}}","urls.explorers.etherscan.nft":"https://etherscan.io/nft/{{address}}/{{nftId}}","urls.explorers.polygonscan.token_transactions":"https://polygonscan.com/token/{{token}}?a={{address}}","urls.explorers.polygonscan.addresses":"https://polygonscan.com/address/{{address}}","urls.explorers.polygonscan.transactions":"https://polygonscan.com/tx/{{id}}","urls.explorers.polygonscan.nft":"https://polygonscan.com/nft/{{address}}/{{nftId}}","urls.explorers.mumbai.token_transactions":"https://mumbai.polygonscan.com/token/{{token}}?a={{address}}","urls.explorers.mumbai.addresses":"https://mumbai.polygonscan.com/address/{{address}}","urls.explorers.mumbai.transactions":"https://mumbai.polygonscan.com/tx/{{id}}","urls.explorers.mumbai.nft":"https://mumbai.polygonscan.com/nft/{{address}}/{{nftId}}","urls.explorers.goerli.token_transactions":"https://goerli.etherscan.io/token/{{token}}?a={{address}}","urls.explorers.goerli.addresses":"https://goerli.etherscan.io/address/{{address}}","urls.explorers.goerli.transactions":"https://goerli.etherscan.io/tx/{{id}}","urls.explorers.goerli.nft":"https://goerli.etherscan.io/nft/{{address}}/{{nftId}}","urls.marketplaces.opensea.collection":"https://opensea.io/assets/{{network}}/{{address}}","urls.marketplaces.opensea.nft":"https://opensea.io/assets/{{network}}/{{address}}/{{nftId}}","urls.marketplaces.rarible.collection":"https://rarible.com/collection/{{address}}/items","urls.marketplaces.rarible.nft":"https://rarible.com/token/{{address}}:{{nftId}}","urls.marketplaces.blur.collection":"https://blur.io/collection/{{address}}","urls.marketplaces.blur.nft":"https://blur.io/asset/{{address}}/{{nftId}}","urls.marketplaces.looksrare.collection":"https://looksrare.org/collections/{{address}}","urls.marketplaces.looksrare.nft":"https://looksrare.org/collections/{{address}}/{{nftId}}","validation.accepted":"The {{attribute}} must be accepted.","validation.accepted_if":"The {{attribute}} must be accepted when {{other}} is {{value}}.","validation.active_url":"The {{attribute}} is not a valid URL.","validation.after":"The {{attribute}} must be a date after {{date}}.","validation.after_or_equal":"The {{attribute}} must be a date after or equal to {{date}}.","validation.alpha":"The {{attribute}} must only contain letters.","validation.alpha_dash":"The {{attribute}} must only contain letters, numbers, dashes and underscores.","validation.alpha_num":"The {{attribute}} must only contain letters and numbers.","validation.array":"The {{attribute}} must be an array.","validation.ascii":"The {{attribute}} must only contain single-byte alphanumeric characters and symbols.","validation.before":"The {{attribute}} must be a date before {{date}}.","validation.before_or_equal":"The {{attribute}} must be a date before or equal to {{date}}.","validation.between.array":"The {{attribute}} must have between {{min}} and {{max}} items.","validation.between.file":"The {{attribute}} must be between {{min}} and {{max}} kilobytes.","validation.between.numeric":"The {{attribute}} must be between {{min}} and {{max}}.","validation.between.string":"The {{attribute}} must be between {{min}} and {{max}} characters.","validation.boolean":"The {{attribute}} field must be true or false.","validation.confirmed":"The {{attribute}} confirmation does not match.","validation.current_password":"The password is incorrect.","validation.date":"The {{attribute}} is not a valid date.","validation.date_equals":"The {{attribute}} must be a date equal to {{date}}.","validation.date_format":"The {{attribute}} does not match the format {{format}}.","validation.decimal":"The {{attribute}} must have {{decimal}} decimal places.","validation.declined":"The {{attribute}} must be declined.","validation.declined_if":"The {{attribute}} must be declined when {{other}} is {{value}}.","validation.different":"The {{attribute}} and {{other}} must be different.","validation.digits":"The {{attribute}} must be {{digits}} digits.","validation.digits_between":"The {{attribute}} must be between {{min}} and {{max}} digits.","validation.dimensions":"The {{attribute}} has invalid image dimensions.","validation.distinct":"The {{attribute}} field has a duplicate value.","validation.doesnt_end_with":"The {{attribute}} may not end with one of the following: {{values}}.","validation.doesnt_start_with":"The {{attribute}} may not start with one of the following: {{values}}.","validation.email":"The {{attribute}} must be a valid email address.","validation.ends_with":"The {{attribute}} must end with one of the following: {{values}}.","validation.enum":"The selected {{attribute}} is invalid.","validation.exists":"The selected {{attribute}} is invalid.","validation.file":"The {{attribute}} must be a file.","validation.filled":"The {{attribute}} field must have a value.","validation.gt.array":"The {{attribute}} must have more than {{value}} items.","validation.gt.file":"The {{attribute}} must be greater than {{value}} kilobytes.","validation.gt.numeric":"The {{attribute}} must be greater than {{value}}.","validation.gt.string":"The {{attribute}} must be greater than {{value}} characters.","validation.gte.array":"The {{attribute}} must have {{value}} items or more.","validation.gte.file":"The {{attribute}} must be greater than or equal to {{value}} kilobytes.","validation.gte.numeric":"The {{attribute}} must be greater than or equal to {{value}}.","validation.gte.string":"The {{attribute}} must be greater than or equal to {{value}} characters.","validation.image":"The {{attribute}} must be an image.","validation.in":"The selected {{attribute}} is invalid.","validation.in_array":"The {{attribute}} field does not exist in {{other}}.","validation.integer":"The {{attribute}} must be an integer.","validation.ip":"The {{attribute}} must be a valid IP address.","validation.ipv4":"The {{attribute}} must be a valid IPv4 address.","validation.ipv6":"The {{attribute}} must be a valid IPv6 address.","validation.json":"The {{attribute}} must be a valid JSON string.","validation.lowercase":"The {{attribute}} must be lowercase.","validation.lt.array":"The {{attribute}} must have less than {{value}} items.","validation.lt.file":"The {{attribute}} must be less than {{value}} kilobytes.","validation.lt.numeric":"The {{attribute}} must be less than {{value}}.","validation.lt.string":"The {{attribute}} must be less than {{value}} characters.","validation.lte.array":"The {{attribute}} must not have more than {{value}} items.","validation.lte.file":"The {{attribute}} must be less than or equal to {{value}} kilobytes.","validation.lte.numeric":"The {{attribute}} must be less than or equal to {{value}}.","validation.lte.string":"The {{attribute}} must be less than or equal to {{value}} characters.","validation.mac_address":"The {{attribute}} must be a valid MAC address.","validation.max.array":"The {{attribute}} must not have more than {{max}} items.","validation.max.file":"The {{attribute}} must not be greater than {{max}} kilobytes.","validation.max.numeric":"The {{attribute}} must not be greater than {{max}}.","validation.max.string":"The {{attribute}} must not be greater than {{max}} characters.","validation.max_digits":"The {{attribute}} must not have more than {{max}} digits.","validation.mimes":"The {{attribute}} must be a file of type: {{values}}.","validation.mimetypes":"The {{attribute}} must be a file of type: {{values}}.","validation.min.array":"The {{attribute}} must have at least {{min}} items.","validation.min.file":"The {{attribute}} must be at least {{min}} kilobytes.","validation.min.numeric":"The {{attribute}} must be at least {{min}}.","validation.min.string":"The {{attribute}} must be at least {{min}} characters.","validation.min_digits":"The {{attribute}} must have at least {{min}} digits.","validation.missing":"The {{attribute}} field must be missing.","validation.missing_if":"The {{attribute}} field must be missing when {{other}} is {{value}}.","validation.missing_unless":"The {{attribute}} field must be missing unless {{other}} is {{value}}.","validation.missing_with":"The {{attribute}} field must be missing when {{values}} is present.","validation.missing_with_all":"The {{attribute}} field must be missing when {{values}} are present.","validation.multiple_of":"The {{attribute}} must be a multiple of {{value}}.","validation.not_in":"The selected {{attribute}} is invalid.","validation.not_regex":"The {{attribute}} format is invalid.","validation.numeric":"The {{attribute}} must be a number.","validation.password.letters":"The {{attribute}} must contain at least one letter.","validation.password.mixed":"The {{attribute}} must contain at least one uppercase and one lowercase letter.","validation.password.numbers":"The {{attribute}} must contain at least one number.","validation.password.symbols":"The {{attribute}} must contain at least one symbol.","validation.password.uncompromised":"The given {{attribute}} has appeared in a data leak. Please choose a different {{attribute}}.","validation.present":"The {{attribute}} field must be present.","validation.prohibited":"The {{attribute}} field is prohibited.","validation.prohibited_if":"The {{attribute}} field is prohibited when {{other}} is {{value}}.","validation.prohibited_unless":"The {{attribute}} field is prohibited unless {{other}} is in {{values}}.","validation.prohibits":"The {{attribute}} field prohibits {{other}} from being present.","validation.regex":"The {{attribute}} format is invalid.","validation.required":"The {{attribute}} field is required.","validation.required_array_keys":"The {{attribute}} field must contain entries for: {{values}}.","validation.required_if":"The {{attribute}} field is required when {{other}} is {{value}}.","validation.required_if_accepted":"The {{attribute}} field is required when {{other}} is accepted.","validation.required_unless":"The {{attribute}} field is required unless {{other}} is in {{values}}.","validation.required_with":"The {{attribute}} field is required when {{values}} is present.","validation.required_with_all":"The {{attribute}} field is required when {{values}} are present.","validation.required_without":"The {{attribute}} field is required when {{values}} is not present.","validation.required_without_all":"The {{attribute}} field is required when none of {{values}} are present.","validation.same":"The {{attribute}} and {{other}} must match.","validation.size.array":"The {{attribute}} must contain {{size}} items.","validation.size.file":"The {{attribute}} must be {{size}} kilobytes.","validation.size.numeric":"The {{attribute}} must be {{size}}.","validation.size.string":"The {{attribute}} must be {{size}} characters.","validation.starts_with":"The {{attribute}} must start with one of the following: {{values}}.","validation.string":"The {{attribute}} must be a string.","validation.timezone":"The {{attribute}} must be a valid timezone.","validation.unique":"The {{attribute}} has already been taken.","validation.uploaded":"The {{attribute}} failed to upload.","validation.uppercase":"The {{attribute}} must be uppercase.","validation.url":"The {{attribute}} must be a valid URL.","validation.ulid":"The {{attribute}} must be a valid ULID.","validation.uuid":"The {{attribute}} must be a valid UUID.","validation.custom.attribute-name.rule-name":"custom-message","validation.unsupported_currency_code":"The currency code you provided is invalid or not supported.","validation.unsupported_period":"The period you provided is invalid or not supported.","validation.unsupported_token_symbol":"The token symbol you provided is invalid or not supported.","validation.gallery_title_required":"Gallery name is required.","validation.gallery_title_max_characters":"The gallery name should not exceed 50 characters.","validation.gallery_title_invalid":"The gallery name is invalid.","validation.nfts_required":"Please add at least one NFT.","validation.nfts_max_size":"Galleries can contain no more than {{limit}} NFTs","validation.invalid_nfts":"The NFT in position {{position}} is invalid, please select another one.","validation.invalid_cover":"You have selected an invalid cover image, please try another one."} \ No newline at end of file +{"auth.welcome":"Welcome to Dashbrd","auth.logged_in":"You're logged in!","auth.log_out":"Log out","auth.failed":"These credentials do not match our records.","auth.session_timeout":"Your session has timed out. Please refresh the page and try connecting your account again.","auth.session_timeout_modal":"Seems like your session has timed out. Please connnect your wallet again.","auth.password":"The provided password is incorrect.","auth.throttle":"Too many login attempts. Please try again in {{seconds}} seconds.","auth.wallet.connecting":"Connecting …","auth.wallet.waiting_for_signature":"Waiting for Signature …","auth.wallet.switching_wallet":"Switching Wallet …","auth.wallet.connect":"Connect Wallet","auth.wallet.connect_long":"Connect Your Wallet to Get Started","auth.wallet.sign_subtitle":"Connect Your Wallet to Continue","auth.wallet.disconnect":"Disconnect Wallet","auth.wallet.install":"Install MetaMask","auth.wallet.install_long":"Install MetaMask to Get Started","auth.wallet.sign":"Sign Message","auth.wallet.sign_message":"Welcome to Dashbrd. In order to login, sign this message with your wallet. It doesn't cost you anything!\n\nSigning ID (you can ignore this): {{nonce}}","auth.wallet.connect_subtitle":"Click on the MetaMask icon in your browser to confirm the action and connect your wallet.","auth.wallet.requires_signature":"In order to prevent impersonation, we require a signature to perform this action. This signature is only a signed message and does not give any access to your wallet.","auth.errors.metamask.no_account":"No account found. Please connect your wallet and try again.","auth.errors.metamask.generic":"Connection attempt error. Please retry and follow the steps to connect your wallet.","auth.errors.metamask.invalid_network":"Please switch to Polygon or Ethereum Mainnet in your MetaMask plugin to connect to Dashbrd.","auth.errors.metamask.provider_missing":"You don't have MetaMask installed in your browser. Please install and try again.","auth.errors.metamask.user_rejected":"It looks like you cancelled signing of the authentication message. Please try again.","auth.errors.metamask.provider_not_set":"Ethereum provider is not set","auth.validation.wallet_login_failed":"There was a problem trying to verify your signature. Please try again.","auth.validation.invalid_address":"Your wallet address is invalid. Please try again.","auth.validation.invalid_signature":"Signature is invalid. Please try again.","auth.validation.invalid_network":"Please switch to Polygon or Ethereum Mainnet in your MetaMask plugin to connect to Dashbrd.","common.author":"Author","common.add":"Add","common.amount":"Amount","common.balance":"Balance","common.cancel":"Cancel","common.delete":"Delete","common.edit":"Edit","common.confirm":"Confirm","common.connect":"Connect","common.continue":"Continue","common.done":"Done","common.filter":"Filter","common.items":"Items","common.receive":"Receive","common.received":"Received","common.retry":"Retry","common.records":"Records","common.save":"Save","common.send":"Send","common.sent":"Sent","common.show":"Show","common.searching":"Searching...","common.other":"Other","common.owned":"Owned","common.token":"Token","common.tokens":"Tokens","common.wallet":"Wallet","common.pending":"Pending","common.publish":"Publish","common.published":"Published","common.empty":"Empty","common.your_address":"Your Address","common.warning":"Warning","common.my_address":"My Address","common.my_wallet":"My Wallet","common.my_balance":"My Balance","common.na":"N/A","common.simple_plural_without_data":"One comment|Many comments","common.simple_plural_with_data":"{{count}} comment|{{count}} comments","common.advanced_plural_without_data":"{0} no comments yet|{1} 1 comment|[2,*] Many comments","common.advanced_plural_with_data":"{0} no comments yet|{1} 1 comment|[2,*] {{count}} comments","common.copy_clipboard":"Copy to Clipboard","common.copy":"Copy","common.download":"Download","common.zoom":"Zoom","common.my_collection":"My Collection","common.max":"Max","common.chain":"Chain","common.copied":"Copied!","common.coming_soon":"Coming Soon","common.more_details":"More Details","common.close":"Close","common.close_toast":"Close toast","common.loading":"Loading","common.price":"Price","common.articles":"Articles","common.most_popular":"Most Popular","common.market_cap":"Market Cap","common.volume":"Volume {{frequency}}","common.value":"Value","common.last_n_days":"Last {{count}} Days","common.details":"Details","common.view_all":"View All","common.view_more_on_polygonscan":"View More on Polygonscan","common.view_more_on_etherscan":"View More on Etherscan","common.view_nft_on_etherscan":"View NFT on Etherscan","common.view_nft_on_polygonscan":"View NFT on Polygonscan","common.view_nft_on_goerli_tesnet":"View NFT on Goerli Testnet Explorer","common.view_nft_on_mumbai_tesnet":"View NFT on Mumbai Testnet Explorer","common.polygonscan":"Polygonscan","common.etherscan":"Etherscan","common.featured":"Featured","common.floor_price":"Floor Price","common.floor":"Floor","common.supply":"Supply","common.owners":"Owners","common.created":"Created","common.nft":"NFT","common.collection":"Collection","common.collections":"Collections","common.gallery":"Gallery","common.basic_gallery":"Basic Gallery","common.gallery_name":"Gallery Name","common.create_gallery":"Create Gallery","common.external_link":"External Link","common.follow_link":"Follow Link","common.cover":"Cover","common.template":"Template","common.page":"Page","common.polygon":"Polygon","common.ethereum":"Ethereum","common.mumbai":"Mumbai","common.goerli":"Goerli","common.of":"of","common.pagination_input_placeholder":"Enter the page number","common.pagination_input_placeholder_mobile":"Page number","common.nft_count":"{0} {{count}} NFTs|{1} {{count}} NFT|[2,*] {{count}} NFTs","common.nft_gallery":"NFT Gallery","common.unable_to_retrieve_image":"Unable to retrieve your NFT image at this time","common.optional":"Optional","common.selected":"Selected","common.select":"Select","common.preview":"Preview","common.image_size_error":"Image size must not exceed 2MB","common.image_dimensions_error":"Image dimensions must exceed 287px x 190px","common.write_to_confirm":"Write {{word}} to confirm","common.n_hours":"{0} {{count}} hour|{1} {{count}} hour|[2,*] {{count}} hours","common.n_minutes":"{0} {{count}} minute|{1} {{count}} minute|[2,*] {{count}} minutes","common.report":"Report","common.n_nfts":"{0}NFTs|{1}NFT|[2,*]NFTs","common.n_collections":"{0}collections|{1}collection|[2,*]collections","common.back":"Back","common.back_to":"Back to","common.name":"Name","common.type":"Type","common.from":"From","common.to":"To","common.sale_price":"Sale Price","common.recent_activity":"Recent Activity","common.time":"Time","common.datetime.few_seconds_ago":"A few seconds ago","common.datetime.minutes_ago":"{0} Less than a minute ago|{1} A minute ago|[2,*] {{count}} minutes ago","common.datetime.hours_ago":"{0} Less than an hour ago|{1} An hour ago|[2,*] {{count}} hours ago","common.datetime.days_ago":"{0} Less than a day ago|{1} A day ago|[2,*] {{count}} days ago","common.datetime.weeks_ago":"{0} Less than a week ago|{1} A week ago|[2,*] {{count}} weeks ago","common.datetime.months_ago":"{0} Less than a month ago|{1} A month ago|[2,*] {{count}} months ago","common.datetime.years_ago":"{0} Less than a year ago|{1} A year ago|[2,*] {{count}} years ago","common.no_traits_found":"No traits found.","common.empty_transactions":"You don't have any transactions yet. Once transactions have been made, they will show up here.","common.error":"Error","common.refresh":"Refresh","common.refresh_metadata":"Refresh Metadata","common.refreshing_metadata":"Refreshing Metadata... Please check back later.","common.refreshing_activity":"Refreshing Activity... Please check back later.","common.pending_confirmation":"Pending Confirmation","common.confirmed_transaction":"Confirmed Transaction","common.transaction_error":"Transaction Error","common.transaction_error_description_first_part":"Your transaction encountered an error. View this transaction on","common.transaction_error_description_second_part":"for more details.","common.home":"Home","common.contact":"Contact","common.menu":"Menu","common.website":"Website","common.twitter":"Twitter","common.discord":"Discord","common.facebook":"Facebook","common.reddit":"Reddit","common.x":"X","common.sort":"Sort","common.drafts":"Drafts","common.draft":"Draft","common.delete_draft":"Delete Draft","common.share_on":"Share on {{platform}}","footer.copyright":"{{year}} © Dashbrd. All rights reserved.","footer.all_rights_reserved":"All rights reserved","footer.privacy_policy":"Privacy Policy","footer.terms_of_service":"Terms of Service","footer.powered_by":"Powered by","format.fiat":"{{ value, currency }}","format.number":"{{ value, number }}","metatags.home.title":"Dashbrd | Web3 Portfolio Management Made Simple","metatags.home.description":"Simplify your Web3 journey with Dashbrd. Manage your portfolio of tokens, NFTs, and other digital collectibles across the Ethereum and Polygon blockchains.","metatags.home.image":"/images/meta/home.png","metatags.error.title":"Error {{code}} | Dashbrd","metatags.wallet.title":"My Wallet | Dashbrd","metatags.galleries.title":"Top NFT Galleries | Dashbrd","metatags.galleries.image":"/images/meta/nft-galleries.png","metatags.galleries.description":"Explore user published NFT galleries to find custom curated PFPs, Digital Collectibles, & More.","metatags.galleries.most_popular.title":"Most Popular Galleries | Dashbrd","metatags.galleries.most_popular.image":"/images/meta/most-popular-nft-galleries.png","metatags.galleries.most_popular.description":"Explore and discover Most Popular NFT Galleries created by our users featuring custom curated PFPs, Digital Collectibles, & More.","metatags.galleries.newest.title":"Newest Galleries | Dashbrd","metatags.galleries.newest.image":"/images/meta/newest-nft-galleries.png","metatags.galleries.newest.description":"Explore and discover most recent NFT galleries created by our users featuring custom curated PFPs, Digital Collectibles, & More","metatags.galleries.most_valuable.title":"Most Valuable Galleries | Dashbrd","metatags.galleries.most_valuable.image":"/images/meta/most-valuable-nft-galleries.png","metatags.galleries.most_valuable.description":"Explore and discover Most Valuable NFT Galleries created by our users featuring custom curated PFPs, Digital Collectibles, & More.","metatags.galleries.view.title":"{{name}} | Dashbrd","metatags.galleries.view.description":"{{name}} | A Curated NFT Gallery at Dashbrd","metatags.galleries.view.image":"/images/meta/nft-gallery.png","metatags.my_galleries.title":"My Galleries | Dashbrd","metatags.my_galleries.title_draft":"My Draft Galleries | Dashbrd","metatags.my_galleries.create.title":"Create Gallery | Dashbrd","metatags.my_galleries.edit.title":"Edit {{name}} | Dashbrd","metatags.collections.title":"Collections | Dashbrd","metatags.collections.view.title":"{{name}} Collection | Dashbrd","metatags.collections.view.description":"Immerse yourself in the intricate details of {{name}} collection, featuring remarkable digital assets. Start your NFT journey today!","metatags.collections.view.image":"/images/meta/nft-collection.png","metatags.my-collections.title":"My Collections | Dashbrd","metatags.nfts.view.title":"{{nft}} NFT | Dashbrd","metatags.nfts.view.description":"Uncover the complete story of {{nft}} NFT from the {{collection}} collection, delving into its unique attributes and distinctive features.","metatags.nfts.view.image":"/images/meta/nft-details.png","metatags.settings.title":"Settings | Dashbrd","metatags.articles.title":"Articles | Dashbrd","metatags.articles.view.title":"{{title}} | Dashbrd","metatags.login.title":"Login | Dashbrd","metatags.privacy_policy.title":"Privacy Policy | Dashbrd","metatags.privacy_policy.description":"Dashbrd’s privacy policy outlines the information we collect and explains your choices surrounding how we use information about you.","metatags.terms_of_service.title":"Terms of Service | Dashbrd","metatags.terms_of_service.description":"These Terms of Service cover your use and access to services, products or websites of Dashbrd.","metatags.cookie_policy.title":"Cookie Policy | Dashbrd","metatags.cookie_policy.description":"Dashbrd uses cookies to make the website more user-friendly. Find out about the main types of cookies we use, and what we use them for.","metatags.welcome.title":"Welcome to Dashbrd | Web3 Simplified","pages.onboarding.title":"Get Started","pages.onboarding.heading":"Your monkeys were bored and ran off, we are trying to round them up.","pages.onboarding.message":"We are setting up your account. This process usually takes just a few minutes, but can take up to 15 minutes.","pages.error.heading":"Oops, something went wrong ...","pages.error.message":"Please try again or get in touch if the issue persists.","pages.maintenance.title":"Dashbrd is currently down for scheduled maintenance.","pages.maintenance.description":"We expect to be back soon. Thanks for your patience.","pages.dashboard.title":"My Wallet","pages.dashboard.breakdown.title":"Portfolio Breakdown","pages.dashboard.line_chart.data_error":"Could not load chart data","pages.articles.title":"Articles","pages.articles.featured_collections":"Featured Collections","pages.articles.placeholder_more_soon":"More Soon","pages.articles.no_articles":"No articles have been published yet. Please check back later!","pages.articles.header_title":"Explore our collection of","pages.articles.header_suffix_one":"published article","pages.articles.header_suffix_other":"published articles","pages.articles.audio_version":"Audio version","pages.articles.consists_of_collections":"{0} This article highlights {{count}} collections|{1} This article highlights {{count}} collection|[2,*] This article highlights {{count}} collections","pages.collections.title":"Collections","pages.collections.collections":"Collections","pages.collections.collection_value":"Collection Value","pages.collections.nfts_owned":"NFTs Owned","pages.collections.header_title":"You own <0>{{nftsCount}} {{nfts}} across <0>{{collectionsCount}} {{collections}}, worth about <0><1>{{worth}}","pages.collections.search_placeholder":"Search by Collection","pages.collections.properties":"Properties","pages.collections.collections_network":"Collections Network","pages.collections.property_search_placeholder":"Feature Search","pages.collections.floor_price":"Floor Price","pages.collections.value":"Value","pages.collections.rarity":"Rarity","pages.collections.report":"Report","pages.collections.hide_collection":"Hide Collection","pages.collections.unhide_collection":"Unhide Collection","pages.collections.no_collections":"You do not own any NFTs yet. Once you do they will be shown here.","pages.collections.all_collections_hidden":"You have hidden all your collections. Unhide and they will appear here.","pages.collections.about_collection":"About Collection","pages.collections.show_hidden":"Show Hidden","pages.collections.show_my_collection":"Show My Collection","pages.collections.owned":"Owned","pages.collections.activities.loading_activities":"We're fetching Activity for this NFT, please hang tight, this can take a while.","pages.collections.activities.loading_activities_collection":"We're fetching Activity for this collection, please hang tight, this can take a while.","pages.collections.activities.ignores_activities":"We don't support activity history for this collection yet.","pages.collections.activities.no_activity":"This collection does not have any activity yet.","pages.collections.activities.types.LABEL_MINT":"Mint","pages.collections.activities.types.LABEL_TRANSFER":"Transfer","pages.collections.activities.types.LABEL_SALE":"Sale","pages.collections.articles.no_articles":"No articles have been linked to this collection as of now.","pages.collections.articles.no_articles_with_filters":"We could not find any articles matching your search criteria, please try again!","pages.collections.articles.search_placeholder":"Search in Articles","pages.collections.articles.sort_latest":"Latest","pages.collections.articles.sort_popularity":"Most Popular","pages.collections.search.loading_results":"Loading results...","pages.collections.search.no_results":"We could not find anything matching your search criteria, please try again!","pages.collections.search.no_results_with_filters":"We could not find anything matching your filters, please try again!","pages.collections.search.no_results_ownership":"You do not own any NFTs in this collection","pages.collections.search.error":"Could not load search results. Please try again later.","pages.collections.sorting.token_number":"Token Number","pages.collections.sorting.recently_received":"Recently Received","pages.collections.sorting.recently_created":"Recently Created","pages.collections.sorting.oldest_collection":"Oldest Collection","pages.collections.traits.description":"List of NFT traits by % of occurrence in the collection","pages.collections.traits.no_traits":"No Properties can be found for this NFT","pages.collections.menu.collection":"Collection","pages.collections.menu.articles":"Articles","pages.collections.menu.activity":"Activity","pages.collections.hidden_modal.collection_hidden":"Collection Hidden","pages.collections.hidden_modal.description":"This collection is currently set to Hidden. Are you sure you want to unhide this collection? You can\n reset the collection to hidden from the collection menu.","pages.collections.hidden_modal.unhide":"Unhide","pages.collections.hidden_modal.error":"Something went wrong. Please try again.","pages.collections.external_modal.you_wish_continue":"You are about to leave Dashbrd to an external website. Dashbrd has no control over the content of\n this site. Are you sure you wish to continue?","pages.collections.external_modal.not_show":"Do not show this message again.","pages.collections.refresh.title":"Refresh your collection","pages.collections.refresh.notice":"You can refresh data every 15 minutes.","pages.collections.refresh.notice_wait":"Please wait. You can refresh data every 15 minutes.","pages.collections.refresh.toast":"We're updating information for your collection.","pages.nfts.nft":"nft","pages.nfts.about_nft":"About NFT","pages.nfts.owned_by":"Owned by","pages.nfts.collection_image":"collection image","pages.nfts.menu.properties":"Properties","pages.nfts.menu.activity":"Activity","pages.reports.title":"Submit a Report","pages.reports.description":"Thanks for looking out by reporting things that break the rules. Let us know what's happening and we'll receive the report.","pages.reports.success":"Thank you for your report. We'll review it and see if it breaks our ToS.","pages.reports.failed":"Something went wrong. Please try again.","pages.reports.throttle":"You have made too many requests. Please wait {{time}} before reporting again.","pages.reports.reported":"You have already reported this {{model}}.","pages.reports.reasons.spam":"Spam","pages.reports.reasons.violence":"Promoting Violence","pages.reports.reasons.hate":"Hate","pages.reports.reasons.inappropriate_content":"Inappropriate Content","pages.reports.reasons.impersonation":"Impersonation","pages.reports.reasons.trademark":"Trademark or Copyright","pages.reports.reasons.selfharm":"Self-Harm","pages.reports.reasons.harassment":"Harassment","pages.galleries.title":"Galleries","pages.galleries.empty_title":"No galleries have been published yet. Once they do they will appear here.","pages.galleries.search.loading_results":"Loading results...","pages.galleries.search.no_results":"We could not find anything matching your search criteria, please try again!","pages.galleries.search.placeholder":"Search by name or curator address","pages.galleries.search.placeholder_nfts":"Search by NFTs","pages.galleries.search.error":"Could not load search results. Please try again later.","pages.galleries.my_galleries.title":"My Galleries","pages.galleries.my_galleries.subtitle":"Manage your galleries","pages.galleries.my_galleries.new_gallery":"New Gallery","pages.galleries.my_galleries.no_galleries":"You have not created any galleries yet. To create a gallery, click on the \"Create Gallery\" button.","pages.galleries.my_galleries.no_draft_galleries":"You have no draft galleries yet. To create a gallery, click on the \"Create Gallery\" button.","pages.galleries.my_galleries.succesfully_deleted":"Gallery has been successfully removed","pages.galleries.my_galleries.draft_succesfully_deleted":"Draft has been successfully removed","pages.galleries.my_galleries.successfully_created":"Gallery has been successfully created","pages.galleries.my_galleries.successfully_updated":"Gallery has been successfully updated","pages.galleries.my_galleries.new_gallery_no_nfts":"Creating a Gallery requires you to own an NFT.","pages.galleries.my_galleries.delete_modal.title":"Delete Draft","pages.galleries.my_galleries.delete_modal.text":"Are you sure you want to delete the draft? Everything you've done will be deleted and you won't be able to get it back.","pages.galleries.my_galleries.nfts_no_longer_owned":"NFTs no longer owned by this wallet have been removed from the draft”","pages.galleries.copy_gallery_link":"Copy Gallery Link","pages.galleries.my_nfts":"My NFTs","pages.galleries.value":"Value","pages.galleries.floor_price":"Floor Price","pages.galleries.nfts":"NFTs","pages.galleries.collections":"Collections","pages.galleries.galleries_count_simple":"{0} galleries|{1} gallery|[2,*] galleries","pages.galleries.galleries_count":"{0} {{count}} Galleries|{1} {{count}} Gallery|[2,*] {{count}} Galleries","pages.galleries.collections_count_simple":"{0} collections|{1} collection|[2,*] collections","pages.galleries.collections_count":"{0} {{count}} Collections|{1} {{count}} Collection|[2,*] {{count}} Collections","pages.galleries.nfts_count_simple":"{0} NFTs|{1} NFT|[2,*] NFTs","pages.galleries.nfts_count":"{0} {{count}} NFTs|{1} {{count}} NFT|[2,*] {{count}} NFTs","pages.galleries.users_count_simple":"{0} users|{1} user|[2,*] users","pages.galleries.users_count":"{0} {{count}} Users|{1} {{count}} User|[2,*] {{count}} Users","pages.galleries.featuring":"Featuring","pages.galleries.curated_by":"Curated by","pages.galleries.worth_about":"Worth About","pages.galleries.valued_at":"valued at","pages.galleries.from":"From","pages.galleries.most_popular_galleries":"Most Popular Galleries","pages.galleries.newest_galleries":"Newest Galleries","pages.galleries.most_valuable_galleries":"Most Valuable Galleries","pages.galleries.most_popular":"Most Popular","pages.galleries.newest":"Newest","pages.galleries.most_valuable":"Most Valuable","pages.galleries.create.search_by_nfts":"Search by NFTs","pages.galleries.create.input_placeholder":"Enter gallery name","pages.galleries.create.title_too_long":"Gallery name must not exceed {{max}} characters.","pages.galleries.create.already_selected_nft":"NFT already exists in this gallery","pages.galleries.create.nft_missing_image":"Only NFTs with images can be added to galleries","pages.galleries.create.nft_gallery_limit":"You can only add 16 NFTs per gallery","pages.galleries.create.gallery_cover":"Gallery Cover","pages.galleries.create.gallery_cover_description":"The cover is used for the card on the gallery list page. While the cover is not a requirement it will allow you to add personality and stand out from the crowd.","pages.galleries.create.gallery_cover_information":"Image dimensions must be at least 287px x 190px, with a max size of 2 MB (JPG, PNG or GIF)","pages.galleries.create.no_results":"We could not find anything matching your search criteria, please try again!","pages.galleries.create.templates.cover":"Cover","pages.galleries.create.templates.template":"Template","pages.galleries.create.templates.select":"Select Gallery Template","pages.galleries.create.templates.basic":"Basic Gallery","pages.galleries.create.templates.coming_soon":"More Coming Soon","pages.galleries.create.load_more_collections_one":"Load {{count}} More Collection","pages.galleries.create.load_more_collections_other":"Load {{count}} More Collections","pages.galleries.create.load_more_nfts":"Load More NFTs","pages.galleries.create.can_purchase":"You can purchase NFTs with these top NFT Marketplaces:","pages.galleries.create.must_own_one_nft":"You must own at least one (1) NFT in order to create a gallery.","pages.galleries.create.back_to_galleries":"Back to Galleries","pages.galleries.create.draft_saved":"Draft Saved","pages.galleries.create.saving_to_draft":"Saving to draft","pages.galleries.create.drafts_limit_modal_title":"Draft Gallery Limit","pages.galleries.create.drafts_limit_modal_message":"You’ve hit your limit for draft galleries. While you can still make new galleries and publish them, they won’t be saved as drafts. To Free up space, you can either delete existing drafts or publish them.","pages.galleries.create.drafts_limit_modal_cancel":"Go to Drafts","pages.galleries.delete_modal.title":"Delete Gallery","pages.galleries.delete_modal.confirmation_text":"Are you sure you want to delete the gallery? Deleting a Gallery is permanent, all associated views and likes will be lost.","pages.galleries.consists_of_collections":"{0} This gallery consists of {{count}} collections|{1} This gallery consists of {{count}} collection|[2,*] This gallery consists of {{count}} collections","pages.galleries.guest_banner.title":"Craft the ultimate","pages.galleries.guest_banner.subtitle":"Pick your favorites, curate your gallery, & share it with the world.","pages.profile.title":"Profile","pages.token_panel.balance_tooltip":"Total percentage of the portfolio held in this token","pages.token_panel.insufficient_funds":"Insufficient Balance","pages.token_panel.error":"Dashbrd has failed to load token information. Please try again later.","pages.token_panel.failed_to_retrieve_transactions":"We were unable to fetch your transactions.","pages.token_panel.tabs.transaction_history":"Transaction History","pages.token_panel.tabs.history":"History","pages.token_panel.tabs.market_data":"Market Data","pages.token_panel.details.current_price":"Current Price","pages.token_panel.details.title":"Token Details","pages.token_panel.details.market_cap":"Market Cap","pages.token_panel.details.volume":"Daily Volume","pages.token_panel.details.supply":"Minted Supply","pages.token_panel.details.ath":"All-Time High","pages.token_panel.details.atl":"All-Time Low","pages.token_panel.chart.failed":"Dashbrd has failed to load chart information. Please try again later.","pages.transaction_details_panel.title":"Transaction Details","pages.transaction_details_panel.details.blockchain":"Blockchain","pages.transaction_details_panel.details.timestamp":"Timestamp","pages.transaction_details_panel.details.transaction_hash":"Transaction Hash","pages.transaction_details_panel.details.transaction_fee":"Transaction Fee","pages.transaction_details_panel.details.gas_price":"Gas Price","pages.transaction_details_panel.details.gas_used":"Gas Used","pages.transaction_details_panel.details.nonce":"Nonce","pages.send_receive_panel.send.labels.token_and_amount":"Token and Amount","pages.send_receive_panel.send.labels.destination_address":"Destination Address","pages.send_receive_panel.send.labels.projected_fee":"Projected Fee","pages.send_receive_panel.send.placeholders.enter_amount":"Enter Amount","pages.send_receive_panel.send.placeholders.insert_recipient_address":"Insert Recipient Address","pages.send_receive_panel.send.placeholders.projected_fee":"Projected Fee","pages.send_receive_panel.send.errors.amount":"Insufficient Funds: You do not have enough to cover the amount + fee.","pages.send_receive_panel.send.errors.destination":"Destination address is not correct. Check and input again.","pages.send_receive_panel.send.hints.token_price":"Token Price","pages.send_receive_panel.send.fees.Fast":"Fast","pages.send_receive_panel.send.fees.Avg":"Avg","pages.send_receive_panel.send.fees.Slow":"Slow","pages.send_receive_panel.send.search_dropdown.placeholder":"Search token","pages.send_receive_panel.send.search_dropdown.no_results":"No Results","pages.send_receive_panel.send.search_dropdown.error":"Error occurred while searching tokens.","pages.send_receive_panel.send.transaction_time":"Transaction Time: ~{{ time }} minutes","pages.send_receive_panel.send.from":"From","pages.send_receive_panel.send.to":"To","pages.send_receive_panel.send.amount":"Amount","pages.send_receive_panel.send.fee":"Fee","pages.send_receive_panel.send.total_amount":"Total Amount","pages.send_receive_panel.send.waiting_message":"Review and verify the information on your MetaMask. Sign to send the transaction.","pages.send_receive_panel.send.waiting_spinner_text":"Waiting for confirmation...","pages.send_receive_panel.send.failed_message":"It looks like something went wrong while sending your transaction. Press 'Retry' to make another attempt.","pages.send_receive_panel.receive.alert":"Send only Polygon or Ethereum Network compatible tokens to this address or you could permanently lose your funds!","pages.settings.title":"Settings","pages.settings.sidebar.general":"General","pages.settings.sidebar.notifications":"Notifications","pages.settings.sidebar.session_history":"Sessions History","pages.settings.general.title":"Settings","pages.settings.general.subtitle":"Customize your App Experience","pages.settings.general.currency":"Currency","pages.settings.general.currency_subtitle":"Select your default currency which will be used throughout the app.","pages.settings.general.time_date":"Time & Date","pages.settings.general.time_date_subtitle":"Select how you want time and date be shown inside app.","pages.settings.general.date_format":"Date Format","pages.settings.general.time_format":"Time Format","pages.settings.general.timezone":"Timezone","pages.settings.general.set_defaults":"Set Defaults","pages.settings.general.set_defaults_content":"Reverting to the default settings will remove any customizations previously made. Are you sure?","pages.settings.general.save":"Save Settings","pages.settings.general.saved":"Your settings have been successfully saved","pages.wallet.title":"Wallet","pages.privacy_policy.title":"Privacy Policy","pages.terms_of_service.title":"Terms of Service","pagination.previous":"« Previous","pagination.next":"Next »","passwords.reset":"Your password has been reset!","passwords.sent":"We have emailed your password reset link!","passwords.throttled":"Please wait before retrying.","passwords.token":"This password reset token is invalid.","passwords.user":"We can't find a user with that email address.","urls.landing":"https://dashbrd.com","urls.cookie_policy":"https://dashbrd.com/cookie-policy","urls.privacy_policy":"https://dashbrd.com/privacy-policy","urls.terms_of_service":"https://dashbrd.com/terms-of-service","urls.twitter":"https://x.com/DashbrdApp","urls.discord":"https://discord.gg/MJyWKkCJ5k","urls.github":"https://github.com/ArdentHQ/dashbrd","urls.coingecko":"https://www.coingecko.com","urls.etherscan":"https://etherscan.io","urls.polygonscan":"https://polygonscan.com","urls.alchemy":"https://www.alchemy.com","urls.moralis":"https://moralis.io","urls.mnemonic":"https://www.mnemonichq.com","urls.opensea":"https://opensea.io/","urls.explorers.etherscan.token_transactions":"https://etherscan.io/token/{{token}}?a={{address}}","urls.explorers.etherscan.addresses":"https://etherscan.io/address/{{address}}","urls.explorers.etherscan.transactions":"https://etherscan.io/tx/{{id}}","urls.explorers.etherscan.nft":"https://etherscan.io/nft/{{address}}/{{nftId}}","urls.explorers.polygonscan.token_transactions":"https://polygonscan.com/token/{{token}}?a={{address}}","urls.explorers.polygonscan.addresses":"https://polygonscan.com/address/{{address}}","urls.explorers.polygonscan.transactions":"https://polygonscan.com/tx/{{id}}","urls.explorers.polygonscan.nft":"https://polygonscan.com/nft/{{address}}/{{nftId}}","urls.explorers.mumbai.token_transactions":"https://mumbai.polygonscan.com/token/{{token}}?a={{address}}","urls.explorers.mumbai.addresses":"https://mumbai.polygonscan.com/address/{{address}}","urls.explorers.mumbai.transactions":"https://mumbai.polygonscan.com/tx/{{id}}","urls.explorers.mumbai.nft":"https://mumbai.polygonscan.com/nft/{{address}}/{{nftId}}","urls.explorers.goerli.token_transactions":"https://goerli.etherscan.io/token/{{token}}?a={{address}}","urls.explorers.goerli.addresses":"https://goerli.etherscan.io/address/{{address}}","urls.explorers.goerli.transactions":"https://goerli.etherscan.io/tx/{{id}}","urls.explorers.goerli.nft":"https://goerli.etherscan.io/nft/{{address}}/{{nftId}}","urls.marketplaces.opensea.collection":"https://opensea.io/assets/{{network}}/{{address}}","urls.marketplaces.opensea.nft":"https://opensea.io/assets/{{network}}/{{address}}/{{nftId}}","urls.marketplaces.rarible.collection":"https://rarible.com/collection/{{address}}/items","urls.marketplaces.rarible.nft":"https://rarible.com/token/{{address}}:{{nftId}}","urls.marketplaces.blur.collection":"https://blur.io/collection/{{address}}","urls.marketplaces.blur.nft":"https://blur.io/asset/{{address}}/{{nftId}}","urls.marketplaces.looksrare.collection":"https://looksrare.org/collections/{{address}}","urls.marketplaces.looksrare.nft":"https://looksrare.org/collections/{{address}}/{{nftId}}","validation.accepted":"The {{attribute}} must be accepted.","validation.accepted_if":"The {{attribute}} must be accepted when {{other}} is {{value}}.","validation.active_url":"The {{attribute}} is not a valid URL.","validation.after":"The {{attribute}} must be a date after {{date}}.","validation.after_or_equal":"The {{attribute}} must be a date after or equal to {{date}}.","validation.alpha":"The {{attribute}} must only contain letters.","validation.alpha_dash":"The {{attribute}} must only contain letters, numbers, dashes and underscores.","validation.alpha_num":"The {{attribute}} must only contain letters and numbers.","validation.array":"The {{attribute}} must be an array.","validation.ascii":"The {{attribute}} must only contain single-byte alphanumeric characters and symbols.","validation.before":"The {{attribute}} must be a date before {{date}}.","validation.before_or_equal":"The {{attribute}} must be a date before or equal to {{date}}.","validation.between.array":"The {{attribute}} must have between {{min}} and {{max}} items.","validation.between.file":"The {{attribute}} must be between {{min}} and {{max}} kilobytes.","validation.between.numeric":"The {{attribute}} must be between {{min}} and {{max}}.","validation.between.string":"The {{attribute}} must be between {{min}} and {{max}} characters.","validation.boolean":"The {{attribute}} field must be true or false.","validation.confirmed":"The {{attribute}} confirmation does not match.","validation.current_password":"The password is incorrect.","validation.date":"The {{attribute}} is not a valid date.","validation.date_equals":"The {{attribute}} must be a date equal to {{date}}.","validation.date_format":"The {{attribute}} does not match the format {{format}}.","validation.decimal":"The {{attribute}} must have {{decimal}} decimal places.","validation.declined":"The {{attribute}} must be declined.","validation.declined_if":"The {{attribute}} must be declined when {{other}} is {{value}}.","validation.different":"The {{attribute}} and {{other}} must be different.","validation.digits":"The {{attribute}} must be {{digits}} digits.","validation.digits_between":"The {{attribute}} must be between {{min}} and {{max}} digits.","validation.dimensions":"The {{attribute}} has invalid image dimensions.","validation.distinct":"The {{attribute}} field has a duplicate value.","validation.doesnt_end_with":"The {{attribute}} may not end with one of the following: {{values}}.","validation.doesnt_start_with":"The {{attribute}} may not start with one of the following: {{values}}.","validation.email":"The {{attribute}} must be a valid email address.","validation.ends_with":"The {{attribute}} must end with one of the following: {{values}}.","validation.enum":"The selected {{attribute}} is invalid.","validation.exists":"The selected {{attribute}} is invalid.","validation.file":"The {{attribute}} must be a file.","validation.filled":"The {{attribute}} field must have a value.","validation.gt.array":"The {{attribute}} must have more than {{value}} items.","validation.gt.file":"The {{attribute}} must be greater than {{value}} kilobytes.","validation.gt.numeric":"The {{attribute}} must be greater than {{value}}.","validation.gt.string":"The {{attribute}} must be greater than {{value}} characters.","validation.gte.array":"The {{attribute}} must have {{value}} items or more.","validation.gte.file":"The {{attribute}} must be greater than or equal to {{value}} kilobytes.","validation.gte.numeric":"The {{attribute}} must be greater than or equal to {{value}}.","validation.gte.string":"The {{attribute}} must be greater than or equal to {{value}} characters.","validation.image":"The {{attribute}} must be an image.","validation.in":"The selected {{attribute}} is invalid.","validation.in_array":"The {{attribute}} field does not exist in {{other}}.","validation.integer":"The {{attribute}} must be an integer.","validation.ip":"The {{attribute}} must be a valid IP address.","validation.ipv4":"The {{attribute}} must be a valid IPv4 address.","validation.ipv6":"The {{attribute}} must be a valid IPv6 address.","validation.json":"The {{attribute}} must be a valid JSON string.","validation.lowercase":"The {{attribute}} must be lowercase.","validation.lt.array":"The {{attribute}} must have less than {{value}} items.","validation.lt.file":"The {{attribute}} must be less than {{value}} kilobytes.","validation.lt.numeric":"The {{attribute}} must be less than {{value}}.","validation.lt.string":"The {{attribute}} must be less than {{value}} characters.","validation.lte.array":"The {{attribute}} must not have more than {{value}} items.","validation.lte.file":"The {{attribute}} must be less than or equal to {{value}} kilobytes.","validation.lte.numeric":"The {{attribute}} must be less than or equal to {{value}}.","validation.lte.string":"The {{attribute}} must be less than or equal to {{value}} characters.","validation.mac_address":"The {{attribute}} must be a valid MAC address.","validation.max.array":"The {{attribute}} must not have more than {{max}} items.","validation.max.file":"The {{attribute}} must not be greater than {{max}} kilobytes.","validation.max.numeric":"The {{attribute}} must not be greater than {{max}}.","validation.max.string":"The {{attribute}} must not be greater than {{max}} characters.","validation.max_digits":"The {{attribute}} must not have more than {{max}} digits.","validation.mimes":"The {{attribute}} must be a file of type: {{values}}.","validation.mimetypes":"The {{attribute}} must be a file of type: {{values}}.","validation.min.array":"The {{attribute}} must have at least {{min}} items.","validation.min.file":"The {{attribute}} must be at least {{min}} kilobytes.","validation.min.numeric":"The {{attribute}} must be at least {{min}}.","validation.min.string":"The {{attribute}} must be at least {{min}} characters.","validation.min_digits":"The {{attribute}} must have at least {{min}} digits.","validation.missing":"The {{attribute}} field must be missing.","validation.missing_if":"The {{attribute}} field must be missing when {{other}} is {{value}}.","validation.missing_unless":"The {{attribute}} field must be missing unless {{other}} is {{value}}.","validation.missing_with":"The {{attribute}} field must be missing when {{values}} is present.","validation.missing_with_all":"The {{attribute}} field must be missing when {{values}} are present.","validation.multiple_of":"The {{attribute}} must be a multiple of {{value}}.","validation.not_in":"The selected {{attribute}} is invalid.","validation.not_regex":"The {{attribute}} format is invalid.","validation.numeric":"The {{attribute}} must be a number.","validation.password.letters":"The {{attribute}} must contain at least one letter.","validation.password.mixed":"The {{attribute}} must contain at least one uppercase and one lowercase letter.","validation.password.numbers":"The {{attribute}} must contain at least one number.","validation.password.symbols":"The {{attribute}} must contain at least one symbol.","validation.password.uncompromised":"The given {{attribute}} has appeared in a data leak. Please choose a different {{attribute}}.","validation.present":"The {{attribute}} field must be present.","validation.prohibited":"The {{attribute}} field is prohibited.","validation.prohibited_if":"The {{attribute}} field is prohibited when {{other}} is {{value}}.","validation.prohibited_unless":"The {{attribute}} field is prohibited unless {{other}} is in {{values}}.","validation.prohibits":"The {{attribute}} field prohibits {{other}} from being present.","validation.regex":"The {{attribute}} format is invalid.","validation.required":"The {{attribute}} field is required.","validation.required_array_keys":"The {{attribute}} field must contain entries for: {{values}}.","validation.required_if":"The {{attribute}} field is required when {{other}} is {{value}}.","validation.required_if_accepted":"The {{attribute}} field is required when {{other}} is accepted.","validation.required_unless":"The {{attribute}} field is required unless {{other}} is in {{values}}.","validation.required_with":"The {{attribute}} field is required when {{values}} is present.","validation.required_with_all":"The {{attribute}} field is required when {{values}} are present.","validation.required_without":"The {{attribute}} field is required when {{values}} is not present.","validation.required_without_all":"The {{attribute}} field is required when none of {{values}} are present.","validation.same":"The {{attribute}} and {{other}} must match.","validation.size.array":"The {{attribute}} must contain {{size}} items.","validation.size.file":"The {{attribute}} must be {{size}} kilobytes.","validation.size.numeric":"The {{attribute}} must be {{size}}.","validation.size.string":"The {{attribute}} must be {{size}} characters.","validation.starts_with":"The {{attribute}} must start with one of the following: {{values}}.","validation.string":"The {{attribute}} must be a string.","validation.timezone":"The {{attribute}} must be a valid timezone.","validation.unique":"The {{attribute}} has already been taken.","validation.uploaded":"The {{attribute}} failed to upload.","validation.uppercase":"The {{attribute}} must be uppercase.","validation.url":"The {{attribute}} must be a valid URL.","validation.ulid":"The {{attribute}} must be a valid ULID.","validation.uuid":"The {{attribute}} must be a valid UUID.","validation.custom.attribute-name.rule-name":"custom-message","validation.unsupported_currency_code":"The currency code you provided is invalid or not supported.","validation.unsupported_period":"The period you provided is invalid or not supported.","validation.unsupported_token_symbol":"The token symbol you provided is invalid or not supported.","validation.gallery_title_required":"Gallery name is required.","validation.gallery_title_max_characters":"The gallery name should not exceed 50 characters.","validation.gallery_title_invalid":"The gallery name is invalid.","validation.nfts_required":"Please add at least one NFT.","validation.nfts_max_size":"Galleries can contain no more than {{limit}} NFTs","validation.invalid_nfts":"The NFT in position {{position}} is invalid, please select another one.","validation.invalid_cover":"You have selected an invalid cover image, please try another one."} \ No newline at end of file From a66efb45029e2f1c69dafb3b8e4865d0124e9ff1 Mon Sep 17 00:00:00 2001 From: Juan Patricio Marroquin Date: Mon, 20 Nov 2023 18:07:39 -0500 Subject: [PATCH 04/61] feat: update collection routes --- routes/web.php | 18 +++++++++++++----- 1 file changed, 13 insertions(+), 5 deletions(-) diff --git a/routes/web.php b/routes/web.php index e7b9b69ad..83e8e7c1e 100644 --- a/routes/web.php +++ b/routes/web.php @@ -13,6 +13,7 @@ use App\Http\Controllers\GeneralSettingsController; use App\Http\Controllers\HiddenCollectionController; use App\Http\Controllers\MetaImageController; +use App\Http\Controllers\MyCollectionsController; use App\Http\Controllers\MyGalleryCollectionController; use App\Http\Controllers\MyGalleryController; use App\Http\Controllers\NftController; @@ -86,11 +87,18 @@ Route::get('{article:slug}', [ArticleController::class, 'show'])->name('articles.view'); }); -Route::group(['prefix' => 'collections', 'middleware' => 'features:collections'], function () { - Route::get('', [CollectionController::class, 'index'])->name('collections')->middleware(EnsureOnboarded::class); - Route::get('{collection:slug}', [CollectionController::class, 'show'])->name('collections.view'); - Route::get('{collection:slug}/articles', [CollectionController::class, 'articles'])->name('collections.articles'); - Route::get('{collection:slug}/{nft:token_number}', [NftController::class, 'show'])->name('collection-nfts.view'); + +Route::group(['middleware' => 'features:collections'], function () { + Route::group(['prefix' => 'my-collections'], function() { + Route::get('', [MyCollectionsController::class, 'index'])->name('my-collections')->middleware(EnsureOnboarded::class); + }); + + Route::group(['prefix' => 'collections'], function () { + Route::get('', [CollectionController::class, 'index'])->name('collections'); + Route::get('{collection:slug}', [CollectionController::class, 'show'])->name('collections.view'); + Route::get('{collection:slug}/articles', [CollectionController::class, 'articles'])->name('collections.articles'); + Route::get('{collection:slug}/{nft:token_number}', [NftController::class, 'show'])->name('collection-nfts.view'); + }); }); Route::group(['prefix' => 'galleries', 'middleware' => 'features:galleries'], function () { From 7052ccc13c7b90f7bdbdf72ab1b7c1dfe9d3765b Mon Sep 17 00:00:00 2001 From: Juan Patricio Marroquin Date: Mon, 20 Nov 2023 18:07:56 -0500 Subject: [PATCH 05/61] feat: blank page for new collections page --- resources/js/Pages/Collections/Index.tsx | 207 +---------------------- 1 file changed, 2 insertions(+), 205 deletions(-) diff --git a/resources/js/Pages/Collections/Index.tsx b/resources/js/Pages/Collections/Index.tsx index f2aa98ace..2e3e5750b 100644 --- a/resources/js/Pages/Collections/Index.tsx +++ b/resources/js/Pages/Collections/Index.tsx @@ -1,215 +1,12 @@ -import { type PageProps } from "@inertiajs/core"; -import { Head, router, usePage } from "@inertiajs/react"; -import { useEffect, useState } from "react"; -import { useTranslation } from "react-i18next"; -import { useCollections } from "./Hooks"; -import { CollectionsGrid } from "@/Components/Collections/CollectionsGrid"; -import { CollectionsTable } from "@/Components/Collections/CollectionsTable"; -import { EmptyBlock } from "@/Components/EmptyBlock/EmptyBlock"; -import { useToasts } from "@/Hooks/useToasts"; +import { Head, usePage } from "@inertiajs/react"; import { DefaultLayout } from "@/Layouts/DefaultLayout"; -import { CollectionDisplayType, CollectionsFilter } from "@/Pages/Collections/Components/CollectionsFilter"; -import { CollectionsHeading } from "@/Pages/Collections/Components/CollectionsHeading"; -import { getQueryParameters } from "@/Utils/get-query-parameters"; -import { isTruthy } from "@/Utils/is-truthy"; -import { replaceUrlQuery } from "@/Utils/replace-url-query"; -const sort = ({ - sortBy, - direction, - selectedChainIds, -}: { - sortBy: string; - direction?: string; - selectedChainIds?: number[]; -}): void => { - router.get( - route("collections"), - { - ...getQueryParameters(), - sort: sortBy, - direction, - chain: isTruthy(selectedChainIds) && selectedChainIds.length > 0 ? selectedChainIds.join(",") : undefined, - }, - { - preserveState: false, - }, - ); -}; - -const CollectionsIndex = ({ - auth, - initialStats, - title, - sortBy = "received", - sortDirection, - selectedChainIds: initialSelectedChainIds, -}: { - title: string; - auth: PageProps["auth"]; - initialStats: App.Data.Collections.CollectionStatsData; - sortBy: string | null; - sortDirection: "asc" | "desc"; - selectedChainIds?: string[]; -}): JSX.Element => { +const CollectionsIndex = ({ title }: { title: string }): JSX.Element => { const { props } = usePage(); - const { t } = useTranslation(); - const queryParameters = getQueryParameters(); - - const [displayType, setDisplayType] = useState( - queryParameters.view === "grid" ? CollectionDisplayType.Grid : CollectionDisplayType.List, - ); - - const { showToast } = useToasts(); - - const showHidden = queryParameters.showHidden === "true"; - - const { - collections, - isLoading, - loadMore, - reload, - hiddenCollectionAddresses, - alreadyReportedByCollection, - reportByCollectionAvailableIn, - availableNetworks, - query, - stats, - search, - isSearching, - reportCollection, - selectedChainIds, - setSelectedChainIds, - } = useCollections({ - showHidden, - sortBy, - view: displayType, - initialStats, - onSearchError: () => { - showToast({ - message: t("pages.collections.search.error"), - type: "error", - }); - }, - initialSelectedChainIds, - }); - - const selectDisplayTypeHandler = (displayType: CollectionDisplayType): void => { - setDisplayType(displayType); - - replaceUrlQuery({ - view: displayType, - }); - }; - - const handleSelectedChainIds = (chainId: number): void => { - const chainIds = selectedChainIds.includes(chainId) - ? selectedChainIds.filter((id) => id !== chainId) - : [...selectedChainIds, chainId]; - - setSelectedChainIds(chainIds); - }; - - useEffect(() => { - if (!auth.authenticated) { - return; - } - - reload({ selectedChainIds }); - }, [selectedChainIds, auth.authenticated, auth.wallet?.address]); - return ( -
-
- - - { - reload({ showHidden: isHidden, selectedChainIds, page: 1 }); - }} - availableNetworks={availableNetworks} - handleSelectedChainIds={handleSelectedChainIds} - selectedChainIds={selectedChainIds} - collectionsCount={collections.length} - /> -
- -
- {!isLoading && collections.length === 0 && ( -
- {isSearching ? ( - {t("pages.collections.search.loading_results")} - ) : ( - <> - {query !== "" ? ( - {t("pages.collections.search.no_results")} - ) : ( - <> - {hiddenCollectionAddresses.length === 0 ? ( - {t("pages.collections.no_collections")} - ) : ( - {t("pages.collections.all_collections_hidden")} - )} - - )} - - )} -
- )} - - {displayType === CollectionDisplayType.List && ( - { - reload({ page: 1 }); - }} - onReportCollection={reportCollection} - selectedChainIds={selectedChainIds} - /> - )} - - {displayType === CollectionDisplayType.Grid && ( - - )} -
-
); }; From da452352b19287eabce6d2d33d62dba83796d7f2 Mon Sep 17 00:00:00 2001 From: Juan Patricio Marroquin Date: Mon, 20 Nov 2023 18:08:10 -0500 Subject: [PATCH 06/61] chore: update index method for collections page --- app/Http/Controllers/CollectionController.php | 98 ------------------- 1 file changed, 98 deletions(-) diff --git a/app/Http/Controllers/CollectionController.php b/app/Http/Controllers/CollectionController.php index 963927e61..d325bb414 100644 --- a/app/Http/Controllers/CollectionController.php +++ b/app/Http/Controllers/CollectionController.php @@ -41,107 +41,9 @@ class CollectionController extends Controller { public function index(Request $request): Response|JsonResponse|RedirectResponse { - $user = $request->user(); - - if ($user === null) { - return Inertia::render('Collections/Index', [ - 'title' => trans('metatags.collections.title'), - 'stats' => new CollectionStatsData( - nfts: 0, - collections: 0, - value: 0, - ), - 'sortBy' => null, - 'sortDirection' => 'desc', - 'showHidden' => false, - 'view' => 'list', - ]); - } - - $hiddenCollections = $user->hiddenCollections->pluck('address'); - $showHidden = $request->get('showHidden') === 'true'; - - $selectedChainIds = array_filter(explode(',', $request->get('chain', ''))); - $selectedChainIds = array_filter($selectedChainIds, fn ($id) => is_numeric($id)); - - if ($showHidden && $hiddenCollections->isEmpty()) { - return redirect()->route('collections', $request->except('showHidden')); - } - - $cache = new UserCache($user); - - $sortBy = in_array($request->query('sort'), ['oldest', 'received', 'name', 'floor-price', 'value', 'chain']) ? $request->query('sort') : null; - $defaultSortDirection = $sortBy === null ? 'desc' : 'asc'; - - $sortDirection = in_array($request->query('direction'), ['asc', 'desc']) ? $request->query('direction') : $defaultSortDirection; - $networks = NetworkWithCollectionsData::fromModel($user, $showHidden); - - $selectedChainIds = array_filter($selectedChainIds, function ($id) use ($networks) { - return $networks->firstWhere('chainId', $id)?->collectionsCount > 0; - }); - - if ($request->wantsJson()) { - $searchQuery = $request->get('query'); - - /** @var LengthAwarePaginator $collections */ - $collections = $user->collections() - ->when($showHidden, fn ($q) => $q->whereIn('collections.id', $user->hiddenCollections->modelKeys())) - ->when(! $showHidden, fn ($q) => $q->whereNotIn('collections.id', $user->hiddenCollections->modelKeys())) - ->when(count($selectedChainIds) > 0, fn ($q) => $q->whereIn('collections.network_id', Network::whereIn('chain_id', $selectedChainIds)->pluck('id'))) - ->when($sortBy === 'name', fn ($q) => $q->orderByName($sortDirection)) - ->when($sortBy === 'floor-price', fn ($q) => $q->orderByFloorPrice($sortDirection, $user->currency())) - ->when($sortBy === 'value', fn ($q) => $q->orderByValue($user->wallet, $sortDirection, $user->currency())) - ->when($sortBy === 'chain', fn ($q) => $q->orderByChainId($sortDirection)) - ->when($sortBy === 'oldest', fn ($q) => $q->orderByMintDate('asc')) - ->when($sortBy === 'received' || $sortBy === null, fn ($q) => $q->orderByReceivedDate($user->wallet, 'desc')) - ->search($user, $searchQuery) - ->with([ - 'reports', - 'network', - 'floorPriceToken', - 'nfts' => fn ($q) => $q->where('wallet_id', $user->wallet_id)->limit(4), - ]) - ->withCount(['nfts' => fn ($q) => $q->where('wallet_id', $user->wallet_id)]) - ->paginate(25); - - $reportByCollectionAvailableIn = $collections->mapWithKeys(function ($collection) use ($request) { - return [$collection->address => RateLimiterHelpers::collectionReportAvailableInHumanReadable($request, $collection)]; - }); - - $alreadyReportedByCollection = $collections->mapWithKeys(function ($collection) use ($user) { - return [$collection->address => $collection->wasReportedByUserRecently($user, useRelationship: true)]; - }); - - return new JsonResponse([ - 'collections' => CollectionData::collection( - $collections->through(fn ($collection) => CollectionData::fromModel($collection, $user->currency())) - ), - 'reportByCollectionAvailableIn' => $reportByCollectionAvailableIn, - 'alreadyReportedByCollection' => $alreadyReportedByCollection, - 'hiddenCollectionAddresses' => $hiddenCollections, - 'availableNetworks' => $networks, - 'selectedChainIds' => $selectedChainIds, - 'stats' => new CollectionStatsData( - nfts: $showHidden ? $cache->hiddenNftsCount() : $cache->shownNftsCount(), - collections: $showHidden ? $cache->hiddenCollectionsCount() : $cache->shownCollectionsCount(), - value: $user->collectionsValue($user->currency(), readFromDatabase: false, onlyHidden: $showHidden), - ), - ]); - } return Inertia::render('Collections/Index', [ 'title' => trans('metatags.collections.title'), - 'initialStats' => new CollectionStatsData( - nfts: $showHidden ? $cache->hiddenNftsCount() : $cache->shownNftsCount(), - collections: $showHidden ? $cache->hiddenCollectionsCount() : $cache->shownCollectionsCount(), - value: $user->collectionsValue($user->currency(), readFromDatabase: false, onlyHidden: $showHidden), - ), - 'sortBy' => $sortBy, - 'sortDirection' => $sortDirection, - 'showHidden' => $showHidden, - 'selectedChainIds' => $selectedChainIds, - 'view' => $request->get('view') === 'grid' ? 'grid' : 'list', - 'availableNetworks' => $networks, ]); } From 4ee7b5714e38e96bc8f6ee7381082160cd5b22a3 Mon Sep 17 00:00:00 2001 From: Juan Patricio Marroquin Date: Mon, 20 Nov 2023 18:14:43 -0500 Subject: [PATCH 07/61] fix: remove unused imports --- app/Http/Controllers/CollectionController.php | 6 ------ 1 file changed, 6 deletions(-) diff --git a/app/Http/Controllers/CollectionController.php b/app/Http/Controllers/CollectionController.php index d325bb414..1b7815072 100644 --- a/app/Http/Controllers/CollectionController.php +++ b/app/Http/Controllers/CollectionController.php @@ -6,13 +6,10 @@ use App\Data\Articles\ArticleData; use App\Data\Articles\ArticlesData; -use App\Data\Collections\CollectionData; use App\Data\Collections\CollectionDetailData; -use App\Data\Collections\CollectionStatsData; use App\Data\Collections\CollectionTraitFilterData; use App\Data\Gallery\GalleryNftData; use App\Data\Gallery\GalleryNftsData; -use App\Data\Network\NetworkWithCollectionsData; use App\Data\Nfts\NftActivitiesData; use App\Data\Nfts\NftActivityData; use App\Data\Token\TokenData; @@ -23,16 +20,13 @@ use App\Jobs\FetchCollectionBanner; use App\Jobs\SyncCollection; use App\Models\Collection; -use App\Models\Network; use App\Models\User; -use App\Support\Cache\UserCache; use App\Support\Queues; use App\Support\RateLimiterHelpers; use Carbon\Carbon; use Illuminate\Http\JsonResponse; use Illuminate\Http\RedirectResponse; use Illuminate\Http\Request; -use Illuminate\Pagination\LengthAwarePaginator; use Inertia\Inertia; use Inertia\Response; use Spatie\LaravelData\PaginatedDataCollection; From ac199c8085836e8eb83017092a0f8f5d217054e0 Mon Sep 17 00:00:00 2001 From: Juan Patricio Marroquin Date: Tue, 21 Nov 2023 07:32:40 -0500 Subject: [PATCH 08/61] feat: class names for gradient overlay --- resources/css/app.css | 15 +++++++++++++++ 1 file changed, 15 insertions(+) diff --git a/resources/css/app.css b/resources/css/app.css index e9ec32cc9..f6463e0fb 100644 --- a/resources/css/app.css +++ b/resources/css/app.css @@ -49,3 +49,18 @@ .dark .auth-overlay-shadow { box-shadow: 0px 15px 35px 0px rgba(18, 18, 19, 0.4); } + +.featured-collections-overlay { + background-image: linear-gradient( + 180deg, + rgb(var(--theme-color-primary-50)) 47.38%, + transparent 216.53% + ); +} + +.dark .featured-collections-overlay { + background-image: linear-gradient( + 181deg, + rgb(var(--theme-color-dark-800)) 41.03%, + transparent 208.87%); +} From d4cb7dbc5de80ca6d70fe885b0684f69e776595e Mon Sep 17 00:00:00 2001 From: Juan Patricio Marroquin Date: Tue, 21 Nov 2023 07:33:07 -0500 Subject: [PATCH 09/61] feat: CollectionFeaturedData data type --- .../Collections/CollectionFeaturedData.php | 74 +++++++++++++++++++ 1 file changed, 74 insertions(+) create mode 100644 app/Data/Collections/CollectionFeaturedData.php diff --git a/app/Data/Collections/CollectionFeaturedData.php b/app/Data/Collections/CollectionFeaturedData.php new file mode 100644 index 000000000..f5a406793 --- /dev/null +++ b/app/Data/Collections/CollectionFeaturedData.php @@ -0,0 +1,74 @@ + $nfts + */ + public function __construct( + public int $id, + public string $name, + public string $slug, + public string $address, + #[LiteralTypeScriptType('App.Enums.Chain')] + public int $chainId, + public ?string $floorPrice, + public ?float $floorPriceFiat, + public ?string $floorPriceCurrency, + public ?int $floorPriceDecimals, + #[WithTransformer(IpfsGatewayUrlTransformer::class)] + public ?string $image, + public ?string $banner, + public ?string $openSeaSlug, + public string $website, + public int $nftsCount, + #[DataCollectionOf(GalleryNftData::class)] + public DataCollection $nfts, + public bool $isFeatured, + public ?string $description, + public ?string $volume, + ) { + } + + public static function fromModel(Collection $collection, CurrencyCode $currency): self + { + return new self( + id: $collection->id, + name: $collection->name, + slug: $collection->slug, + address: $collection->address, + chainId: $collection->network->chain_id, + floorPrice: $collection->floor_price, + floorPriceFiat: (float) $collection->fiatValue($currency), + floorPriceCurrency: $collection->floorPriceToken ? Str::lower($collection->floorPriceToken->symbol) : null, + floorPriceDecimals: $collection->floorPriceToken?->decimals, + image: $collection->extra_attributes->get('image'), + banner: $collection->extra_attributes->get('banner'), + openSeaSlug: $collection->extra_attributes->get('opensea_slug'), + website: $collection->website(), + nftsCount: $collection->nfts_count, + nfts: GalleryNftData::collection($collection->nfts), + isFeatured: $collection->is_featured, + description: $collection->description, + volume: $collection->volume, + ); + } +} From 5a8e935a1eac9613fdbe401ff9d5a125f429a34b Mon Sep 17 00:00:00 2001 From: Juan Patricio Marroquin Date: Tue, 21 Nov 2023 07:33:19 -0500 Subject: [PATCH 10/61] chore: update generated.d.ts --- resources/types/generated.d.ts | 20 ++++++++++++++++++++ 1 file changed, 20 insertions(+) diff --git a/resources/types/generated.d.ts b/resources/types/generated.d.ts index 68518472d..f1aa7f0d2 100644 --- a/resources/types/generated.d.ts +++ b/resources/types/generated.d.ts @@ -176,6 +176,26 @@ declare namespace App.Data.Collections { activityUpdateRequestedAt: string | null; isFetchingActivity: boolean | null; }; + export type CollectionFeaturedData = { + id: number; + name: string; + slug: string; + address: string; + chainId: App.Enums.Chain; + floorPrice: string | null; + floorPriceFiat: number | null; + floorPriceCurrency: string | null; + floorPriceDecimals: number | null; + image: string | null; + banner: string | null; + openSeaSlug: string | null; + website: string; + nftsCount: number; + nfts: Array; + isFeatured: boolean; + description: string | null; + volume: string | null; + }; export type CollectionNftData = { id: number; collectionId: number; From 541cb533e70deb5d0daefddd0aaeff4720a31673 Mon Sep 17 00:00:00 2001 From: Juan Patricio Marroquin Date: Tue, 21 Nov 2023 07:33:38 -0500 Subject: [PATCH 11/61] chore: update language file --- lang/en/pages.php | 4 ++++ resources/js/I18n/Locales/en.json | 2 +- 2 files changed, 5 insertions(+), 1 deletion(-) diff --git a/lang/en/pages.php b/lang/en/pages.php index 3555a274f..59e253119 100644 --- a/lang/en/pages.php +++ b/lang/en/pages.php @@ -120,6 +120,10 @@ 'notice_wait' => 'Please wait. You can refresh data every 15 minutes.', 'toast' => "We're updating information for your collection.", ], + 'featured' => [ + 'title' => 'Featured Collections', + 'button' => 'Explore Collection', + ] ], 'nfts' => [ diff --git a/resources/js/I18n/Locales/en.json b/resources/js/I18n/Locales/en.json index f57add3ff..fe7444844 100644 --- a/resources/js/I18n/Locales/en.json +++ b/resources/js/I18n/Locales/en.json @@ -1 +1 @@ -{"auth.welcome":"Welcome to Dashbrd","auth.logged_in":"You're logged in!","auth.log_out":"Log out","auth.failed":"These credentials do not match our records.","auth.session_timeout":"Your session has timed out. Please refresh the page and try connecting your account again.","auth.session_timeout_modal":"Seems like your session has timed out. Please connnect your wallet again.","auth.password":"The provided password is incorrect.","auth.throttle":"Too many login attempts. Please try again in {{seconds}} seconds.","auth.wallet.connecting":"Connecting …","auth.wallet.waiting_for_signature":"Waiting for Signature …","auth.wallet.switching_wallet":"Switching Wallet …","auth.wallet.connect":"Connect Wallet","auth.wallet.connect_long":"Connect Your Wallet to Get Started","auth.wallet.sign_subtitle":"Connect Your Wallet to Continue","auth.wallet.disconnect":"Disconnect Wallet","auth.wallet.install":"Install MetaMask","auth.wallet.install_long":"Install MetaMask to Get Started","auth.wallet.sign":"Sign Message","auth.wallet.sign_message":"Welcome to Dashbrd. In order to login, sign this message with your wallet. It doesn't cost you anything!\n\nSigning ID (you can ignore this): {{nonce}}","auth.wallet.connect_subtitle":"Click on the MetaMask icon in your browser to confirm the action and connect your wallet.","auth.wallet.requires_signature":"In order to prevent impersonation, we require a signature to perform this action. This signature is only a signed message and does not give any access to your wallet.","auth.errors.metamask.no_account":"No account found. Please connect your wallet and try again.","auth.errors.metamask.generic":"Connection attempt error. Please retry and follow the steps to connect your wallet.","auth.errors.metamask.invalid_network":"Please switch to Polygon or Ethereum Mainnet in your MetaMask plugin to connect to Dashbrd.","auth.errors.metamask.provider_missing":"You don't have MetaMask installed in your browser. Please install and try again.","auth.errors.metamask.user_rejected":"It looks like you cancelled signing of the authentication message. Please try again.","auth.errors.metamask.provider_not_set":"Ethereum provider is not set","auth.validation.wallet_login_failed":"There was a problem trying to verify your signature. Please try again.","auth.validation.invalid_address":"Your wallet address is invalid. Please try again.","auth.validation.invalid_signature":"Signature is invalid. Please try again.","auth.validation.invalid_network":"Please switch to Polygon or Ethereum Mainnet in your MetaMask plugin to connect to Dashbrd.","common.author":"Author","common.add":"Add","common.amount":"Amount","common.balance":"Balance","common.cancel":"Cancel","common.delete":"Delete","common.edit":"Edit","common.confirm":"Confirm","common.connect":"Connect","common.continue":"Continue","common.done":"Done","common.filter":"Filter","common.items":"Items","common.receive":"Receive","common.received":"Received","common.retry":"Retry","common.records":"Records","common.save":"Save","common.send":"Send","common.sent":"Sent","common.show":"Show","common.searching":"Searching...","common.other":"Other","common.owned":"Owned","common.token":"Token","common.tokens":"Tokens","common.wallet":"Wallet","common.pending":"Pending","common.publish":"Publish","common.published":"Published","common.empty":"Empty","common.your_address":"Your Address","common.warning":"Warning","common.my_address":"My Address","common.my_wallet":"My Wallet","common.my_balance":"My Balance","common.na":"N/A","common.simple_plural_without_data":"One comment|Many comments","common.simple_plural_with_data":"{{count}} comment|{{count}} comments","common.advanced_plural_without_data":"{0} no comments yet|{1} 1 comment|[2,*] Many comments","common.advanced_plural_with_data":"{0} no comments yet|{1} 1 comment|[2,*] {{count}} comments","common.copy_clipboard":"Copy to Clipboard","common.copy":"Copy","common.download":"Download","common.zoom":"Zoom","common.my_collection":"My Collection","common.max":"Max","common.chain":"Chain","common.copied":"Copied!","common.coming_soon":"Coming Soon","common.more_details":"More Details","common.close":"Close","common.close_toast":"Close toast","common.loading":"Loading","common.price":"Price","common.articles":"Articles","common.most_popular":"Most Popular","common.market_cap":"Market Cap","common.volume":"Volume {{frequency}}","common.value":"Value","common.last_n_days":"Last {{count}} Days","common.details":"Details","common.view_all":"View All","common.view_more_on_polygonscan":"View More on Polygonscan","common.view_more_on_etherscan":"View More on Etherscan","common.view_nft_on_etherscan":"View NFT on Etherscan","common.view_nft_on_polygonscan":"View NFT on Polygonscan","common.view_nft_on_goerli_tesnet":"View NFT on Goerli Testnet Explorer","common.view_nft_on_mumbai_tesnet":"View NFT on Mumbai Testnet Explorer","common.polygonscan":"Polygonscan","common.etherscan":"Etherscan","common.featured":"Featured","common.floor_price":"Floor Price","common.floor":"Floor","common.supply":"Supply","common.owners":"Owners","common.created":"Created","common.nft":"NFT","common.collection":"Collection","common.collections":"Collections","common.gallery":"Gallery","common.basic_gallery":"Basic Gallery","common.gallery_name":"Gallery Name","common.create_gallery":"Create Gallery","common.external_link":"External Link","common.follow_link":"Follow Link","common.cover":"Cover","common.template":"Template","common.page":"Page","common.polygon":"Polygon","common.ethereum":"Ethereum","common.mumbai":"Mumbai","common.goerli":"Goerli","common.of":"of","common.pagination_input_placeholder":"Enter the page number","common.pagination_input_placeholder_mobile":"Page number","common.nft_count":"{0} {{count}} NFTs|{1} {{count}} NFT|[2,*] {{count}} NFTs","common.nft_gallery":"NFT Gallery","common.unable_to_retrieve_image":"Unable to retrieve your NFT image at this time","common.optional":"Optional","common.selected":"Selected","common.select":"Select","common.preview":"Preview","common.image_size_error":"Image size must not exceed 2MB","common.image_dimensions_error":"Image dimensions must exceed 287px x 190px","common.write_to_confirm":"Write {{word}} to confirm","common.n_hours":"{0} {{count}} hour|{1} {{count}} hour|[2,*] {{count}} hours","common.n_minutes":"{0} {{count}} minute|{1} {{count}} minute|[2,*] {{count}} minutes","common.report":"Report","common.n_nfts":"{0}NFTs|{1}NFT|[2,*]NFTs","common.n_collections":"{0}collections|{1}collection|[2,*]collections","common.back":"Back","common.back_to":"Back to","common.name":"Name","common.type":"Type","common.from":"From","common.to":"To","common.sale_price":"Sale Price","common.recent_activity":"Recent Activity","common.time":"Time","common.datetime.few_seconds_ago":"A few seconds ago","common.datetime.minutes_ago":"{0} Less than a minute ago|{1} A minute ago|[2,*] {{count}} minutes ago","common.datetime.hours_ago":"{0} Less than an hour ago|{1} An hour ago|[2,*] {{count}} hours ago","common.datetime.days_ago":"{0} Less than a day ago|{1} A day ago|[2,*] {{count}} days ago","common.datetime.weeks_ago":"{0} Less than a week ago|{1} A week ago|[2,*] {{count}} weeks ago","common.datetime.months_ago":"{0} Less than a month ago|{1} A month ago|[2,*] {{count}} months ago","common.datetime.years_ago":"{0} Less than a year ago|{1} A year ago|[2,*] {{count}} years ago","common.no_traits_found":"No traits found.","common.empty_transactions":"You don't have any transactions yet. Once transactions have been made, they will show up here.","common.error":"Error","common.refresh":"Refresh","common.refresh_metadata":"Refresh Metadata","common.refreshing_metadata":"Refreshing Metadata... Please check back later.","common.refreshing_activity":"Refreshing Activity... Please check back later.","common.pending_confirmation":"Pending Confirmation","common.confirmed_transaction":"Confirmed Transaction","common.transaction_error":"Transaction Error","common.transaction_error_description_first_part":"Your transaction encountered an error. View this transaction on","common.transaction_error_description_second_part":"for more details.","common.home":"Home","common.contact":"Contact","common.menu":"Menu","common.website":"Website","common.twitter":"Twitter","common.discord":"Discord","common.facebook":"Facebook","common.reddit":"Reddit","common.x":"X","common.sort":"Sort","common.drafts":"Drafts","common.draft":"Draft","common.delete_draft":"Delete Draft","common.share_on":"Share on {{platform}}","footer.copyright":"{{year}} © Dashbrd. All rights reserved.","footer.all_rights_reserved":"All rights reserved","footer.privacy_policy":"Privacy Policy","footer.terms_of_service":"Terms of Service","footer.powered_by":"Powered by","format.fiat":"{{ value, currency }}","format.number":"{{ value, number }}","metatags.home.title":"Dashbrd | Web3 Portfolio Management Made Simple","metatags.home.description":"Simplify your Web3 journey with Dashbrd. Manage your portfolio of tokens, NFTs, and other digital collectibles across the Ethereum and Polygon blockchains.","metatags.home.image":"/images/meta/home.png","metatags.error.title":"Error {{code}} | Dashbrd","metatags.wallet.title":"My Wallet | Dashbrd","metatags.galleries.title":"Top NFT Galleries | Dashbrd","metatags.galleries.image":"/images/meta/nft-galleries.png","metatags.galleries.description":"Explore user published NFT galleries to find custom curated PFPs, Digital Collectibles, & More.","metatags.galleries.most_popular.title":"Most Popular Galleries | Dashbrd","metatags.galleries.most_popular.image":"/images/meta/most-popular-nft-galleries.png","metatags.galleries.most_popular.description":"Explore and discover Most Popular NFT Galleries created by our users featuring custom curated PFPs, Digital Collectibles, & More.","metatags.galleries.newest.title":"Newest Galleries | Dashbrd","metatags.galleries.newest.image":"/images/meta/newest-nft-galleries.png","metatags.galleries.newest.description":"Explore and discover most recent NFT galleries created by our users featuring custom curated PFPs, Digital Collectibles, & More","metatags.galleries.most_valuable.title":"Most Valuable Galleries | Dashbrd","metatags.galleries.most_valuable.image":"/images/meta/most-valuable-nft-galleries.png","metatags.galleries.most_valuable.description":"Explore and discover Most Valuable NFT Galleries created by our users featuring custom curated PFPs, Digital Collectibles, & More.","metatags.galleries.view.title":"{{name}} | Dashbrd","metatags.galleries.view.description":"{{name}} | A Curated NFT Gallery at Dashbrd","metatags.galleries.view.image":"/images/meta/nft-gallery.png","metatags.my_galleries.title":"My Galleries | Dashbrd","metatags.my_galleries.title_draft":"My Draft Galleries | Dashbrd","metatags.my_galleries.create.title":"Create Gallery | Dashbrd","metatags.my_galleries.edit.title":"Edit {{name}} | Dashbrd","metatags.collections.title":"Collections | Dashbrd","metatags.collections.view.title":"{{name}} Collection | Dashbrd","metatags.collections.view.description":"Immerse yourself in the intricate details of {{name}} collection, featuring remarkable digital assets. Start your NFT journey today!","metatags.collections.view.image":"/images/meta/nft-collection.png","metatags.my-collections.title":"My Collections | Dashbrd","metatags.nfts.view.title":"{{nft}} NFT | Dashbrd","metatags.nfts.view.description":"Uncover the complete story of {{nft}} NFT from the {{collection}} collection, delving into its unique attributes and distinctive features.","metatags.nfts.view.image":"/images/meta/nft-details.png","metatags.settings.title":"Settings | Dashbrd","metatags.articles.title":"Articles | Dashbrd","metatags.articles.view.title":"{{title}} | Dashbrd","metatags.login.title":"Login | Dashbrd","metatags.privacy_policy.title":"Privacy Policy | Dashbrd","metatags.privacy_policy.description":"Dashbrd’s privacy policy outlines the information we collect and explains your choices surrounding how we use information about you.","metatags.terms_of_service.title":"Terms of Service | Dashbrd","metatags.terms_of_service.description":"These Terms of Service cover your use and access to services, products or websites of Dashbrd.","metatags.cookie_policy.title":"Cookie Policy | Dashbrd","metatags.cookie_policy.description":"Dashbrd uses cookies to make the website more user-friendly. Find out about the main types of cookies we use, and what we use them for.","metatags.welcome.title":"Welcome to Dashbrd | Web3 Simplified","pages.onboarding.title":"Get Started","pages.onboarding.heading":"Your monkeys were bored and ran off, we are trying to round them up.","pages.onboarding.message":"We are setting up your account. This process usually takes just a few minutes, but can take up to 15 minutes.","pages.error.heading":"Oops, something went wrong ...","pages.error.message":"Please try again or get in touch if the issue persists.","pages.maintenance.title":"Dashbrd is currently down for scheduled maintenance.","pages.maintenance.description":"We expect to be back soon. Thanks for your patience.","pages.dashboard.title":"My Wallet","pages.dashboard.breakdown.title":"Portfolio Breakdown","pages.dashboard.line_chart.data_error":"Could not load chart data","pages.articles.title":"Articles","pages.articles.featured_collections":"Featured Collections","pages.articles.placeholder_more_soon":"More Soon","pages.articles.no_articles":"No articles have been published yet. Please check back later!","pages.articles.header_title":"Explore our collection of","pages.articles.header_suffix_one":"published article","pages.articles.header_suffix_other":"published articles","pages.articles.audio_version":"Audio version","pages.articles.consists_of_collections":"{0} This article highlights {{count}} collections|{1} This article highlights {{count}} collection|[2,*] This article highlights {{count}} collections","pages.collections.title":"Collections","pages.collections.collections":"Collections","pages.collections.collection_value":"Collection Value","pages.collections.nfts_owned":"NFTs Owned","pages.collections.header_title":"You own <0>{{nftsCount}} {{nfts}} across <0>{{collectionsCount}} {{collections}}, worth about <0><1>{{worth}}","pages.collections.search_placeholder":"Search by Collection","pages.collections.properties":"Properties","pages.collections.collections_network":"Collections Network","pages.collections.property_search_placeholder":"Feature Search","pages.collections.floor_price":"Floor Price","pages.collections.value":"Value","pages.collections.rarity":"Rarity","pages.collections.report":"Report","pages.collections.hide_collection":"Hide Collection","pages.collections.unhide_collection":"Unhide Collection","pages.collections.no_collections":"You do not own any NFTs yet. Once you do they will be shown here.","pages.collections.all_collections_hidden":"You have hidden all your collections. Unhide and they will appear here.","pages.collections.about_collection":"About Collection","pages.collections.show_hidden":"Show Hidden","pages.collections.show_my_collection":"Show My Collection","pages.collections.owned":"Owned","pages.collections.activities.loading_activities":"We're fetching Activity for this NFT, please hang tight, this can take a while.","pages.collections.activities.loading_activities_collection":"We're fetching Activity for this collection, please hang tight, this can take a while.","pages.collections.activities.ignores_activities":"We don't support activity history for this collection yet.","pages.collections.activities.no_activity":"This collection does not have any activity yet.","pages.collections.activities.types.LABEL_MINT":"Mint","pages.collections.activities.types.LABEL_TRANSFER":"Transfer","pages.collections.activities.types.LABEL_SALE":"Sale","pages.collections.articles.no_articles":"No articles have been linked to this collection as of now.","pages.collections.articles.no_articles_with_filters":"We could not find any articles matching your search criteria, please try again!","pages.collections.articles.search_placeholder":"Search in Articles","pages.collections.articles.sort_latest":"Latest","pages.collections.articles.sort_popularity":"Most Popular","pages.collections.search.loading_results":"Loading results...","pages.collections.search.no_results":"We could not find anything matching your search criteria, please try again!","pages.collections.search.no_results_with_filters":"We could not find anything matching your filters, please try again!","pages.collections.search.no_results_ownership":"You do not own any NFTs in this collection","pages.collections.search.error":"Could not load search results. Please try again later.","pages.collections.sorting.token_number":"Token Number","pages.collections.sorting.recently_received":"Recently Received","pages.collections.sorting.recently_created":"Recently Created","pages.collections.sorting.oldest_collection":"Oldest Collection","pages.collections.traits.description":"List of NFT traits by % of occurrence in the collection","pages.collections.traits.no_traits":"No Properties can be found for this NFT","pages.collections.menu.collection":"Collection","pages.collections.menu.articles":"Articles","pages.collections.menu.activity":"Activity","pages.collections.hidden_modal.collection_hidden":"Collection Hidden","pages.collections.hidden_modal.description":"This collection is currently set to Hidden. Are you sure you want to unhide this collection? You can\n reset the collection to hidden from the collection menu.","pages.collections.hidden_modal.unhide":"Unhide","pages.collections.hidden_modal.error":"Something went wrong. Please try again.","pages.collections.external_modal.you_wish_continue":"You are about to leave Dashbrd to an external website. Dashbrd has no control over the content of\n this site. Are you sure you wish to continue?","pages.collections.external_modal.not_show":"Do not show this message again.","pages.collections.refresh.title":"Refresh your collection","pages.collections.refresh.notice":"You can refresh data every 15 minutes.","pages.collections.refresh.notice_wait":"Please wait. You can refresh data every 15 minutes.","pages.collections.refresh.toast":"We're updating information for your collection.","pages.nfts.nft":"nft","pages.nfts.about_nft":"About NFT","pages.nfts.owned_by":"Owned by","pages.nfts.collection_image":"collection image","pages.nfts.menu.properties":"Properties","pages.nfts.menu.activity":"Activity","pages.reports.title":"Submit a Report","pages.reports.description":"Thanks for looking out by reporting things that break the rules. Let us know what's happening and we'll receive the report.","pages.reports.success":"Thank you for your report. We'll review it and see if it breaks our ToS.","pages.reports.failed":"Something went wrong. Please try again.","pages.reports.throttle":"You have made too many requests. Please wait {{time}} before reporting again.","pages.reports.reported":"You have already reported this {{model}}.","pages.reports.reasons.spam":"Spam","pages.reports.reasons.violence":"Promoting Violence","pages.reports.reasons.hate":"Hate","pages.reports.reasons.inappropriate_content":"Inappropriate Content","pages.reports.reasons.impersonation":"Impersonation","pages.reports.reasons.trademark":"Trademark or Copyright","pages.reports.reasons.selfharm":"Self-Harm","pages.reports.reasons.harassment":"Harassment","pages.galleries.title":"Galleries","pages.galleries.empty_title":"No galleries have been published yet. Once they do they will appear here.","pages.galleries.search.loading_results":"Loading results...","pages.galleries.search.no_results":"We could not find anything matching your search criteria, please try again!","pages.galleries.search.placeholder":"Search by name or curator address","pages.galleries.search.placeholder_nfts":"Search by NFTs","pages.galleries.search.error":"Could not load search results. Please try again later.","pages.galleries.my_galleries.title":"My Galleries","pages.galleries.my_galleries.subtitle":"Manage your galleries","pages.galleries.my_galleries.new_gallery":"New Gallery","pages.galleries.my_galleries.no_galleries":"You have not created any galleries yet. To create a gallery, click on the \"Create Gallery\" button.","pages.galleries.my_galleries.no_draft_galleries":"You have no draft galleries yet. To create a gallery, click on the \"Create Gallery\" button.","pages.galleries.my_galleries.succesfully_deleted":"Gallery has been successfully removed","pages.galleries.my_galleries.draft_succesfully_deleted":"Draft has been successfully removed","pages.galleries.my_galleries.successfully_created":"Gallery has been successfully created","pages.galleries.my_galleries.successfully_updated":"Gallery has been successfully updated","pages.galleries.my_galleries.new_gallery_no_nfts":"Creating a Gallery requires you to own an NFT.","pages.galleries.my_galleries.delete_modal.title":"Delete Draft","pages.galleries.my_galleries.delete_modal.text":"Are you sure you want to delete the draft? Everything you've done will be deleted and you won't be able to get it back.","pages.galleries.my_galleries.nfts_no_longer_owned":"NFTs no longer owned by this wallet have been removed from the draft”","pages.galleries.copy_gallery_link":"Copy Gallery Link","pages.galleries.my_nfts":"My NFTs","pages.galleries.value":"Value","pages.galleries.floor_price":"Floor Price","pages.galleries.nfts":"NFTs","pages.galleries.collections":"Collections","pages.galleries.galleries_count_simple":"{0} galleries|{1} gallery|[2,*] galleries","pages.galleries.galleries_count":"{0} {{count}} Galleries|{1} {{count}} Gallery|[2,*] {{count}} Galleries","pages.galleries.collections_count_simple":"{0} collections|{1} collection|[2,*] collections","pages.galleries.collections_count":"{0} {{count}} Collections|{1} {{count}} Collection|[2,*] {{count}} Collections","pages.galleries.nfts_count_simple":"{0} NFTs|{1} NFT|[2,*] NFTs","pages.galleries.nfts_count":"{0} {{count}} NFTs|{1} {{count}} NFT|[2,*] {{count}} NFTs","pages.galleries.users_count_simple":"{0} users|{1} user|[2,*] users","pages.galleries.users_count":"{0} {{count}} Users|{1} {{count}} User|[2,*] {{count}} Users","pages.galleries.featuring":"Featuring","pages.galleries.curated_by":"Curated by","pages.galleries.worth_about":"Worth About","pages.galleries.valued_at":"valued at","pages.galleries.from":"From","pages.galleries.most_popular_galleries":"Most Popular Galleries","pages.galleries.newest_galleries":"Newest Galleries","pages.galleries.most_valuable_galleries":"Most Valuable Galleries","pages.galleries.most_popular":"Most Popular","pages.galleries.newest":"Newest","pages.galleries.most_valuable":"Most Valuable","pages.galleries.create.search_by_nfts":"Search by NFTs","pages.galleries.create.input_placeholder":"Enter gallery name","pages.galleries.create.title_too_long":"Gallery name must not exceed {{max}} characters.","pages.galleries.create.already_selected_nft":"NFT already exists in this gallery","pages.galleries.create.nft_missing_image":"Only NFTs with images can be added to galleries","pages.galleries.create.nft_gallery_limit":"You can only add 16 NFTs per gallery","pages.galleries.create.gallery_cover":"Gallery Cover","pages.galleries.create.gallery_cover_description":"The cover is used for the card on the gallery list page. While the cover is not a requirement it will allow you to add personality and stand out from the crowd.","pages.galleries.create.gallery_cover_information":"Image dimensions must be at least 287px x 190px, with a max size of 2 MB (JPG, PNG or GIF)","pages.galleries.create.no_results":"We could not find anything matching your search criteria, please try again!","pages.galleries.create.templates.cover":"Cover","pages.galleries.create.templates.template":"Template","pages.galleries.create.templates.select":"Select Gallery Template","pages.galleries.create.templates.basic":"Basic Gallery","pages.galleries.create.templates.coming_soon":"More Coming Soon","pages.galleries.create.load_more_collections_one":"Load {{count}} More Collection","pages.galleries.create.load_more_collections_other":"Load {{count}} More Collections","pages.galleries.create.load_more_nfts":"Load More NFTs","pages.galleries.create.can_purchase":"You can purchase NFTs with these top NFT Marketplaces:","pages.galleries.create.must_own_one_nft":"You must own at least one (1) NFT in order to create a gallery.","pages.galleries.create.back_to_galleries":"Back to Galleries","pages.galleries.create.draft_saved":"Draft Saved","pages.galleries.create.saving_to_draft":"Saving to draft","pages.galleries.create.drafts_limit_modal_title":"Draft Gallery Limit","pages.galleries.create.drafts_limit_modal_message":"You’ve hit your limit for draft galleries. While you can still make new galleries and publish them, they won’t be saved as drafts. To Free up space, you can either delete existing drafts or publish them.","pages.galleries.create.drafts_limit_modal_cancel":"Go to Drafts","pages.galleries.delete_modal.title":"Delete Gallery","pages.galleries.delete_modal.confirmation_text":"Are you sure you want to delete the gallery? Deleting a Gallery is permanent, all associated views and likes will be lost.","pages.galleries.consists_of_collections":"{0} This gallery consists of {{count}} collections|{1} This gallery consists of {{count}} collection|[2,*] This gallery consists of {{count}} collections","pages.galleries.guest_banner.title":"Craft the ultimate","pages.galleries.guest_banner.subtitle":"Pick your favorites, curate your gallery, & share it with the world.","pages.profile.title":"Profile","pages.token_panel.balance_tooltip":"Total percentage of the portfolio held in this token","pages.token_panel.insufficient_funds":"Insufficient Balance","pages.token_panel.error":"Dashbrd has failed to load token information. Please try again later.","pages.token_panel.failed_to_retrieve_transactions":"We were unable to fetch your transactions.","pages.token_panel.tabs.transaction_history":"Transaction History","pages.token_panel.tabs.history":"History","pages.token_panel.tabs.market_data":"Market Data","pages.token_panel.details.current_price":"Current Price","pages.token_panel.details.title":"Token Details","pages.token_panel.details.market_cap":"Market Cap","pages.token_panel.details.volume":"Daily Volume","pages.token_panel.details.supply":"Minted Supply","pages.token_panel.details.ath":"All-Time High","pages.token_panel.details.atl":"All-Time Low","pages.token_panel.chart.failed":"Dashbrd has failed to load chart information. Please try again later.","pages.transaction_details_panel.title":"Transaction Details","pages.transaction_details_panel.details.blockchain":"Blockchain","pages.transaction_details_panel.details.timestamp":"Timestamp","pages.transaction_details_panel.details.transaction_hash":"Transaction Hash","pages.transaction_details_panel.details.transaction_fee":"Transaction Fee","pages.transaction_details_panel.details.gas_price":"Gas Price","pages.transaction_details_panel.details.gas_used":"Gas Used","pages.transaction_details_panel.details.nonce":"Nonce","pages.send_receive_panel.send.labels.token_and_amount":"Token and Amount","pages.send_receive_panel.send.labels.destination_address":"Destination Address","pages.send_receive_panel.send.labels.projected_fee":"Projected Fee","pages.send_receive_panel.send.placeholders.enter_amount":"Enter Amount","pages.send_receive_panel.send.placeholders.insert_recipient_address":"Insert Recipient Address","pages.send_receive_panel.send.placeholders.projected_fee":"Projected Fee","pages.send_receive_panel.send.errors.amount":"Insufficient Funds: You do not have enough to cover the amount + fee.","pages.send_receive_panel.send.errors.destination":"Destination address is not correct. Check and input again.","pages.send_receive_panel.send.hints.token_price":"Token Price","pages.send_receive_panel.send.fees.Fast":"Fast","pages.send_receive_panel.send.fees.Avg":"Avg","pages.send_receive_panel.send.fees.Slow":"Slow","pages.send_receive_panel.send.search_dropdown.placeholder":"Search token","pages.send_receive_panel.send.search_dropdown.no_results":"No Results","pages.send_receive_panel.send.search_dropdown.error":"Error occurred while searching tokens.","pages.send_receive_panel.send.transaction_time":"Transaction Time: ~{{ time }} minutes","pages.send_receive_panel.send.from":"From","pages.send_receive_panel.send.to":"To","pages.send_receive_panel.send.amount":"Amount","pages.send_receive_panel.send.fee":"Fee","pages.send_receive_panel.send.total_amount":"Total Amount","pages.send_receive_panel.send.waiting_message":"Review and verify the information on your MetaMask. Sign to send the transaction.","pages.send_receive_panel.send.waiting_spinner_text":"Waiting for confirmation...","pages.send_receive_panel.send.failed_message":"It looks like something went wrong while sending your transaction. Press 'Retry' to make another attempt.","pages.send_receive_panel.receive.alert":"Send only Polygon or Ethereum Network compatible tokens to this address or you could permanently lose your funds!","pages.settings.title":"Settings","pages.settings.sidebar.general":"General","pages.settings.sidebar.notifications":"Notifications","pages.settings.sidebar.session_history":"Sessions History","pages.settings.general.title":"Settings","pages.settings.general.subtitle":"Customize your App Experience","pages.settings.general.currency":"Currency","pages.settings.general.currency_subtitle":"Select your default currency which will be used throughout the app.","pages.settings.general.time_date":"Time & Date","pages.settings.general.time_date_subtitle":"Select how you want time and date be shown inside app.","pages.settings.general.date_format":"Date Format","pages.settings.general.time_format":"Time Format","pages.settings.general.timezone":"Timezone","pages.settings.general.set_defaults":"Set Defaults","pages.settings.general.set_defaults_content":"Reverting to the default settings will remove any customizations previously made. Are you sure?","pages.settings.general.save":"Save Settings","pages.settings.general.saved":"Your settings have been successfully saved","pages.wallet.title":"Wallet","pages.privacy_policy.title":"Privacy Policy","pages.terms_of_service.title":"Terms of Service","pagination.previous":"« Previous","pagination.next":"Next »","passwords.reset":"Your password has been reset!","passwords.sent":"We have emailed your password reset link!","passwords.throttled":"Please wait before retrying.","passwords.token":"This password reset token is invalid.","passwords.user":"We can't find a user with that email address.","urls.landing":"https://dashbrd.com","urls.cookie_policy":"https://dashbrd.com/cookie-policy","urls.privacy_policy":"https://dashbrd.com/privacy-policy","urls.terms_of_service":"https://dashbrd.com/terms-of-service","urls.twitter":"https://x.com/DashbrdApp","urls.discord":"https://discord.gg/MJyWKkCJ5k","urls.github":"https://github.com/ArdentHQ/dashbrd","urls.coingecko":"https://www.coingecko.com","urls.etherscan":"https://etherscan.io","urls.polygonscan":"https://polygonscan.com","urls.alchemy":"https://www.alchemy.com","urls.moralis":"https://moralis.io","urls.mnemonic":"https://www.mnemonichq.com","urls.opensea":"https://opensea.io/","urls.explorers.etherscan.token_transactions":"https://etherscan.io/token/{{token}}?a={{address}}","urls.explorers.etherscan.addresses":"https://etherscan.io/address/{{address}}","urls.explorers.etherscan.transactions":"https://etherscan.io/tx/{{id}}","urls.explorers.etherscan.nft":"https://etherscan.io/nft/{{address}}/{{nftId}}","urls.explorers.polygonscan.token_transactions":"https://polygonscan.com/token/{{token}}?a={{address}}","urls.explorers.polygonscan.addresses":"https://polygonscan.com/address/{{address}}","urls.explorers.polygonscan.transactions":"https://polygonscan.com/tx/{{id}}","urls.explorers.polygonscan.nft":"https://polygonscan.com/nft/{{address}}/{{nftId}}","urls.explorers.mumbai.token_transactions":"https://mumbai.polygonscan.com/token/{{token}}?a={{address}}","urls.explorers.mumbai.addresses":"https://mumbai.polygonscan.com/address/{{address}}","urls.explorers.mumbai.transactions":"https://mumbai.polygonscan.com/tx/{{id}}","urls.explorers.mumbai.nft":"https://mumbai.polygonscan.com/nft/{{address}}/{{nftId}}","urls.explorers.goerli.token_transactions":"https://goerli.etherscan.io/token/{{token}}?a={{address}}","urls.explorers.goerli.addresses":"https://goerli.etherscan.io/address/{{address}}","urls.explorers.goerli.transactions":"https://goerli.etherscan.io/tx/{{id}}","urls.explorers.goerli.nft":"https://goerli.etherscan.io/nft/{{address}}/{{nftId}}","urls.marketplaces.opensea.collection":"https://opensea.io/assets/{{network}}/{{address}}","urls.marketplaces.opensea.nft":"https://opensea.io/assets/{{network}}/{{address}}/{{nftId}}","urls.marketplaces.rarible.collection":"https://rarible.com/collection/{{address}}/items","urls.marketplaces.rarible.nft":"https://rarible.com/token/{{address}}:{{nftId}}","urls.marketplaces.blur.collection":"https://blur.io/collection/{{address}}","urls.marketplaces.blur.nft":"https://blur.io/asset/{{address}}/{{nftId}}","urls.marketplaces.looksrare.collection":"https://looksrare.org/collections/{{address}}","urls.marketplaces.looksrare.nft":"https://looksrare.org/collections/{{address}}/{{nftId}}","validation.accepted":"The {{attribute}} must be accepted.","validation.accepted_if":"The {{attribute}} must be accepted when {{other}} is {{value}}.","validation.active_url":"The {{attribute}} is not a valid URL.","validation.after":"The {{attribute}} must be a date after {{date}}.","validation.after_or_equal":"The {{attribute}} must be a date after or equal to {{date}}.","validation.alpha":"The {{attribute}} must only contain letters.","validation.alpha_dash":"The {{attribute}} must only contain letters, numbers, dashes and underscores.","validation.alpha_num":"The {{attribute}} must only contain letters and numbers.","validation.array":"The {{attribute}} must be an array.","validation.ascii":"The {{attribute}} must only contain single-byte alphanumeric characters and symbols.","validation.before":"The {{attribute}} must be a date before {{date}}.","validation.before_or_equal":"The {{attribute}} must be a date before or equal to {{date}}.","validation.between.array":"The {{attribute}} must have between {{min}} and {{max}} items.","validation.between.file":"The {{attribute}} must be between {{min}} and {{max}} kilobytes.","validation.between.numeric":"The {{attribute}} must be between {{min}} and {{max}}.","validation.between.string":"The {{attribute}} must be between {{min}} and {{max}} characters.","validation.boolean":"The {{attribute}} field must be true or false.","validation.confirmed":"The {{attribute}} confirmation does not match.","validation.current_password":"The password is incorrect.","validation.date":"The {{attribute}} is not a valid date.","validation.date_equals":"The {{attribute}} must be a date equal to {{date}}.","validation.date_format":"The {{attribute}} does not match the format {{format}}.","validation.decimal":"The {{attribute}} must have {{decimal}} decimal places.","validation.declined":"The {{attribute}} must be declined.","validation.declined_if":"The {{attribute}} must be declined when {{other}} is {{value}}.","validation.different":"The {{attribute}} and {{other}} must be different.","validation.digits":"The {{attribute}} must be {{digits}} digits.","validation.digits_between":"The {{attribute}} must be between {{min}} and {{max}} digits.","validation.dimensions":"The {{attribute}} has invalid image dimensions.","validation.distinct":"The {{attribute}} field has a duplicate value.","validation.doesnt_end_with":"The {{attribute}} may not end with one of the following: {{values}}.","validation.doesnt_start_with":"The {{attribute}} may not start with one of the following: {{values}}.","validation.email":"The {{attribute}} must be a valid email address.","validation.ends_with":"The {{attribute}} must end with one of the following: {{values}}.","validation.enum":"The selected {{attribute}} is invalid.","validation.exists":"The selected {{attribute}} is invalid.","validation.file":"The {{attribute}} must be a file.","validation.filled":"The {{attribute}} field must have a value.","validation.gt.array":"The {{attribute}} must have more than {{value}} items.","validation.gt.file":"The {{attribute}} must be greater than {{value}} kilobytes.","validation.gt.numeric":"The {{attribute}} must be greater than {{value}}.","validation.gt.string":"The {{attribute}} must be greater than {{value}} characters.","validation.gte.array":"The {{attribute}} must have {{value}} items or more.","validation.gte.file":"The {{attribute}} must be greater than or equal to {{value}} kilobytes.","validation.gte.numeric":"The {{attribute}} must be greater than or equal to {{value}}.","validation.gte.string":"The {{attribute}} must be greater than or equal to {{value}} characters.","validation.image":"The {{attribute}} must be an image.","validation.in":"The selected {{attribute}} is invalid.","validation.in_array":"The {{attribute}} field does not exist in {{other}}.","validation.integer":"The {{attribute}} must be an integer.","validation.ip":"The {{attribute}} must be a valid IP address.","validation.ipv4":"The {{attribute}} must be a valid IPv4 address.","validation.ipv6":"The {{attribute}} must be a valid IPv6 address.","validation.json":"The {{attribute}} must be a valid JSON string.","validation.lowercase":"The {{attribute}} must be lowercase.","validation.lt.array":"The {{attribute}} must have less than {{value}} items.","validation.lt.file":"The {{attribute}} must be less than {{value}} kilobytes.","validation.lt.numeric":"The {{attribute}} must be less than {{value}}.","validation.lt.string":"The {{attribute}} must be less than {{value}} characters.","validation.lte.array":"The {{attribute}} must not have more than {{value}} items.","validation.lte.file":"The {{attribute}} must be less than or equal to {{value}} kilobytes.","validation.lte.numeric":"The {{attribute}} must be less than or equal to {{value}}.","validation.lte.string":"The {{attribute}} must be less than or equal to {{value}} characters.","validation.mac_address":"The {{attribute}} must be a valid MAC address.","validation.max.array":"The {{attribute}} must not have more than {{max}} items.","validation.max.file":"The {{attribute}} must not be greater than {{max}} kilobytes.","validation.max.numeric":"The {{attribute}} must not be greater than {{max}}.","validation.max.string":"The {{attribute}} must not be greater than {{max}} characters.","validation.max_digits":"The {{attribute}} must not have more than {{max}} digits.","validation.mimes":"The {{attribute}} must be a file of type: {{values}}.","validation.mimetypes":"The {{attribute}} must be a file of type: {{values}}.","validation.min.array":"The {{attribute}} must have at least {{min}} items.","validation.min.file":"The {{attribute}} must be at least {{min}} kilobytes.","validation.min.numeric":"The {{attribute}} must be at least {{min}}.","validation.min.string":"The {{attribute}} must be at least {{min}} characters.","validation.min_digits":"The {{attribute}} must have at least {{min}} digits.","validation.missing":"The {{attribute}} field must be missing.","validation.missing_if":"The {{attribute}} field must be missing when {{other}} is {{value}}.","validation.missing_unless":"The {{attribute}} field must be missing unless {{other}} is {{value}}.","validation.missing_with":"The {{attribute}} field must be missing when {{values}} is present.","validation.missing_with_all":"The {{attribute}} field must be missing when {{values}} are present.","validation.multiple_of":"The {{attribute}} must be a multiple of {{value}}.","validation.not_in":"The selected {{attribute}} is invalid.","validation.not_regex":"The {{attribute}} format is invalid.","validation.numeric":"The {{attribute}} must be a number.","validation.password.letters":"The {{attribute}} must contain at least one letter.","validation.password.mixed":"The {{attribute}} must contain at least one uppercase and one lowercase letter.","validation.password.numbers":"The {{attribute}} must contain at least one number.","validation.password.symbols":"The {{attribute}} must contain at least one symbol.","validation.password.uncompromised":"The given {{attribute}} has appeared in a data leak. Please choose a different {{attribute}}.","validation.present":"The {{attribute}} field must be present.","validation.prohibited":"The {{attribute}} field is prohibited.","validation.prohibited_if":"The {{attribute}} field is prohibited when {{other}} is {{value}}.","validation.prohibited_unless":"The {{attribute}} field is prohibited unless {{other}} is in {{values}}.","validation.prohibits":"The {{attribute}} field prohibits {{other}} from being present.","validation.regex":"The {{attribute}} format is invalid.","validation.required":"The {{attribute}} field is required.","validation.required_array_keys":"The {{attribute}} field must contain entries for: {{values}}.","validation.required_if":"The {{attribute}} field is required when {{other}} is {{value}}.","validation.required_if_accepted":"The {{attribute}} field is required when {{other}} is accepted.","validation.required_unless":"The {{attribute}} field is required unless {{other}} is in {{values}}.","validation.required_with":"The {{attribute}} field is required when {{values}} is present.","validation.required_with_all":"The {{attribute}} field is required when {{values}} are present.","validation.required_without":"The {{attribute}} field is required when {{values}} is not present.","validation.required_without_all":"The {{attribute}} field is required when none of {{values}} are present.","validation.same":"The {{attribute}} and {{other}} must match.","validation.size.array":"The {{attribute}} must contain {{size}} items.","validation.size.file":"The {{attribute}} must be {{size}} kilobytes.","validation.size.numeric":"The {{attribute}} must be {{size}}.","validation.size.string":"The {{attribute}} must be {{size}} characters.","validation.starts_with":"The {{attribute}} must start with one of the following: {{values}}.","validation.string":"The {{attribute}} must be a string.","validation.timezone":"The {{attribute}} must be a valid timezone.","validation.unique":"The {{attribute}} has already been taken.","validation.uploaded":"The {{attribute}} failed to upload.","validation.uppercase":"The {{attribute}} must be uppercase.","validation.url":"The {{attribute}} must be a valid URL.","validation.ulid":"The {{attribute}} must be a valid ULID.","validation.uuid":"The {{attribute}} must be a valid UUID.","validation.custom.attribute-name.rule-name":"custom-message","validation.unsupported_currency_code":"The currency code you provided is invalid or not supported.","validation.unsupported_period":"The period you provided is invalid or not supported.","validation.unsupported_token_symbol":"The token symbol you provided is invalid or not supported.","validation.gallery_title_required":"Gallery name is required.","validation.gallery_title_max_characters":"The gallery name should not exceed 50 characters.","validation.gallery_title_invalid":"The gallery name is invalid.","validation.nfts_required":"Please add at least one NFT.","validation.nfts_max_size":"Galleries can contain no more than {{limit}} NFTs","validation.invalid_nfts":"The NFT in position {{position}} is invalid, please select another one.","validation.invalid_cover":"You have selected an invalid cover image, please try another one."} \ No newline at end of file +{"auth.welcome":"Welcome to Dashbrd","auth.logged_in":"You're logged in!","auth.log_out":"Log out","auth.failed":"These credentials do not match our records.","auth.session_timeout":"Your session has timed out. Please refresh the page and try connecting your account again.","auth.session_timeout_modal":"Seems like your session has timed out. Please connnect your wallet again.","auth.password":"The provided password is incorrect.","auth.throttle":"Too many login attempts. Please try again in {{seconds}} seconds.","auth.wallet.connecting":"Connecting …","auth.wallet.waiting_for_signature":"Waiting for Signature …","auth.wallet.switching_wallet":"Switching Wallet …","auth.wallet.connect":"Connect Wallet","auth.wallet.connect_long":"Connect Your Wallet to Get Started","auth.wallet.sign_subtitle":"Connect Your Wallet to Continue","auth.wallet.disconnect":"Disconnect Wallet","auth.wallet.install":"Install MetaMask","auth.wallet.install_long":"Install MetaMask to Get Started","auth.wallet.sign":"Sign Message","auth.wallet.sign_message":"Welcome to Dashbrd. In order to login, sign this message with your wallet. It doesn't cost you anything!\n\nSigning ID (you can ignore this): {{nonce}}","auth.wallet.connect_subtitle":"Click on the MetaMask icon in your browser to confirm the action and connect your wallet.","auth.wallet.requires_signature":"In order to prevent impersonation, we require a signature to perform this action. This signature is only a signed message and does not give any access to your wallet.","auth.errors.metamask.no_account":"No account found. Please connect your wallet and try again.","auth.errors.metamask.generic":"Connection attempt error. Please retry and follow the steps to connect your wallet.","auth.errors.metamask.invalid_network":"Please switch to Polygon or Ethereum Mainnet in your MetaMask plugin to connect to Dashbrd.","auth.errors.metamask.provider_missing":"You don't have MetaMask installed in your browser. Please install and try again.","auth.errors.metamask.user_rejected":"It looks like you cancelled signing of the authentication message. Please try again.","auth.errors.metamask.provider_not_set":"Ethereum provider is not set","auth.validation.wallet_login_failed":"There was a problem trying to verify your signature. Please try again.","auth.validation.invalid_address":"Your wallet address is invalid. Please try again.","auth.validation.invalid_signature":"Signature is invalid. Please try again.","auth.validation.invalid_network":"Please switch to Polygon or Ethereum Mainnet in your MetaMask plugin to connect to Dashbrd.","common.author":"Author","common.add":"Add","common.amount":"Amount","common.balance":"Balance","common.cancel":"Cancel","common.delete":"Delete","common.edit":"Edit","common.confirm":"Confirm","common.connect":"Connect","common.continue":"Continue","common.done":"Done","common.filter":"Filter","common.items":"Items","common.receive":"Receive","common.received":"Received","common.retry":"Retry","common.records":"Records","common.save":"Save","common.send":"Send","common.sent":"Sent","common.show":"Show","common.searching":"Searching...","common.other":"Other","common.owned":"Owned","common.token":"Token","common.tokens":"Tokens","common.wallet":"Wallet","common.pending":"Pending","common.publish":"Publish","common.published":"Published","common.empty":"Empty","common.your_address":"Your Address","common.warning":"Warning","common.my_address":"My Address","common.my_wallet":"My Wallet","common.my_balance":"My Balance","common.na":"N/A","common.simple_plural_without_data":"One comment|Many comments","common.simple_plural_with_data":"{{count}} comment|{{count}} comments","common.advanced_plural_without_data":"{0} no comments yet|{1} 1 comment|[2,*] Many comments","common.advanced_plural_with_data":"{0} no comments yet|{1} 1 comment|[2,*] {{count}} comments","common.copy_clipboard":"Copy to Clipboard","common.copy":"Copy","common.download":"Download","common.zoom":"Zoom","common.my_collection":"My Collection","common.max":"Max","common.chain":"Chain","common.copied":"Copied!","common.coming_soon":"Coming Soon","common.more_details":"More Details","common.close":"Close","common.close_toast":"Close toast","common.loading":"Loading","common.price":"Price","common.articles":"Articles","common.most_popular":"Most Popular","common.market_cap":"Market Cap","common.volume":"Volume {{frequency}}","common.value":"Value","common.last_n_days":"Last {{count}} Days","common.details":"Details","common.view_all":"View All","common.view_more_on_polygonscan":"View More on Polygonscan","common.view_more_on_etherscan":"View More on Etherscan","common.view_nft_on_etherscan":"View NFT on Etherscan","common.view_nft_on_polygonscan":"View NFT on Polygonscan","common.view_nft_on_goerli_tesnet":"View NFT on Goerli Testnet Explorer","common.view_nft_on_mumbai_tesnet":"View NFT on Mumbai Testnet Explorer","common.polygonscan":"Polygonscan","common.etherscan":"Etherscan","common.featured":"Featured","common.floor_price":"Floor Price","common.floor":"Floor","common.supply":"Supply","common.owners":"Owners","common.created":"Created","common.nft":"NFT","common.collection":"Collection","common.collections":"Collections","common.gallery":"Gallery","common.basic_gallery":"Basic Gallery","common.gallery_name":"Gallery Name","common.create_gallery":"Create Gallery","common.external_link":"External Link","common.follow_link":"Follow Link","common.cover":"Cover","common.template":"Template","common.page":"Page","common.polygon":"Polygon","common.ethereum":"Ethereum","common.mumbai":"Mumbai","common.goerli":"Goerli","common.of":"of","common.pagination_input_placeholder":"Enter the page number","common.pagination_input_placeholder_mobile":"Page number","common.nft_count":"{0} {{count}} NFTs|{1} {{count}} NFT|[2,*] {{count}} NFTs","common.nft_gallery":"NFT Gallery","common.unable_to_retrieve_image":"Unable to retrieve your NFT image at this time","common.optional":"Optional","common.selected":"Selected","common.select":"Select","common.preview":"Preview","common.image_size_error":"Image size must not exceed 2MB","common.image_dimensions_error":"Image dimensions must exceed 287px x 190px","common.write_to_confirm":"Write {{word}} to confirm","common.n_hours":"{0} {{count}} hour|{1} {{count}} hour|[2,*] {{count}} hours","common.n_minutes":"{0} {{count}} minute|{1} {{count}} minute|[2,*] {{count}} minutes","common.report":"Report","common.nfts":"NFTs","common.n_nfts":"{0}NFTs|{1}NFT|[2,*]NFTs","common.n_collections":"{0}collections|{1}collection|[2,*]collections","common.back":"Back","common.back_to":"Back to","common.name":"Name","common.type":"Type","common.from":"From","common.to":"To","common.sale_price":"Sale Price","common.recent_activity":"Recent Activity","common.time":"Time","common.datetime.few_seconds_ago":"A few seconds ago","common.datetime.minutes_ago":"{0} Less than a minute ago|{1} A minute ago|[2,*] {{count}} minutes ago","common.datetime.hours_ago":"{0} Less than an hour ago|{1} An hour ago|[2,*] {{count}} hours ago","common.datetime.days_ago":"{0} Less than a day ago|{1} A day ago|[2,*] {{count}} days ago","common.datetime.weeks_ago":"{0} Less than a week ago|{1} A week ago|[2,*] {{count}} weeks ago","common.datetime.months_ago":"{0} Less than a month ago|{1} A month ago|[2,*] {{count}} months ago","common.datetime.years_ago":"{0} Less than a year ago|{1} A year ago|[2,*] {{count}} years ago","common.no_traits_found":"No traits found.","common.empty_transactions":"You don't have any transactions yet. Once transactions have been made, they will show up here.","common.error":"Error","common.refresh":"Refresh","common.refresh_metadata":"Refresh Metadata","common.refreshing_metadata":"Refreshing Metadata... Please check back later.","common.refreshing_activity":"Refreshing Activity... Please check back later.","common.pending_confirmation":"Pending Confirmation","common.confirmed_transaction":"Confirmed Transaction","common.transaction_error":"Transaction Error","common.transaction_error_description_first_part":"Your transaction encountered an error. View this transaction on","common.transaction_error_description_second_part":"for more details.","common.home":"Home","common.contact":"Contact","common.menu":"Menu","common.website":"Website","common.twitter":"Twitter","common.discord":"Discord","common.facebook":"Facebook","common.reddit":"Reddit","common.x":"X","common.sort":"Sort","common.drafts":"Drafts","common.draft":"Draft","common.delete_draft":"Delete Draft","common.share_on":"Share on {{platform}}","footer.copyright":"{{year}} © Dashbrd. All rights reserved.","footer.all_rights_reserved":"All rights reserved","footer.privacy_policy":"Privacy Policy","footer.terms_of_service":"Terms of Service","footer.powered_by":"Powered by","format.fiat":"{{ value, currency }}","format.number":"{{ value, number }}","metatags.home.title":"Dashbrd | Web3 Portfolio Management Made Simple","metatags.home.description":"Simplify your Web3 journey with Dashbrd. Manage your portfolio of tokens, NFTs, and other digital collectibles across the Ethereum and Polygon blockchains.","metatags.home.image":"/images/meta/home.png","metatags.error.title":"Error {{code}} | Dashbrd","metatags.wallet.title":"My Wallet | Dashbrd","metatags.galleries.title":"Top NFT Galleries | Dashbrd","metatags.galleries.image":"/images/meta/nft-galleries.png","metatags.galleries.description":"Explore user published NFT galleries to find custom curated PFPs, Digital Collectibles, & More.","metatags.galleries.most_popular.title":"Most Popular Galleries | Dashbrd","metatags.galleries.most_popular.image":"/images/meta/most-popular-nft-galleries.png","metatags.galleries.most_popular.description":"Explore and discover Most Popular NFT Galleries created by our users featuring custom curated PFPs, Digital Collectibles, & More.","metatags.galleries.newest.title":"Newest Galleries | Dashbrd","metatags.galleries.newest.image":"/images/meta/newest-nft-galleries.png","metatags.galleries.newest.description":"Explore and discover most recent NFT galleries created by our users featuring custom curated PFPs, Digital Collectibles, & More","metatags.galleries.most_valuable.title":"Most Valuable Galleries | Dashbrd","metatags.galleries.most_valuable.image":"/images/meta/most-valuable-nft-galleries.png","metatags.galleries.most_valuable.description":"Explore and discover Most Valuable NFT Galleries created by our users featuring custom curated PFPs, Digital Collectibles, & More.","metatags.galleries.view.title":"{{name}} | Dashbrd","metatags.galleries.view.description":"{{name}} | A Curated NFT Gallery at Dashbrd","metatags.galleries.view.image":"/images/meta/nft-gallery.png","metatags.my_galleries.title":"My Galleries | Dashbrd","metatags.my_galleries.title_draft":"My Draft Galleries | Dashbrd","metatags.my_galleries.create.title":"Create Gallery | Dashbrd","metatags.my_galleries.edit.title":"Edit {{name}} | Dashbrd","metatags.collections.title":"Collections | Dashbrd","metatags.collections.view.title":"{{name}} Collection | Dashbrd","metatags.collections.view.description":"Immerse yourself in the intricate details of {{name}} collection, featuring remarkable digital assets. Start your NFT journey today!","metatags.collections.view.image":"/images/meta/nft-collection.png","metatags.my-collections.title":"My Collections | Dashbrd","metatags.nfts.view.title":"{{nft}} NFT | Dashbrd","metatags.nfts.view.description":"Uncover the complete story of {{nft}} NFT from the {{collection}} collection, delving into its unique attributes and distinctive features.","metatags.nfts.view.image":"/images/meta/nft-details.png","metatags.settings.title":"Settings | Dashbrd","metatags.articles.title":"Articles | Dashbrd","metatags.articles.view.title":"{{title}} | Dashbrd","metatags.login.title":"Login | Dashbrd","metatags.privacy_policy.title":"Privacy Policy | Dashbrd","metatags.privacy_policy.description":"Dashbrd’s privacy policy outlines the information we collect and explains your choices surrounding how we use information about you.","metatags.terms_of_service.title":"Terms of Service | Dashbrd","metatags.terms_of_service.description":"These Terms of Service cover your use and access to services, products or websites of Dashbrd.","metatags.cookie_policy.title":"Cookie Policy | Dashbrd","metatags.cookie_policy.description":"Dashbrd uses cookies to make the website more user-friendly. Find out about the main types of cookies we use, and what we use them for.","metatags.welcome.title":"Welcome to Dashbrd | Web3 Simplified","pages.onboarding.title":"Get Started","pages.onboarding.heading":"Your monkeys were bored and ran off, we are trying to round them up.","pages.onboarding.message":"We are setting up your account. This process usually takes just a few minutes, but can take up to 15 minutes.","pages.error.heading":"Oops, something went wrong ...","pages.error.message":"Please try again or get in touch if the issue persists.","pages.maintenance.title":"Dashbrd is currently down for scheduled maintenance.","pages.maintenance.description":"We expect to be back soon. Thanks for your patience.","pages.dashboard.title":"My Wallet","pages.dashboard.breakdown.title":"Portfolio Breakdown","pages.dashboard.line_chart.data_error":"Could not load chart data","pages.articles.title":"Articles","pages.articles.featured_collections":"Featured Collections","pages.articles.placeholder_more_soon":"More Soon","pages.articles.no_articles":"No articles have been published yet. Please check back later!","pages.articles.header_title":"Explore our collection of","pages.articles.header_suffix_one":"published article","pages.articles.header_suffix_other":"published articles","pages.articles.audio_version":"Audio version","pages.articles.consists_of_collections":"{0} This article highlights {{count}} collections|{1} This article highlights {{count}} collection|[2,*] This article highlights {{count}} collections","pages.collections.title":"Collections","pages.collections.collections":"Collections","pages.collections.collection_value":"Collection Value","pages.collections.nfts_owned":"NFTs Owned","pages.collections.header_title":"You own <0>{{nftsCount}} {{nfts}} across <0>{{collectionsCount}} {{collections}}, worth about <0><1>{{worth}}","pages.collections.search_placeholder":"Search by Collection","pages.collections.properties":"Properties","pages.collections.collections_network":"Collections Network","pages.collections.property_search_placeholder":"Feature Search","pages.collections.floor_price":"Floor Price","pages.collections.value":"Value","pages.collections.rarity":"Rarity","pages.collections.report":"Report","pages.collections.hide_collection":"Hide Collection","pages.collections.unhide_collection":"Unhide Collection","pages.collections.no_collections":"You do not own any NFTs yet. Once you do they will be shown here.","pages.collections.all_collections_hidden":"You have hidden all your collections. Unhide and they will appear here.","pages.collections.about_collection":"About Collection","pages.collections.show_hidden":"Show Hidden","pages.collections.show_my_collection":"Show My Collection","pages.collections.owned":"Owned","pages.collections.activities.loading_activities":"We're fetching Activity for this NFT, please hang tight, this can take a while.","pages.collections.activities.loading_activities_collection":"We're fetching Activity for this collection, please hang tight, this can take a while.","pages.collections.activities.ignores_activities":"We don't support activity history for this collection yet.","pages.collections.activities.no_activity":"This collection does not have any activity yet.","pages.collections.activities.types.LABEL_MINT":"Mint","pages.collections.activities.types.LABEL_TRANSFER":"Transfer","pages.collections.activities.types.LABEL_SALE":"Sale","pages.collections.articles.no_articles":"No articles have been linked to this collection as of now.","pages.collections.articles.no_articles_with_filters":"We could not find any articles matching your search criteria, please try again!","pages.collections.articles.search_placeholder":"Search in Articles","pages.collections.articles.sort_latest":"Latest","pages.collections.articles.sort_popularity":"Most Popular","pages.collections.search.loading_results":"Loading results...","pages.collections.search.no_results":"We could not find anything matching your search criteria, please try again!","pages.collections.search.no_results_with_filters":"We could not find anything matching your filters, please try again!","pages.collections.search.no_results_ownership":"You do not own any NFTs in this collection","pages.collections.search.error":"Could not load search results. Please try again later.","pages.collections.sorting.token_number":"Token Number","pages.collections.sorting.recently_received":"Recently Received","pages.collections.sorting.recently_created":"Recently Created","pages.collections.sorting.oldest_collection":"Oldest Collection","pages.collections.traits.description":"List of NFT traits by % of occurrence in the collection","pages.collections.traits.no_traits":"No Properties can be found for this NFT","pages.collections.menu.collection":"Collection","pages.collections.menu.articles":"Articles","pages.collections.menu.activity":"Activity","pages.collections.hidden_modal.collection_hidden":"Collection Hidden","pages.collections.hidden_modal.description":"This collection is currently set to Hidden. Are you sure you want to unhide this collection? You can\n reset the collection to hidden from the collection menu.","pages.collections.hidden_modal.unhide":"Unhide","pages.collections.hidden_modal.error":"Something went wrong. Please try again.","pages.collections.external_modal.you_wish_continue":"You are about to leave Dashbrd to an external website. Dashbrd has no control over the content of\n this site. Are you sure you wish to continue?","pages.collections.external_modal.not_show":"Do not show this message again.","pages.collections.refresh.title":"Refresh your collection","pages.collections.refresh.notice":"You can refresh data every 15 minutes.","pages.collections.refresh.notice_wait":"Please wait. You can refresh data every 15 minutes.","pages.collections.refresh.toast":"We're updating information for your collection.","pages.collections.featured.title":"Featured Collections","pages.collections.featured.button":"Explore Collection","pages.nfts.nft":"nft","pages.nfts.about_nft":"About NFT","pages.nfts.owned_by":"Owned by","pages.nfts.collection_image":"collection image","pages.nfts.menu.properties":"Properties","pages.nfts.menu.activity":"Activity","pages.reports.title":"Submit a Report","pages.reports.description":"Thanks for looking out by reporting things that break the rules. Let us know what's happening and we'll receive the report.","pages.reports.success":"Thank you for your report. We'll review it and see if it breaks our ToS.","pages.reports.failed":"Something went wrong. Please try again.","pages.reports.throttle":"You have made too many requests. Please wait {{time}} before reporting again.","pages.reports.reported":"You have already reported this {{model}}.","pages.reports.reasons.spam":"Spam","pages.reports.reasons.violence":"Promoting Violence","pages.reports.reasons.hate":"Hate","pages.reports.reasons.inappropriate_content":"Inappropriate Content","pages.reports.reasons.impersonation":"Impersonation","pages.reports.reasons.trademark":"Trademark or Copyright","pages.reports.reasons.selfharm":"Self-Harm","pages.reports.reasons.harassment":"Harassment","pages.galleries.title":"Galleries","pages.galleries.empty_title":"No galleries have been published yet. Once they do they will appear here.","pages.galleries.search.loading_results":"Loading results...","pages.galleries.search.no_results":"We could not find anything matching your search criteria, please try again!","pages.galleries.search.placeholder":"Search by name or curator address","pages.galleries.search.placeholder_nfts":"Search by NFTs","pages.galleries.search.error":"Could not load search results. Please try again later.","pages.galleries.my_galleries.title":"My Galleries","pages.galleries.my_galleries.subtitle":"Manage your galleries","pages.galleries.my_galleries.new_gallery":"New Gallery","pages.galleries.my_galleries.no_galleries":"You have not created any galleries yet. To create a gallery, click on the \"Create Gallery\" button.","pages.galleries.my_galleries.no_draft_galleries":"You have no draft galleries yet. To create a gallery, click on the \"Create Gallery\" button.","pages.galleries.my_galleries.succesfully_deleted":"Gallery has been successfully removed","pages.galleries.my_galleries.draft_succesfully_deleted":"Draft has been successfully removed","pages.galleries.my_galleries.successfully_created":"Gallery has been successfully created","pages.galleries.my_galleries.successfully_updated":"Gallery has been successfully updated","pages.galleries.my_galleries.new_gallery_no_nfts":"Creating a Gallery requires you to own an NFT.","pages.galleries.my_galleries.delete_modal.title":"Delete Draft","pages.galleries.my_galleries.delete_modal.text":"Are you sure you want to delete the draft? Everything you've done will be deleted and you won't be able to get it back.","pages.galleries.my_galleries.nfts_no_longer_owned":"NFTs no longer owned by this wallet have been removed from the draft”","pages.galleries.copy_gallery_link":"Copy Gallery Link","pages.galleries.my_nfts":"My NFTs","pages.galleries.value":"Value","pages.galleries.floor_price":"Floor Price","pages.galleries.nfts":"NFTs","pages.galleries.collections":"Collections","pages.galleries.galleries_count_simple":"{0} galleries|{1} gallery|[2,*] galleries","pages.galleries.galleries_count":"{0} {{count}} Galleries|{1} {{count}} Gallery|[2,*] {{count}} Galleries","pages.galleries.collections_count_simple":"{0} collections|{1} collection|[2,*] collections","pages.galleries.collections_count":"{0} {{count}} Collections|{1} {{count}} Collection|[2,*] {{count}} Collections","pages.galleries.nfts_count_simple":"{0} NFTs|{1} NFT|[2,*] NFTs","pages.galleries.nfts_count":"{0} {{count}} NFTs|{1} {{count}} NFT|[2,*] {{count}} NFTs","pages.galleries.users_count_simple":"{0} users|{1} user|[2,*] users","pages.galleries.users_count":"{0} {{count}} Users|{1} {{count}} User|[2,*] {{count}} Users","pages.galleries.featuring":"Featuring","pages.galleries.curated_by":"Curated by","pages.galleries.worth_about":"Worth About","pages.galleries.valued_at":"valued at","pages.galleries.from":"From","pages.galleries.most_popular_galleries":"Most Popular Galleries","pages.galleries.newest_galleries":"Newest Galleries","pages.galleries.most_valuable_galleries":"Most Valuable Galleries","pages.galleries.most_popular":"Most Popular","pages.galleries.newest":"Newest","pages.galleries.most_valuable":"Most Valuable","pages.galleries.create.search_by_nfts":"Search by NFTs","pages.galleries.create.input_placeholder":"Enter gallery name","pages.galleries.create.title_too_long":"Gallery name must not exceed {{max}} characters.","pages.galleries.create.already_selected_nft":"NFT already exists in this gallery","pages.galleries.create.nft_missing_image":"Only NFTs with images can be added to galleries","pages.galleries.create.nft_gallery_limit":"You can only add 16 NFTs per gallery","pages.galleries.create.gallery_cover":"Gallery Cover","pages.galleries.create.gallery_cover_description":"The cover is used for the card on the gallery list page. While the cover is not a requirement it will allow you to add personality and stand out from the crowd.","pages.galleries.create.gallery_cover_information":"Image dimensions must be at least 287px x 190px, with a max size of 2 MB (JPG, PNG or GIF)","pages.galleries.create.no_results":"We could not find anything matching your search criteria, please try again!","pages.galleries.create.templates.cover":"Cover","pages.galleries.create.templates.template":"Template","pages.galleries.create.templates.select":"Select Gallery Template","pages.galleries.create.templates.basic":"Basic Gallery","pages.galleries.create.templates.coming_soon":"More Coming Soon","pages.galleries.create.load_more_collections_one":"Load {{count}} More Collection","pages.galleries.create.load_more_collections_other":"Load {{count}} More Collections","pages.galleries.create.load_more_nfts":"Load More NFTs","pages.galleries.create.can_purchase":"You can purchase NFTs with these top NFT Marketplaces:","pages.galleries.create.must_own_one_nft":"You must own at least one (1) NFT in order to create a gallery.","pages.galleries.create.back_to_galleries":"Back to Galleries","pages.galleries.create.draft_saved":"Draft Saved","pages.galleries.create.saving_to_draft":"Saving to draft","pages.galleries.create.drafts_limit_modal_title":"Draft Gallery Limit","pages.galleries.create.drafts_limit_modal_message":"You’ve hit your limit for draft galleries. While you can still make new galleries and publish them, they won’t be saved as drafts. To Free up space, you can either delete existing drafts or publish them.","pages.galleries.create.drafts_limit_modal_cancel":"Go to Drafts","pages.galleries.delete_modal.title":"Delete Gallery","pages.galleries.delete_modal.confirmation_text":"Are you sure you want to delete the gallery? Deleting a Gallery is permanent, all associated views and likes will be lost.","pages.galleries.consists_of_collections":"{0} This gallery consists of {{count}} collections|{1} This gallery consists of {{count}} collection|[2,*] This gallery consists of {{count}} collections","pages.galleries.guest_banner.title":"Craft the ultimate","pages.galleries.guest_banner.subtitle":"Pick your favorites, curate your gallery, & share it with the world.","pages.profile.title":"Profile","pages.token_panel.balance_tooltip":"Total percentage of the portfolio held in this token","pages.token_panel.insufficient_funds":"Insufficient Balance","pages.token_panel.error":"Dashbrd has failed to load token information. Please try again later.","pages.token_panel.failed_to_retrieve_transactions":"We were unable to fetch your transactions.","pages.token_panel.tabs.transaction_history":"Transaction History","pages.token_panel.tabs.history":"History","pages.token_panel.tabs.market_data":"Market Data","pages.token_panel.details.current_price":"Current Price","pages.token_panel.details.title":"Token Details","pages.token_panel.details.market_cap":"Market Cap","pages.token_panel.details.volume":"Daily Volume","pages.token_panel.details.supply":"Minted Supply","pages.token_panel.details.ath":"All-Time High","pages.token_panel.details.atl":"All-Time Low","pages.token_panel.chart.failed":"Dashbrd has failed to load chart information. Please try again later.","pages.transaction_details_panel.title":"Transaction Details","pages.transaction_details_panel.details.blockchain":"Blockchain","pages.transaction_details_panel.details.timestamp":"Timestamp","pages.transaction_details_panel.details.transaction_hash":"Transaction Hash","pages.transaction_details_panel.details.transaction_fee":"Transaction Fee","pages.transaction_details_panel.details.gas_price":"Gas Price","pages.transaction_details_panel.details.gas_used":"Gas Used","pages.transaction_details_panel.details.nonce":"Nonce","pages.send_receive_panel.send.labels.token_and_amount":"Token and Amount","pages.send_receive_panel.send.labels.destination_address":"Destination Address","pages.send_receive_panel.send.labels.projected_fee":"Projected Fee","pages.send_receive_panel.send.placeholders.enter_amount":"Enter Amount","pages.send_receive_panel.send.placeholders.insert_recipient_address":"Insert Recipient Address","pages.send_receive_panel.send.placeholders.projected_fee":"Projected Fee","pages.send_receive_panel.send.errors.amount":"Insufficient Funds: You do not have enough to cover the amount + fee.","pages.send_receive_panel.send.errors.destination":"Destination address is not correct. Check and input again.","pages.send_receive_panel.send.hints.token_price":"Token Price","pages.send_receive_panel.send.fees.Fast":"Fast","pages.send_receive_panel.send.fees.Avg":"Avg","pages.send_receive_panel.send.fees.Slow":"Slow","pages.send_receive_panel.send.search_dropdown.placeholder":"Search token","pages.send_receive_panel.send.search_dropdown.no_results":"No Results","pages.send_receive_panel.send.search_dropdown.error":"Error occurred while searching tokens.","pages.send_receive_panel.send.transaction_time":"Transaction Time: ~{{ time }} minutes","pages.send_receive_panel.send.from":"From","pages.send_receive_panel.send.to":"To","pages.send_receive_panel.send.amount":"Amount","pages.send_receive_panel.send.fee":"Fee","pages.send_receive_panel.send.total_amount":"Total Amount","pages.send_receive_panel.send.waiting_message":"Review and verify the information on your MetaMask. Sign to send the transaction.","pages.send_receive_panel.send.waiting_spinner_text":"Waiting for confirmation...","pages.send_receive_panel.send.failed_message":"It looks like something went wrong while sending your transaction. Press 'Retry' to make another attempt.","pages.send_receive_panel.receive.alert":"Send only Polygon or Ethereum Network compatible tokens to this address or you could permanently lose your funds!","pages.settings.title":"Settings","pages.settings.sidebar.general":"General","pages.settings.sidebar.notifications":"Notifications","pages.settings.sidebar.session_history":"Sessions History","pages.settings.general.title":"Settings","pages.settings.general.subtitle":"Customize your App Experience","pages.settings.general.currency":"Currency","pages.settings.general.currency_subtitle":"Select your default currency which will be used throughout the app.","pages.settings.general.time_date":"Time & Date","pages.settings.general.time_date_subtitle":"Select how you want time and date be shown inside app.","pages.settings.general.date_format":"Date Format","pages.settings.general.time_format":"Time Format","pages.settings.general.timezone":"Timezone","pages.settings.general.set_defaults":"Set Defaults","pages.settings.general.set_defaults_content":"Reverting to the default settings will remove any customizations previously made. Are you sure?","pages.settings.general.save":"Save Settings","pages.settings.general.saved":"Your settings have been successfully saved","pages.wallet.title":"Wallet","pages.privacy_policy.title":"Privacy Policy","pages.terms_of_service.title":"Terms of Service","pagination.previous":"« Previous","pagination.next":"Next »","passwords.reset":"Your password has been reset!","passwords.sent":"We have emailed your password reset link!","passwords.throttled":"Please wait before retrying.","passwords.token":"This password reset token is invalid.","passwords.user":"We can't find a user with that email address.","urls.landing":"https://dashbrd.com","urls.cookie_policy":"https://dashbrd.com/cookie-policy","urls.privacy_policy":"https://dashbrd.com/privacy-policy","urls.terms_of_service":"https://dashbrd.com/terms-of-service","urls.twitter":"https://x.com/DashbrdApp","urls.discord":"https://discord.gg/MJyWKkCJ5k","urls.github":"https://github.com/ArdentHQ/dashbrd","urls.coingecko":"https://www.coingecko.com","urls.etherscan":"https://etherscan.io","urls.polygonscan":"https://polygonscan.com","urls.alchemy":"https://www.alchemy.com","urls.moralis":"https://moralis.io","urls.mnemonic":"https://www.mnemonichq.com","urls.opensea":"https://opensea.io/","urls.explorers.etherscan.token_transactions":"https://etherscan.io/token/{{token}}?a={{address}}","urls.explorers.etherscan.addresses":"https://etherscan.io/address/{{address}}","urls.explorers.etherscan.transactions":"https://etherscan.io/tx/{{id}}","urls.explorers.etherscan.nft":"https://etherscan.io/nft/{{address}}/{{nftId}}","urls.explorers.polygonscan.token_transactions":"https://polygonscan.com/token/{{token}}?a={{address}}","urls.explorers.polygonscan.addresses":"https://polygonscan.com/address/{{address}}","urls.explorers.polygonscan.transactions":"https://polygonscan.com/tx/{{id}}","urls.explorers.polygonscan.nft":"https://polygonscan.com/nft/{{address}}/{{nftId}}","urls.explorers.mumbai.token_transactions":"https://mumbai.polygonscan.com/token/{{token}}?a={{address}}","urls.explorers.mumbai.addresses":"https://mumbai.polygonscan.com/address/{{address}}","urls.explorers.mumbai.transactions":"https://mumbai.polygonscan.com/tx/{{id}}","urls.explorers.mumbai.nft":"https://mumbai.polygonscan.com/nft/{{address}}/{{nftId}}","urls.explorers.goerli.token_transactions":"https://goerli.etherscan.io/token/{{token}}?a={{address}}","urls.explorers.goerli.addresses":"https://goerli.etherscan.io/address/{{address}}","urls.explorers.goerli.transactions":"https://goerli.etherscan.io/tx/{{id}}","urls.explorers.goerli.nft":"https://goerli.etherscan.io/nft/{{address}}/{{nftId}}","urls.marketplaces.opensea.collection":"https://opensea.io/assets/{{network}}/{{address}}","urls.marketplaces.opensea.nft":"https://opensea.io/assets/{{network}}/{{address}}/{{nftId}}","urls.marketplaces.rarible.collection":"https://rarible.com/collection/{{address}}/items","urls.marketplaces.rarible.nft":"https://rarible.com/token/{{address}}:{{nftId}}","urls.marketplaces.blur.collection":"https://blur.io/collection/{{address}}","urls.marketplaces.blur.nft":"https://blur.io/asset/{{address}}/{{nftId}}","urls.marketplaces.looksrare.collection":"https://looksrare.org/collections/{{address}}","urls.marketplaces.looksrare.nft":"https://looksrare.org/collections/{{address}}/{{nftId}}","validation.accepted":"The {{attribute}} must be accepted.","validation.accepted_if":"The {{attribute}} must be accepted when {{other}} is {{value}}.","validation.active_url":"The {{attribute}} is not a valid URL.","validation.after":"The {{attribute}} must be a date after {{date}}.","validation.after_or_equal":"The {{attribute}} must be a date after or equal to {{date}}.","validation.alpha":"The {{attribute}} must only contain letters.","validation.alpha_dash":"The {{attribute}} must only contain letters, numbers, dashes and underscores.","validation.alpha_num":"The {{attribute}} must only contain letters and numbers.","validation.array":"The {{attribute}} must be an array.","validation.ascii":"The {{attribute}} must only contain single-byte alphanumeric characters and symbols.","validation.before":"The {{attribute}} must be a date before {{date}}.","validation.before_or_equal":"The {{attribute}} must be a date before or equal to {{date}}.","validation.between.array":"The {{attribute}} must have between {{min}} and {{max}} items.","validation.between.file":"The {{attribute}} must be between {{min}} and {{max}} kilobytes.","validation.between.numeric":"The {{attribute}} must be between {{min}} and {{max}}.","validation.between.string":"The {{attribute}} must be between {{min}} and {{max}} characters.","validation.boolean":"The {{attribute}} field must be true or false.","validation.confirmed":"The {{attribute}} confirmation does not match.","validation.current_password":"The password is incorrect.","validation.date":"The {{attribute}} is not a valid date.","validation.date_equals":"The {{attribute}} must be a date equal to {{date}}.","validation.date_format":"The {{attribute}} does not match the format {{format}}.","validation.decimal":"The {{attribute}} must have {{decimal}} decimal places.","validation.declined":"The {{attribute}} must be declined.","validation.declined_if":"The {{attribute}} must be declined when {{other}} is {{value}}.","validation.different":"The {{attribute}} and {{other}} must be different.","validation.digits":"The {{attribute}} must be {{digits}} digits.","validation.digits_between":"The {{attribute}} must be between {{min}} and {{max}} digits.","validation.dimensions":"The {{attribute}} has invalid image dimensions.","validation.distinct":"The {{attribute}} field has a duplicate value.","validation.doesnt_end_with":"The {{attribute}} may not end with one of the following: {{values}}.","validation.doesnt_start_with":"The {{attribute}} may not start with one of the following: {{values}}.","validation.email":"The {{attribute}} must be a valid email address.","validation.ends_with":"The {{attribute}} must end with one of the following: {{values}}.","validation.enum":"The selected {{attribute}} is invalid.","validation.exists":"The selected {{attribute}} is invalid.","validation.file":"The {{attribute}} must be a file.","validation.filled":"The {{attribute}} field must have a value.","validation.gt.array":"The {{attribute}} must have more than {{value}} items.","validation.gt.file":"The {{attribute}} must be greater than {{value}} kilobytes.","validation.gt.numeric":"The {{attribute}} must be greater than {{value}}.","validation.gt.string":"The {{attribute}} must be greater than {{value}} characters.","validation.gte.array":"The {{attribute}} must have {{value}} items or more.","validation.gte.file":"The {{attribute}} must be greater than or equal to {{value}} kilobytes.","validation.gte.numeric":"The {{attribute}} must be greater than or equal to {{value}}.","validation.gte.string":"The {{attribute}} must be greater than or equal to {{value}} characters.","validation.image":"The {{attribute}} must be an image.","validation.in":"The selected {{attribute}} is invalid.","validation.in_array":"The {{attribute}} field does not exist in {{other}}.","validation.integer":"The {{attribute}} must be an integer.","validation.ip":"The {{attribute}} must be a valid IP address.","validation.ipv4":"The {{attribute}} must be a valid IPv4 address.","validation.ipv6":"The {{attribute}} must be a valid IPv6 address.","validation.json":"The {{attribute}} must be a valid JSON string.","validation.lowercase":"The {{attribute}} must be lowercase.","validation.lt.array":"The {{attribute}} must have less than {{value}} items.","validation.lt.file":"The {{attribute}} must be less than {{value}} kilobytes.","validation.lt.numeric":"The {{attribute}} must be less than {{value}}.","validation.lt.string":"The {{attribute}} must be less than {{value}} characters.","validation.lte.array":"The {{attribute}} must not have more than {{value}} items.","validation.lte.file":"The {{attribute}} must be less than or equal to {{value}} kilobytes.","validation.lte.numeric":"The {{attribute}} must be less than or equal to {{value}}.","validation.lte.string":"The {{attribute}} must be less than or equal to {{value}} characters.","validation.mac_address":"The {{attribute}} must be a valid MAC address.","validation.max.array":"The {{attribute}} must not have more than {{max}} items.","validation.max.file":"The {{attribute}} must not be greater than {{max}} kilobytes.","validation.max.numeric":"The {{attribute}} must not be greater than {{max}}.","validation.max.string":"The {{attribute}} must not be greater than {{max}} characters.","validation.max_digits":"The {{attribute}} must not have more than {{max}} digits.","validation.mimes":"The {{attribute}} must be a file of type: {{values}}.","validation.mimetypes":"The {{attribute}} must be a file of type: {{values}}.","validation.min.array":"The {{attribute}} must have at least {{min}} items.","validation.min.file":"The {{attribute}} must be at least {{min}} kilobytes.","validation.min.numeric":"The {{attribute}} must be at least {{min}}.","validation.min.string":"The {{attribute}} must be at least {{min}} characters.","validation.min_digits":"The {{attribute}} must have at least {{min}} digits.","validation.missing":"The {{attribute}} field must be missing.","validation.missing_if":"The {{attribute}} field must be missing when {{other}} is {{value}}.","validation.missing_unless":"The {{attribute}} field must be missing unless {{other}} is {{value}}.","validation.missing_with":"The {{attribute}} field must be missing when {{values}} is present.","validation.missing_with_all":"The {{attribute}} field must be missing when {{values}} are present.","validation.multiple_of":"The {{attribute}} must be a multiple of {{value}}.","validation.not_in":"The selected {{attribute}} is invalid.","validation.not_regex":"The {{attribute}} format is invalid.","validation.numeric":"The {{attribute}} must be a number.","validation.password.letters":"The {{attribute}} must contain at least one letter.","validation.password.mixed":"The {{attribute}} must contain at least one uppercase and one lowercase letter.","validation.password.numbers":"The {{attribute}} must contain at least one number.","validation.password.symbols":"The {{attribute}} must contain at least one symbol.","validation.password.uncompromised":"The given {{attribute}} has appeared in a data leak. Please choose a different {{attribute}}.","validation.present":"The {{attribute}} field must be present.","validation.prohibited":"The {{attribute}} field is prohibited.","validation.prohibited_if":"The {{attribute}} field is prohibited when {{other}} is {{value}}.","validation.prohibited_unless":"The {{attribute}} field is prohibited unless {{other}} is in {{values}}.","validation.prohibits":"The {{attribute}} field prohibits {{other}} from being present.","validation.regex":"The {{attribute}} format is invalid.","validation.required":"The {{attribute}} field is required.","validation.required_array_keys":"The {{attribute}} field must contain entries for: {{values}}.","validation.required_if":"The {{attribute}} field is required when {{other}} is {{value}}.","validation.required_if_accepted":"The {{attribute}} field is required when {{other}} is accepted.","validation.required_unless":"The {{attribute}} field is required unless {{other}} is in {{values}}.","validation.required_with":"The {{attribute}} field is required when {{values}} is present.","validation.required_with_all":"The {{attribute}} field is required when {{values}} are present.","validation.required_without":"The {{attribute}} field is required when {{values}} is not present.","validation.required_without_all":"The {{attribute}} field is required when none of {{values}} are present.","validation.same":"The {{attribute}} and {{other}} must match.","validation.size.array":"The {{attribute}} must contain {{size}} items.","validation.size.file":"The {{attribute}} must be {{size}} kilobytes.","validation.size.numeric":"The {{attribute}} must be {{size}}.","validation.size.string":"The {{attribute}} must be {{size}} characters.","validation.starts_with":"The {{attribute}} must start with one of the following: {{values}}.","validation.string":"The {{attribute}} must be a string.","validation.timezone":"The {{attribute}} must be a valid timezone.","validation.unique":"The {{attribute}} has already been taken.","validation.uploaded":"The {{attribute}} failed to upload.","validation.uppercase":"The {{attribute}} must be uppercase.","validation.url":"The {{attribute}} must be a valid URL.","validation.ulid":"The {{attribute}} must be a valid ULID.","validation.uuid":"The {{attribute}} must be a valid UUID.","validation.custom.attribute-name.rule-name":"custom-message","validation.unsupported_currency_code":"The currency code you provided is invalid or not supported.","validation.unsupported_period":"The period you provided is invalid or not supported.","validation.unsupported_token_symbol":"The token symbol you provided is invalid or not supported.","validation.gallery_title_required":"Gallery name is required.","validation.gallery_title_max_characters":"The gallery name should not exceed 50 characters.","validation.gallery_title_invalid":"The gallery name is invalid.","validation.nfts_required":"Please add at least one NFT.","validation.nfts_max_size":"Galleries can contain no more than {{limit}} NFTs","validation.invalid_nfts":"The NFT in position {{position}} is invalid, please select another one.","validation.invalid_cover":"You have selected an invalid cover image, please try another one."} \ No newline at end of file From 782100517adcf791bc429a5b24b58feb70458c4e Mon Sep 17 00:00:00 2001 From: Juan Patricio Marroquin Date: Tue, 21 Nov 2023 07:34:11 -0500 Subject: [PATCH 12/61] feat: custom class names for wrapper in GridHeader --- resources/js/Components/GridHeader.tsx | 9 ++++++++- 1 file changed, 8 insertions(+), 1 deletion(-) diff --git a/resources/js/Components/GridHeader.tsx b/resources/js/Components/GridHeader.tsx index 573961a14..fb9f05b9e 100644 --- a/resources/js/Components/GridHeader.tsx +++ b/resources/js/Components/GridHeader.tsx @@ -5,6 +5,7 @@ interface GridHeaderProperties { title: string; value: string | number | JSX.Element | null; className?: string; + wrapperClassName?: string; emptyValue?: string | null; } @@ -12,6 +13,7 @@ export const GridHeader = ({ title, value, className, + wrapperClassName, emptyValue = null, ...properties }: GridHeaderProperties): JSX.Element => { @@ -29,7 +31,12 @@ export const GridHeader = ({ )} {...properties} > -
+
Date: Tue, 21 Nov 2023 07:34:25 -0500 Subject: [PATCH 13/61] test: GridHeader wrapper class names --- resources/js/Components/GridHeader.test.tsx | 12 ++++++++++++ 1 file changed, 12 insertions(+) diff --git a/resources/js/Components/GridHeader.test.tsx b/resources/js/Components/GridHeader.test.tsx index 0fca9a7ec..7052289e1 100644 --- a/resources/js/Components/GridHeader.test.tsx +++ b/resources/js/Components/GridHeader.test.tsx @@ -39,4 +39,16 @@ describe("GridHeader", () => { expect(screen.getByTestId("GridHeader__title")).toHaveTextContent("Test Grid"); expect(screen.getByTestId("GridHeader__value")).toHaveTextContent("Missing Value"); }); + + it("should handle custom class name for wrapper", () => { + render( + , + ); + + expect(screen.getByTestId("GridHeader__wrapper")).toHaveClass("test-wrapper"); + }); }); From ea0a58fb894c9b783ba642d1145f5cdc04d2d216 Mon Sep 17 00:00:00 2001 From: Juan Patricio Marroquin Date: Tue, 21 Nov 2023 07:35:02 -0500 Subject: [PATCH 14/61] feat: custom class names for CollectionNft --- .../Components/CollectionNft/CollectionNft.tsx | 13 +++++++++++-- 1 file changed, 11 insertions(+), 2 deletions(-) diff --git a/resources/js/Pages/Collections/Components/CollectionNft/CollectionNft.tsx b/resources/js/Pages/Collections/Components/CollectionNft/CollectionNft.tsx index c7e76d315..5a8ffb76b 100644 --- a/resources/js/Pages/Collections/Components/CollectionNft/CollectionNft.tsx +++ b/resources/js/Pages/Collections/Components/CollectionNft/CollectionNft.tsx @@ -7,7 +7,13 @@ import { Tooltip } from "@/Components/Tooltip"; import { useIsTruncated } from "@/Hooks/useIsTruncated"; import { isTruthy } from "@/Utils/is-truthy"; -export const CollectionNft = ({ nft }: { nft: App.Data.Gallery.GalleryNftData }): JSX.Element => { +export const CollectionNft = ({ + nft, + classNames, +}: { + nft: App.Data.Gallery.GalleryNftData; + classNames?: string; +}): JSX.Element => { const { t } = useTranslation(); const nftTokenNumberReference = useRef(null); @@ -22,7 +28,10 @@ export const CollectionNft = ({ nft }: { nft: App.Data.Gallery.GalleryNftData }) collection: nft.collectionSlug, nft: nft.tokenNumber, })} - className="transition-default group cursor-pointer rounded-xl border border-theme-secondary-300 p-2 ring-theme-primary-100 hover:ring-2 dark:border-theme-dark-700 dark:ring-theme-dark-700" + className={cn( + "transition-default group cursor-pointer rounded-xl border border-theme-secondary-300 p-2 ring-theme-primary-100 hover:ring-2 dark:border-theme-dark-700 dark:ring-theme-dark-700", + classNames, + )} > Date: Tue, 21 Nov 2023 07:36:43 -0500 Subject: [PATCH 15/61] feat: return featured collections with cached nfts --- app/Http/Controllers/CollectionController.php | 16 ++++++++++++++++ 1 file changed, 16 insertions(+) diff --git a/app/Http/Controllers/CollectionController.php b/app/Http/Controllers/CollectionController.php index 1b7815072..3a6990532 100644 --- a/app/Http/Controllers/CollectionController.php +++ b/app/Http/Controllers/CollectionController.php @@ -7,6 +7,7 @@ use App\Data\Articles\ArticleData; use App\Data\Articles\ArticlesData; use App\Data\Collections\CollectionDetailData; +use App\Data\Collections\CollectionFeaturedData; use App\Data\Collections\CollectionTraitFilterData; use App\Data\Gallery\GalleryNftData; use App\Data\Gallery\GalleryNftsData; @@ -27,6 +28,7 @@ use Illuminate\Http\JsonResponse; use Illuminate\Http\RedirectResponse; use Illuminate\Http\Request; +use Illuminate\Support\Facades\Cache; use Inertia\Inertia; use Inertia\Response; use Spatie\LaravelData\PaginatedDataCollection; @@ -35,9 +37,23 @@ class CollectionController extends Controller { public function index(Request $request): Response|JsonResponse|RedirectResponse { + $user = $request->user(); + + $featuredCollections = Collection::where('is_featured', true) + ->withCount(['nfts']) + ->get(); + + $featuredCollections->each(function (Collection $collection) { + $collection->nfts = Cache::remember('featuredNftsForCollection'.$collection->id, 60 * 12, function () use ($collection) { + return $collection->nfts()->inRandomOrder()->take(3)->get(); + }); + }); return Inertia::render('Collections/Index', [ 'title' => trans('metatags.collections.title'), + 'featuredCollections' => $featuredCollections->map(function (Collection $collection) use ($user) { + return CollectionFeaturedData::fromModel($collection, $user ? $user->currency() : CurrencyCode::USD); + }), ]); } From f6eb1baf3f07b88222d82a75046094adb526dbb6 Mon Sep 17 00:00:00 2001 From: Juan Patricio Marroquin Date: Tue, 21 Nov 2023 07:36:59 -0500 Subject: [PATCH 16/61] chore: update language file --- lang/en/common.php | 1 + 1 file changed, 1 insertion(+) diff --git a/lang/en/common.php b/lang/en/common.php index c0bb6319d..0a3749bae 100644 --- a/lang/en/common.php +++ b/lang/en/common.php @@ -112,6 +112,7 @@ 'n_hours' => '{0} :count hour|{1} :count hour|[2,*] :count hours', 'n_minutes' => '{0} :count minute|{1} :count minute|[2,*] :count minutes', 'report' => 'Report', + 'nfts' => 'NFTs', 'n_nfts' => '{0}NFTs|{1}NFT|[2,*]NFTs', 'n_collections' => '{0}collections|{1}collection|[2,*]collections', 'back' => 'Back', From 35217d10b7b52c32fc4df05db3d9dd420f51b9af Mon Sep 17 00:00:00 2001 From: Juan Patricio Marroquin Date: Tue, 21 Nov 2023 07:40:29 -0500 Subject: [PATCH 17/61] feat: set the max number of decimals as a prop --- resources/js/Utils/Currency.tsx | 7 +++++-- 1 file changed, 5 insertions(+), 2 deletions(-) diff --git a/resources/js/Utils/Currency.tsx b/resources/js/Utils/Currency.tsx index 016e36431..49dc6e9c9 100644 --- a/resources/js/Utils/Currency.tsx +++ b/resources/js/Utils/Currency.tsx @@ -19,6 +19,7 @@ interface FiatProperties extends CurrencyProperties { interface CryptoProperties { value: string; token: App.Data.Token.TokenData | Pick; + maximumFractionDigits?: number; } const fiatValue = ({ @@ -95,6 +96,7 @@ export const formatCrypto = ({ value, token, t, + maximumFractionDigits = 4, }: CryptoProperties & { t: TFunction<"translation", undefined, "translation">; }): string => { @@ -105,19 +107,20 @@ export const formatCrypto = ({ value: { lng: browserLocale(), minimumFractionDigits: 0, - maximumFractionDigits: 4, + maximumFractionDigits, }, }, }); }; -export const FormatCrypto = ({ value, token }: CryptoProperties): JSX.Element => { +export const FormatCrypto = ({ value, token, maximumFractionDigits }: CryptoProperties): JSX.Element => { const { t } = useTranslation(); const number = formatCrypto({ value, token, t, + maximumFractionDigits, }); return <>{`${number} ${token.symbol.toUpperCase()}`}; From 54ea79759a044ff3c04c54bd95e9d8ccc8a6f139 Mon Sep 17 00:00:00 2001 From: Juan Patricio Marroquin Date: Tue, 21 Nov 2023 07:40:45 -0500 Subject: [PATCH 18/61] test: max number of decimals in FormatCrypto --- resources/js/Utils/Currency.test.tsx | 14 ++++++++++++++ 1 file changed, 14 insertions(+) diff --git a/resources/js/Utils/Currency.test.tsx b/resources/js/Utils/Currency.test.tsx index c4ee278bc..9a3a2feba 100644 --- a/resources/js/Utils/Currency.test.tsx +++ b/resources/js/Utils/Currency.test.tsx @@ -82,6 +82,20 @@ describe("Currency helpers", () => { expect(screen.getByText("123,456.1235 ETH")).toBeTruthy(); }); + + it("should display as many decimals as in maximumFractionDigits", () => { + render( + + + , + ); + + expect(screen.getByText("123,456.12 ETH")).toBeTruthy(); + }); }); describe("FormatNumber", () => { From abbe9a66ce809daeb26da6635e176dff6c7de760 Mon Sep 17 00:00:00 2001 From: Juan Patricio Marroquin Date: Tue, 21 Nov 2023 07:41:03 -0500 Subject: [PATCH 19/61] feat: initial export of FeaturedCollectionsSlider --- .../Pages/Collections/Components/FeaturedCollections/index.tsx | 1 + 1 file changed, 1 insertion(+) create mode 100644 resources/js/Pages/Collections/Components/FeaturedCollections/index.tsx diff --git a/resources/js/Pages/Collections/Components/FeaturedCollections/index.tsx b/resources/js/Pages/Collections/Components/FeaturedCollections/index.tsx new file mode 100644 index 000000000..25ab9444f --- /dev/null +++ b/resources/js/Pages/Collections/Components/FeaturedCollections/index.tsx @@ -0,0 +1 @@ +export * from "./FeaturedCollectionsSlider"; From 3fae3d6cd5a176854cdaff93cbb5ac47c6bcc1e6 Mon Sep 17 00:00:00 2001 From: Juan Patricio Marroquin Date: Tue, 21 Nov 2023 07:41:20 -0500 Subject: [PATCH 20/61] feat: initial implementation for FeaturedCollectionsSlider --- resources/js/Pages/Collections/Index.tsx | 12 +++++++++++- 1 file changed, 11 insertions(+), 1 deletion(-) diff --git a/resources/js/Pages/Collections/Index.tsx b/resources/js/Pages/Collections/Index.tsx index 2e3e5750b..68a659904 100644 --- a/resources/js/Pages/Collections/Index.tsx +++ b/resources/js/Pages/Collections/Index.tsx @@ -1,12 +1,22 @@ import { Head, usePage } from "@inertiajs/react"; +import { FeaturedCollectionsSlider } from "./Components/FeaturedCollections"; import { DefaultLayout } from "@/Layouts/DefaultLayout"; -const CollectionsIndex = ({ title }: { title: string }): JSX.Element => { +const CollectionsIndex = ({ + title, + featuredCollections, +}: { + title: string; + featuredCollections: App.Data.Collections.CollectionFeaturedData[]; +}): JSX.Element => { const { props } = usePage(); return ( +
+ +
); }; From 04e089179c78bb5b8db9788ff125cfe3913df510 Mon Sep 17 00:00:00 2001 From: Juan Patricio Marroquin Date: Tue, 21 Nov 2023 07:41:41 -0500 Subject: [PATCH 21/61] feat: initial mobile design for FeaturedCollectionsSlider card --- .../FeaturedCollectionsSlider.tsx | 148 ++++++++++++++++++ 1 file changed, 148 insertions(+) create mode 100644 resources/js/Pages/Collections/Components/FeaturedCollections/FeaturedCollectionsSlider.tsx diff --git a/resources/js/Pages/Collections/Components/FeaturedCollections/FeaturedCollectionsSlider.tsx b/resources/js/Pages/Collections/Components/FeaturedCollections/FeaturedCollectionsSlider.tsx new file mode 100644 index 000000000..28d2f72b6 --- /dev/null +++ b/resources/js/Pages/Collections/Components/FeaturedCollections/FeaturedCollectionsSlider.tsx @@ -0,0 +1,148 @@ +import React from "react"; +import { useTranslation } from "react-i18next"; +import { ButtonLink } from "@/Components/Buttons/ButtonLink"; +import { GridHeader } from "@/Components/GridHeader"; +import { Heading } from "@/Components/Heading"; +import { Img } from "@/Components/Image"; +import { NetworkIcon } from "@/Components/Networks/NetworkIcon"; +import { CollectionNft } from "@/Pages/Collections/Components/CollectionNft"; +import { FormatCrypto } from "@/Utils/Currency"; + +const truncateDescription = ( + description: App.Data.Collections.CollectionFeaturedData["description"], +): string | null => { + if (description !== null && description.length > 120) { + return description.slice(0, 120) + "..."; + } + + return description; +}; + +export const FeaturedCollectionsSlider = ({ + featuredCollections, +}: { + featuredCollections: App.Data.Collections.CollectionFeaturedData[]; +}): JSX.Element => { + const { t } = useTranslation(); + const testCollection = featuredCollections[3]; + + const token: Pick = { + name: "", + symbol: testCollection.floorPriceCurrency ?? "", + decimals: testCollection.floorPriceDecimals ?? 18, + }; + console.log({ testCollection }); + + return ( +
+ {/* Featured Collections Background */} +
+ {testCollection.name}} + /> + +
+
+ + {/* Featured Collections Content */} +
+
+ {/* Featured Collections Data */} +
+ {/* Featured Collections Header */} +
+
+ + +
+ +
+
+ +
+ + {t("pages.collections.featured.title")} + + + {testCollection.name} + +
+
+ + {/* Featured Collections Body */} +
+ {truncateDescription(testCollection.description)} +
+ + {/* Featured Collections Footer */} +
+
+ +
+ + } + /> +
+ + } + /> +
+ + + {t("pages.collections.featured.button")} + +
+
+ + {/* Featured Collections Nfts */} +
+ +
+
+
+
+ ); +}; From fc2a39c0195662c39b526eadbc23cc470332253f Mon Sep 17 00:00:00 2001 From: Juan Patricio Marroquin Date: Tue, 21 Nov 2023 10:41:38 -0500 Subject: [PATCH 22/61] fix: add test id for grid header wrapper --- resources/js/Components/GridHeader.tsx | 1 + 1 file changed, 1 insertion(+) diff --git a/resources/js/Components/GridHeader.tsx b/resources/js/Components/GridHeader.tsx index fb9f05b9e..a81b61cec 100644 --- a/resources/js/Components/GridHeader.tsx +++ b/resources/js/Components/GridHeader.tsx @@ -36,6 +36,7 @@ export const GridHeader = ({ "mr-auto flex w-[100px] flex-col space-y-0.5 font-medium md:w-[110px] lg:w-auto", wrapperClassName, )} + data-testid="GridHeader__wrapper" > Date: Thu, 23 Nov 2023 09:14:14 -0500 Subject: [PATCH 23/61] feat: add fade effect for swiper --- resources/css/_carousel.css | 2 ++ 1 file changed, 2 insertions(+) diff --git a/resources/css/_carousel.css b/resources/css/_carousel.css index 2a8c24b04..78d982678 100644 --- a/resources/css/_carousel.css +++ b/resources/css/_carousel.css @@ -1,3 +1,5 @@ @import "swiper/css"; @import "swiper/css/grid"; @import "swiper/css/pagination"; +@import "swiper/css/effect-fade"; + From bde04078f45495356ac306ea830011a11cc5427b Mon Sep 17 00:00:00 2001 From: Juan Patricio Marroquin Date: Thu, 23 Nov 2023 09:14:52 -0500 Subject: [PATCH 24/61] feat: featured collections gradient for desktop view --- resources/css/app.css | 16 ++++++++++++++++ 1 file changed, 16 insertions(+) diff --git a/resources/css/app.css b/resources/css/app.css index f6463e0fb..fd59d31a1 100644 --- a/resources/css/app.css +++ b/resources/css/app.css @@ -64,3 +64,19 @@ rgb(var(--theme-color-dark-800)) 41.03%, transparent 208.87%); } + +@media (min-width: 960px) { + .featured-collections-overlay { + background-image: linear-gradient( + 90deg, + rgb(var(--theme-color-primary-50)) 55.67%, + transparent 151.85%); + } + + .dark .featured-collections-overlay { + background-image: linear-gradient( + 90deg, + rgb(var(--theme-color-dark-800)) 55.67%, + transparent 151.85%); + } +} From 858d5c9f27230c7a850b461c3d09c0b11f08e5b4 Mon Sep 17 00:00:00 2001 From: Juan Patricio Marroquin Date: Thu, 23 Nov 2023 09:15:24 -0500 Subject: [PATCH 25/61] feat: FeaturedCollectionsItem --- ...Slider.tsx => FeaturedCollectionsItem.tsx} | 68 +++++++++++-------- 1 file changed, 39 insertions(+), 29 deletions(-) rename resources/js/Pages/Collections/Components/FeaturedCollections/{FeaturedCollectionsSlider.tsx => FeaturedCollectionsItem.tsx} (69%) diff --git a/resources/js/Pages/Collections/Components/FeaturedCollections/FeaturedCollectionsSlider.tsx b/resources/js/Pages/Collections/Components/FeaturedCollections/FeaturedCollectionsItem.tsx similarity index 69% rename from resources/js/Pages/Collections/Components/FeaturedCollections/FeaturedCollectionsSlider.tsx rename to resources/js/Pages/Collections/Components/FeaturedCollections/FeaturedCollectionsItem.tsx index 28d2f72b6..2e0155fe2 100644 --- a/resources/js/Pages/Collections/Components/FeaturedCollections/FeaturedCollectionsSlider.tsx +++ b/resources/js/Pages/Collections/Components/FeaturedCollections/FeaturedCollectionsItem.tsx @@ -18,30 +18,28 @@ const truncateDescription = ( return description; }; -export const FeaturedCollectionsSlider = ({ - featuredCollections, +export const FeaturedCollectionsItem = ({ + data, }: { - featuredCollections: App.Data.Collections.CollectionFeaturedData[]; + data: App.Data.Collections.CollectionFeaturedData; }): JSX.Element => { const { t } = useTranslation(); - const testCollection = featuredCollections[3]; const token: Pick = { name: "", - symbol: testCollection.floorPriceCurrency ?? "", - decimals: testCollection.floorPriceDecimals ?? 18, + symbol: data.floorPriceCurrency ?? "", + decimals: data.floorPriceDecimals ?? 18, }; - console.log({ testCollection }); return (
{/* Featured Collections Background */} -
+
{testCollection.name}} /> @@ -49,22 +47,22 @@ export const FeaturedCollectionsSlider = ({
{/* Featured Collections Content */} -
-
+
+
{/* Featured Collections Data */} -
+
{/* Featured Collections Header */}
-
- +
+
@@ -76,45 +74,45 @@ export const FeaturedCollectionsSlider = ({ className="text-xl" level={3} > - {testCollection.name} + {data.name}
{/* Featured Collections Body */}
- {truncateDescription(testCollection.description)} + {truncateDescription(data.description)}
{/* Featured Collections Footer */} -
+
-
+
} /> -
+
@@ -123,10 +121,10 @@ export const FeaturedCollectionsSlider = ({
{t("pages.collections.featured.button")} @@ -135,11 +133,23 @@ export const FeaturedCollectionsSlider = ({
{/* Featured Collections Nfts */} -
+
+ {data.nfts.length > 1 && ( + + )} + {data.nfts.length > 2 && ( + + )}
From eb74321f22841e5e1a3941504aad295eb1052ba6 Mon Sep 17 00:00:00 2001 From: Juan Patricio Marroquin Date: Thu, 23 Nov 2023 09:15:37 -0500 Subject: [PATCH 26/61] chore: update exports for FeaturedCollections --- .../Pages/Collections/Components/FeaturedCollections/index.tsx | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/resources/js/Pages/Collections/Components/FeaturedCollections/index.tsx b/resources/js/Pages/Collections/Components/FeaturedCollections/index.tsx index 25ab9444f..9f2f32e74 100644 --- a/resources/js/Pages/Collections/Components/FeaturedCollections/index.tsx +++ b/resources/js/Pages/Collections/Components/FeaturedCollections/index.tsx @@ -1 +1,2 @@ -export * from "./FeaturedCollectionsSlider"; +export * from "./FeaturedCollectionsCarousel"; +export * from "./FeaturedCollectionsItem"; From 845f8f62e941a42dab030a8d53b1d1bcd31805b2 Mon Sep 17 00:00:00 2001 From: Juan Patricio Marroquin Date: Thu, 23 Nov 2023 09:15:57 -0500 Subject: [PATCH 27/61] fix: remove fade effect --- resources/css/_carousel.css | 1 - 1 file changed, 1 deletion(-) diff --git a/resources/css/_carousel.css b/resources/css/_carousel.css index 78d982678..049ab2416 100644 --- a/resources/css/_carousel.css +++ b/resources/css/_carousel.css @@ -1,5 +1,4 @@ @import "swiper/css"; @import "swiper/css/grid"; @import "swiper/css/pagination"; -@import "swiper/css/effect-fade"; From d17c41b274c27840129ca8132ac49902a54da82c Mon Sep 17 00:00:00 2001 From: Juan Patricio Marroquin Date: Thu, 23 Nov 2023 09:16:18 -0500 Subject: [PATCH 28/61] feat: FeaturedCollectionsCarousel --- .../FeaturedCollectionsCarousel.tsx | 30 +++++++++++++++++++ 1 file changed, 30 insertions(+) create mode 100644 resources/js/Pages/Collections/Components/FeaturedCollections/FeaturedCollectionsCarousel.tsx diff --git a/resources/js/Pages/Collections/Components/FeaturedCollections/FeaturedCollectionsCarousel.tsx b/resources/js/Pages/Collections/Components/FeaturedCollections/FeaturedCollectionsCarousel.tsx new file mode 100644 index 000000000..c78a8eb2a --- /dev/null +++ b/resources/js/Pages/Collections/Components/FeaturedCollections/FeaturedCollectionsCarousel.tsx @@ -0,0 +1,30 @@ +import React from "react"; +import { Autoplay, EffectFade, Navigation, Pagination } from "swiper"; +import { FeaturedCollectionsItem } from "./FeaturedCollectionsItem"; +import { Carousel, CarouselItem } from "@/Components/Carousel"; + +export const FeaturedCollectionsCarousel = ({ + featuredCollections, +}: { + featuredCollections: App.Data.Collections.CollectionFeaturedData[]; +}): JSX.Element => ( + + {featuredCollections.map((collection, index) => ( + + + + ))} + +); From 93ea35fe8b0314550942282971cc6861e23efd73 Mon Sep 17 00:00:00 2001 From: Juan Patricio Marroquin Date: Thu, 23 Nov 2023 09:16:35 -0500 Subject: [PATCH 29/61] feat: implement carousel --- resources/js/Pages/Collections/Index.tsx | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/resources/js/Pages/Collections/Index.tsx b/resources/js/Pages/Collections/Index.tsx index 68a659904..c6c2a2d51 100644 --- a/resources/js/Pages/Collections/Index.tsx +++ b/resources/js/Pages/Collections/Index.tsx @@ -1,5 +1,5 @@ import { Head, usePage } from "@inertiajs/react"; -import { FeaturedCollectionsSlider } from "./Components/FeaturedCollections"; +import { FeaturedCollectionsCarousel } from "./Components/FeaturedCollections"; import { DefaultLayout } from "@/Layouts/DefaultLayout"; const CollectionsIndex = ({ @@ -15,7 +15,7 @@ const CollectionsIndex = ({
- +
); From 5e38d9a1e1e5497e08dc9852635a082564f688e8 Mon Sep 17 00:00:00 2001 From: Juan Patricio Marroquin Date: Thu, 23 Nov 2023 09:27:12 -0500 Subject: [PATCH 30/61] feat: add featured collections for collections seeder --- database/seeders/NftSeeder.php | 4 ++++ 1 file changed, 4 insertions(+) diff --git a/database/seeders/NftSeeder.php b/database/seeders/NftSeeder.php index 895244e59..917e191e8 100644 --- a/database/seeders/NftSeeder.php +++ b/database/seeders/NftSeeder.php @@ -40,6 +40,7 @@ public function run(): void 'website' => $collectionArray['website'], ]), 'created_at' => fake()->dateTimeBetween('-2 months'), + 'is_featured' => $collectionArray['is_featured'] ?? false, ]); if (Feature::active(Features::Collections->value)) { @@ -122,6 +123,7 @@ private function collections(): array ['Background', 'Cosmic Purple', TraitDisplayType::Property, 6, 0.06], ['Beak', 'Small', TraitDisplayType::Property, 4125, 42.15], ], + 'is_featured' => true, ], [ // https://opensea.io/collection/timelessnfts @@ -158,6 +160,7 @@ private function collections(): array 'traits' => [ ['Background', 'Blue', TraitDisplayType::Property, 1636, 16.36], ], + 'is_featured' => true, ], [ // https://opensea.io/collection/alphadogs @@ -176,6 +179,7 @@ private function collections(): array 'traits' => [ ['Background', 'Blue', TraitDisplayType::Property, 1636, 16.36], ], + 'is_featured' => true, ], [ // https://opensea.io/collection/devilvalley From 04184bf90d907bda80454c8be67c38c76ee21834 Mon Sep 17 00:00:00 2001 From: Juan Patricio Marroquin Date: Thu, 23 Nov 2023 09:28:09 -0500 Subject: [PATCH 31/61] fix: remove fade effect from carousel --- .../FeaturedCollections/FeaturedCollectionsCarousel.tsx | 6 ++---- 1 file changed, 2 insertions(+), 4 deletions(-) diff --git a/resources/js/Pages/Collections/Components/FeaturedCollections/FeaturedCollectionsCarousel.tsx b/resources/js/Pages/Collections/Components/FeaturedCollections/FeaturedCollectionsCarousel.tsx index c78a8eb2a..5e81cb94a 100644 --- a/resources/js/Pages/Collections/Components/FeaturedCollections/FeaturedCollectionsCarousel.tsx +++ b/resources/js/Pages/Collections/Components/FeaturedCollections/FeaturedCollectionsCarousel.tsx @@ -1,5 +1,5 @@ import React from "react"; -import { Autoplay, EffectFade, Navigation, Pagination } from "swiper"; +import { Autoplay, Navigation, Pagination } from "swiper"; import { FeaturedCollectionsItem } from "./FeaturedCollectionsItem"; import { Carousel, CarouselItem } from "@/Components/Carousel"; @@ -12,14 +12,12 @@ export const FeaturedCollectionsCarousel = ({ shouldShowHeader={false} loop={true} className="overflow-hidden lg:mx-8 lg:rounded-xl 2xl:mx-0" - effect={"fade"} - speed={1000} navigation={true} autoplay={{ delay: 5000, pauseOnMouseEnter: true, }} - modules={[Navigation, Pagination, EffectFade, Autoplay]} + modules={[Navigation, Pagination, Autoplay]} > {featuredCollections.map((collection, index) => ( From e545b4e8059efc08dbcd85ed44ae2099be6b6340 Mon Sep 17 00:00:00 2001 From: Juan Patricio Marroquin Date: Thu, 23 Nov 2023 09:28:44 -0500 Subject: [PATCH 32/61] fix: remove comments --- .../FeaturedCollections/FeaturedCollectionsItem.tsx | 7 ------- 1 file changed, 7 deletions(-) diff --git a/resources/js/Pages/Collections/Components/FeaturedCollections/FeaturedCollectionsItem.tsx b/resources/js/Pages/Collections/Components/FeaturedCollections/FeaturedCollectionsItem.tsx index 2e0155fe2..27eafa8b9 100644 --- a/resources/js/Pages/Collections/Components/FeaturedCollections/FeaturedCollectionsItem.tsx +++ b/resources/js/Pages/Collections/Components/FeaturedCollections/FeaturedCollectionsItem.tsx @@ -33,7 +33,6 @@ export const FeaturedCollectionsItem = ({ return (
- {/* Featured Collections Background */}
- {/* Featured Collections Content */}
- {/* Featured Collections Data */}
- {/* Featured Collections Header */}
- {/* Featured Collections Body */}
{truncateDescription(data.description)}
- {/* Featured Collections Footer */}
- {/* Featured Collections Nfts */}
Date: Thu, 23 Nov 2023 09:32:01 -0500 Subject: [PATCH 33/61] feat: FeaturedCollectionInfo --- .../FeaturedCollectionsItem.tsx | 215 +++++++++--------- 1 file changed, 109 insertions(+), 106 deletions(-) diff --git a/resources/js/Pages/Collections/Components/FeaturedCollections/FeaturedCollectionsItem.tsx b/resources/js/Pages/Collections/Components/FeaturedCollections/FeaturedCollectionsItem.tsx index 27eafa8b9..75626ba3e 100644 --- a/resources/js/Pages/Collections/Components/FeaturedCollections/FeaturedCollectionsItem.tsx +++ b/resources/js/Pages/Collections/Components/FeaturedCollections/FeaturedCollectionsItem.tsx @@ -18,11 +18,7 @@ const truncateDescription = ( return description; }; -export const FeaturedCollectionsItem = ({ - data, -}: { - data: App.Data.Collections.CollectionFeaturedData; -}): JSX.Element => { +const FeaturedCollectionInfo = ({ data }: { data: App.Data.Collections.CollectionFeaturedData }): JSX.Element => { const { t } = useTranslation(); const token: Pick = { @@ -30,122 +26,129 @@ export const FeaturedCollectionsItem = ({ symbol: data.floorPriceCurrency ?? "", decimals: data.floorPriceDecimals ?? 18, }; - return ( -
-
- {data.name}} - /> - -
-
- -
-
-
-
-
- - -
- -
-
+
+
+
+
+
+ -
- - {t("pages.collections.featured.title")} - - - {data.name} - +
+
-
- {truncateDescription(data.description)} +
+ + {t("pages.collections.featured.title")} + + + {data.name} +
+
-
-
- -
- - } - /> -
- - } - /> -
+
+ {truncateDescription(data.description)} +
- - {t("pages.collections.featured.button")} - +
+
+ +
+ + } + /> +
+ + } + />
+ + + {t("pages.collections.featured.button")} +
+
-
+
+ + {data.nfts.length > 1 && ( - {data.nfts.length > 1 && ( - - )} - {data.nfts.length > 2 && ( - - )} -
+ )} + {data.nfts.length > 2 && ( + + )}
); }; + +export const FeaturedCollectionsItem = ({ + data, +}: { + data: App.Data.Collections.CollectionFeaturedData; +}): JSX.Element => ( +
+
+ {data.name}} + /> + +
+
+ + +
+); From 7a3acab852d03c50fdf48c63ea7767c6515c3b41 Mon Sep 17 00:00:00 2001 From: Juan Patricio Marroquin Date: Thu, 23 Nov 2023 09:43:35 -0500 Subject: [PATCH 34/61] fix: set default styles for nft cards --- .../FeaturedCollections/FeaturedCollectionsItem.tsx | 12 ++++++++---- 1 file changed, 8 insertions(+), 4 deletions(-) diff --git a/resources/js/Pages/Collections/Components/FeaturedCollections/FeaturedCollectionsItem.tsx b/resources/js/Pages/Collections/Components/FeaturedCollections/FeaturedCollectionsItem.tsx index 75626ba3e..50144d466 100644 --- a/resources/js/Pages/Collections/Components/FeaturedCollections/FeaturedCollectionsItem.tsx +++ b/resources/js/Pages/Collections/Components/FeaturedCollections/FeaturedCollectionsItem.tsx @@ -1,3 +1,4 @@ +import cn from "classnames"; import React from "react"; import { useTranslation } from "react-i18next"; import { ButtonLink } from "@/Components/Buttons/ButtonLink"; @@ -21,6 +22,9 @@ const truncateDescription = ( const FeaturedCollectionInfo = ({ data }: { data: App.Data.Collections.CollectionFeaturedData }): JSX.Element => { const { t } = useTranslation(); + const defaultNftCardStyles = + "bg-white dark:bg-theme-dark-900 grid w-full h-full min-w-full lg:min-w-fit lg:w-52 lg:h-fit"; + const token: Pick = { name: "", symbol: data.floorPriceCurrency ?? "", @@ -57,7 +61,7 @@ const FeaturedCollectionInfo = ({ data }: { data: App.Data.Collections.Collectio
-
+
{truncateDescription(data.description)}
@@ -111,18 +115,18 @@ const FeaturedCollectionInfo = ({ data }: { data: App.Data.Collections.Collectio
{data.nfts.length > 1 && ( )} {data.nfts.length > 2 && (
From 329788a3e49528eda17deadcb14fd567a61d886b Mon Sep 17 00:00:00 2001 From: Juan Patricio Marroquin Date: Thu, 23 Nov 2023 09:46:22 -0500 Subject: [PATCH 35/61] feat: default descriptions for collections seeder --- database/seeders/NftSeeder.php | 5 +++++ 1 file changed, 5 insertions(+) diff --git a/database/seeders/NftSeeder.php b/database/seeders/NftSeeder.php index 917e191e8..f200f6cd7 100644 --- a/database/seeders/NftSeeder.php +++ b/database/seeders/NftSeeder.php @@ -41,6 +41,7 @@ public function run(): void ]), 'created_at' => fake()->dateTimeBetween('-2 months'), 'is_featured' => $collectionArray['is_featured'] ?? false, + 'description' => $collectionArray['description'] ?? '', ]); if (Feature::active(Features::Collections->value)) { @@ -124,6 +125,7 @@ private function collections(): array ['Beak', 'Small', TraitDisplayType::Property, 4125, 42.15], ], 'is_featured' => true, + 'description' => 'Moonbirds are a collection of 10,000 unique NFTs living on the Ethereum blockchain. Each Moonbird is algorithmically generated and has a unique combination of traits, including body, eyes, beak, wings, and background. Moonbirds are a Proof NFT project.', ], [ // https://opensea.io/collection/timelessnfts @@ -161,6 +163,7 @@ private function collections(): array ['Background', 'Blue', TraitDisplayType::Property, 1636, 16.36], ], 'is_featured' => true, + 'description' => 'Tubby Cats are a collection of 10,000 unique NFTs living on the Ethereum blockchain. Each Tubby Cat is algorithmically generated and has a unique combination of traits, including body, eyes, mouth, and background. Tubby Cats are a Proof NFT project.', ], [ // https://opensea.io/collection/alphadogs @@ -214,6 +217,8 @@ private function collections(): array 'traits' => [ ['Beak', 'Small', TraitDisplayType::Property, 4125, 42.15], ], + 'is_featured' => true, + 'description' => 'EDGEHOGS are a collection of 10,000 unique NFTs living on the Ethereum blockchain. Each EDGEHOG is algorithmically generated and has a unique combination of traits, including body, eyes, beak, wings, and background. EDGEHOGS are a Proof NFT project.', ], [ // https://opensea.io/collection/cryptoadz-by-gremplin From fff28d1b7e960375935bd17b9f63408d27e9ed55 Mon Sep 17 00:00:00 2001 From: Juan Patricio Marroquin Date: Thu, 23 Nov 2023 09:54:51 -0500 Subject: [PATCH 36/61] chore: update language file --- resources/js/I18n/Locales/en.json | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/resources/js/I18n/Locales/en.json b/resources/js/I18n/Locales/en.json index 21376c2de..489f3d115 100644 --- a/resources/js/I18n/Locales/en.json +++ b/resources/js/I18n/Locales/en.json @@ -1 +1 @@ -{"auth.welcome":"Welcome to Dashbrd","auth.logged_in":"You're logged in!","auth.log_out":"Log out","auth.failed":"These credentials do not match our records.","auth.session_timeout":"Your session has timed out. Please refresh the page and try connecting your account again.","auth.session_timeout_modal":"Seems like your session has timed out. Please connnect your wallet again.","auth.password":"The provided password is incorrect.","auth.throttle":"Too many login attempts. Please try again in {{seconds}} seconds.","auth.wallet.connecting":"Connecting …","auth.wallet.waiting_for_signature":"Waiting for Signature …","auth.wallet.switching_wallet":"Switching Wallet …","auth.wallet.connect":"Connect Wallet","auth.wallet.connect_long":"Connect Your Wallet to Get Started","auth.wallet.sign_subtitle":"Connect Your Wallet to Continue","auth.wallet.disconnect":"Disconnect Wallet","auth.wallet.install":"Install MetaMask","auth.wallet.install_long":"Install MetaMask to Get Started","auth.wallet.sign":"Sign Message","auth.wallet.sign_message":"Welcome to Dashbrd. In order to login, sign this message with your wallet. It doesn't cost you anything!\n\nSigning ID (you can ignore this): {{nonce}}","auth.wallet.connect_subtitle":"Click on the MetaMask icon in your browser to confirm the action and connect your wallet.","auth.wallet.requires_signature":"In order to prevent impersonation, we require a signature to perform this action. This signature is only a signed message and does not give any access to your wallet.","auth.errors.metamask.no_account":"No account found. Please connect your wallet and try again.","auth.errors.metamask.generic":"Connection attempt error. Please retry and follow the steps to connect your wallet.","auth.errors.metamask.invalid_network":"Please switch to Polygon or Ethereum Mainnet in your MetaMask plugin to connect to Dashbrd.","auth.errors.metamask.provider_missing":"You don't have MetaMask installed in your browser. Please install and try again.","auth.errors.metamask.user_rejected":"It looks like you cancelled signing of the authentication message. Please try again.","auth.errors.metamask.provider_not_set":"Ethereum provider is not set","auth.validation.wallet_login_failed":"There was a problem trying to verify your signature. Please try again.","auth.validation.invalid_address":"Your wallet address is invalid. Please try again.","auth.validation.invalid_signature":"Signature is invalid. Please try again.","auth.validation.invalid_network":"Please switch to Polygon or Ethereum Mainnet in your MetaMask plugin to connect to Dashbrd.","common.author":"Author","common.add":"Add","common.amount":"Amount","common.balance":"Balance","common.cancel":"Cancel","common.delete":"Delete","common.edit":"Edit","common.confirm":"Confirm","common.connect":"Connect","common.continue":"Continue","common.done":"Done","common.filter":"Filter","common.items":"Items","common.receive":"Receive","common.received":"Received","common.retry":"Retry","common.records":"Records","common.save":"Save","common.send":"Send","common.sent":"Sent","common.show":"Show","common.searching":"Searching...","common.other":"Other","common.owned":"Owned","common.token":"Token","common.tokens":"Tokens","common.wallet":"Wallet","common.pending":"Pending","common.publish":"Publish","common.published":"Published","common.empty":"Empty","common.your_address":"Your Address","common.warning":"Warning","common.my_address":"My Address","common.my_wallet":"My Wallet","common.my_balance":"My Balance","common.na":"N/A","common.simple_plural_without_data":"One comment|Many comments","common.simple_plural_with_data":"{{count}} comment|{{count}} comments","common.advanced_plural_without_data":"{0} no comments yet|{1} 1 comment|[2,*] Many comments","common.advanced_plural_with_data":"{0} no comments yet|{1} 1 comment|[2,*] {{count}} comments","common.copy_clipboard":"Copy to Clipboard","common.copy":"Copy","common.download":"Download","common.zoom":"Zoom","common.my_collection":"My Collection","common.max":"Max","common.chain":"Chain","common.copied":"Copied!","common.coming_soon":"Coming Soon","common.more_details":"More Details","common.close":"Close","common.close_toast":"Close toast","common.loading":"Loading","common.price":"Price","common.articles":"Articles","common.most_popular":"Most Popular","common.market_cap":"Market Cap","common.volume":"Volume {{frequency}}","common.value":"Value","common.last_n_days":"Last {{count}} Days","common.details":"Details","common.view_all":"View All","common.view_more_on_polygonscan":"View More on Polygonscan","common.view_more_on_etherscan":"View More on Etherscan","common.view_nft_on_etherscan":"View NFT on Etherscan","common.view_nft_on_polygonscan":"View NFT on Polygonscan","common.view_nft_on_goerli_tesnet":"View NFT on Goerli Testnet Explorer","common.view_nft_on_mumbai_tesnet":"View NFT on Mumbai Testnet Explorer","common.polygonscan":"Polygonscan","common.etherscan":"Etherscan","common.featured":"Featured","common.floor_price":"Floor Price","common.floor":"Floor","common.supply":"Supply","common.owners":"Owners","common.created":"Created","common.nft":"NFT","common.collection":"Collection","common.collections":"Collections","common.gallery":"Gallery","common.basic_gallery":"Basic Gallery","common.gallery_name":"Gallery Name","common.create_gallery":"Create Gallery","common.external_link":"External Link","common.follow_link":"Follow Link","common.cover":"Cover","common.template":"Template","common.page":"Page","common.polygon":"Polygon","common.ethereum":"Ethereum","common.mumbai":"Mumbai","common.goerli":"Goerli","common.of":"of","common.pagination_input_placeholder":"Enter the page number","common.pagination_input_placeholder_mobile":"Page number","common.nft_count":"{0} {{count}} NFTs|{1} {{count}} NFT|[2,*] {{count}} NFTs","common.nft_gallery":"NFT Gallery","common.unable_to_retrieve_image":"Unable to retrieve your NFT image at this time","common.optional":"Optional","common.selected":"Selected","common.select":"Select","common.preview":"Preview","common.image_size_error":"Image size must not exceed 2MB","common.image_dimensions_error":"Image dimensions must exceed 287px x 190px","common.write_to_confirm":"Write {{word}} to confirm","common.n_hours":"{0} {{count}} hour|{1} {{count}} hour|[2,*] {{count}} hours","common.n_minutes":"{0} {{count}} minute|{1} {{count}} minute|[2,*] {{count}} minutes","common.report":"Report","common.nfts":"NFTs","common.n_nfts":"{0}NFTs|{1}NFT|[2,*]NFTs","common.n_collections":"{0}collections|{1}collection|[2,*]collections","common.back":"Back","common.back_to":"Back to","common.name":"Name","common.type":"Type","common.from":"From","common.to":"To","common.sale_price":"Sale Price","common.recent_activity":"Recent Activity","common.time":"Time","common.datetime.few_seconds_ago":"A few seconds ago","common.datetime.minutes_ago":"{0} Less than a minute ago|{1} A minute ago|[2,*] {{count}} minutes ago","common.datetime.hours_ago":"{0} Less than an hour ago|{1} An hour ago|[2,*] {{count}} hours ago","common.datetime.days_ago":"{0} Less than a day ago|{1} A day ago|[2,*] {{count}} days ago","common.datetime.weeks_ago":"{0} Less than a week ago|{1} A week ago|[2,*] {{count}} weeks ago","common.datetime.months_ago":"{0} Less than a month ago|{1} A month ago|[2,*] {{count}} months ago","common.datetime.years_ago":"{0} Less than a year ago|{1} A year ago|[2,*] {{count}} years ago","common.no_traits_found":"No traits found.","common.empty_transactions":"You don't have any transactions yet. Once transactions have been made, they will show up here.","common.error":"Error","common.refresh":"Refresh","common.refresh_metadata":"Refresh Metadata","common.refreshing_metadata":"Refreshing Metadata... Please check back later.","common.refreshing_activity":"Refreshing Activity... Please check back later.","common.pending_confirmation":"Pending Confirmation","common.confirmed_transaction":"Confirmed Transaction","common.transaction_error":"Transaction Error","common.transaction_error_description_first_part":"Your transaction encountered an error. View this transaction on","common.transaction_error_description_second_part":"for more details.","common.home":"Home","common.contact":"Contact","common.menu":"Menu","common.website":"Website","common.twitter":"Twitter","common.discord":"Discord","common.facebook":"Facebook","common.reddit":"Reddit","common.x":"X","common.sort":"Sort","common.drafts":"Drafts","common.draft":"Draft","common.delete_draft":"Delete Draft","common.share_on":"Share on {{platform}}","footer.copyright":"{{year}} © Dashbrd. All rights reserved.","footer.all_rights_reserved":"All rights reserved","footer.privacy_policy":"Privacy Policy","footer.terms_of_service":"Terms of Service","footer.powered_by":"Powered by","format.fiat":"{{ value, currency }}","format.number":"{{ value, number }}","metatags.home.title":"Dashbrd | Web3 Portfolio Management Made Simple","metatags.home.description":"Simplify your Web3 journey with Dashbrd. Manage your portfolio of tokens, NFTs, and other digital collectibles across the Ethereum and Polygon blockchains.","metatags.home.image":"/images/meta/home.png","metatags.error.title":"Error {{code}} | Dashbrd","metatags.wallet.title":"My Wallet | Dashbrd","metatags.galleries.title":"Top NFT Galleries | Dashbrd","metatags.galleries.image":"/images/meta/nft-galleries.png","metatags.galleries.description":"Explore user published NFT galleries to find custom curated PFPs, Digital Collectibles, & More.","metatags.galleries.most_popular.title":"Most Popular Galleries | Dashbrd","metatags.galleries.most_popular.image":"/images/meta/most-popular-nft-galleries.png","metatags.galleries.most_popular.description":"Explore and discover Most Popular NFT Galleries created by our users featuring custom curated PFPs, Digital Collectibles, & More.","metatags.galleries.newest.title":"Newest Galleries | Dashbrd","metatags.galleries.newest.image":"/images/meta/newest-nft-galleries.png","metatags.galleries.newest.description":"Explore and discover most recent NFT galleries created by our users featuring custom curated PFPs, Digital Collectibles, & More","metatags.galleries.most_valuable.title":"Most Valuable Galleries | Dashbrd","metatags.galleries.most_valuable.image":"/images/meta/most-valuable-nft-galleries.png","metatags.galleries.most_valuable.description":"Explore and discover Most Valuable NFT Galleries created by our users featuring custom curated PFPs, Digital Collectibles, & More.","metatags.galleries.view.title":"{{name}} | Dashbrd","metatags.galleries.view.description":"{{name}} | A Curated NFT Gallery at Dashbrd","metatags.galleries.view.image":"/images/meta/nft-gallery.png","metatags.my_galleries.title":"My Galleries | Dashbrd","metatags.my_galleries.title_draft":"My Draft Galleries | Dashbrd","metatags.my_galleries.create.title":"Create Gallery | Dashbrd","metatags.my_galleries.edit.title":"Edit {{name}} | Dashbrd","metatags.collections.title":"Collections | Dashbrd","metatags.collections.view.title":"{{name}} Collection | Dashbrd","metatags.collections.view.description":"Immerse yourself in the intricate details of {{name}} collection, featuring remarkable digital assets. Start your NFT journey today!","metatags.collections.view.image":"/images/meta/nft-collection.png","metatags.my-collections.title":"My Collections | Dashbrd","metatags.nfts.view.title":"{{nft}} NFT | Dashbrd","metatags.nfts.view.description":"Uncover the complete story of {{nft}} NFT from the {{collection}} collection, delving into its unique attributes and distinctive features.","metatags.nfts.view.image":"/images/meta/nft-details.png","metatags.settings.title":"Settings | Dashbrd","metatags.articles.title":"Articles | Dashbrd","metatags.articles.view.title":"{{title}} | Dashbrd","metatags.login.title":"Login | Dashbrd","metatags.privacy_policy.title":"Privacy Policy | Dashbrd","metatags.privacy_policy.description":"Dashbrd’s privacy policy outlines the information we collect and explains your choices surrounding how we use information about you.","metatags.terms_of_service.title":"Terms of Service | Dashbrd","metatags.terms_of_service.description":"These Terms of Service cover your use and access to services, products or websites of Dashbrd.","metatags.cookie_policy.title":"Cookie Policy | Dashbrd","metatags.cookie_policy.description":"Dashbrd uses cookies to make the website more user-friendly. Find out about the main types of cookies we use, and what we use them for.","metatags.welcome.title":"Welcome to Dashbrd | Web3 Simplified","pages.onboarding.title":"Get Started","pages.onboarding.heading":"Your monkeys were bored and ran off, we are trying to round them up.","pages.onboarding.message":"We are setting up your account. This process usually takes just a few minutes, but can take up to 15 minutes.","pages.error.heading":"Oops, something went wrong ...","pages.error.message":"Please try again or get in touch if the issue persists.","pages.maintenance.title":"Dashbrd is currently down for scheduled maintenance.","pages.maintenance.description":"We expect to be back soon. Thanks for your patience.","pages.dashboard.title":"My Wallet","pages.dashboard.breakdown.title":"Portfolio Breakdown","pages.dashboard.line_chart.data_error":"Could not load chart data","pages.articles.title":"Articles","pages.articles.featured_collections":"Featured Collections","pages.articles.placeholder_more_soon":"More Soon","pages.articles.no_articles":"No articles have been published yet. Please check back later!","pages.articles.header_title":"Explore our collection of","pages.articles.header_suffix_one":"published article","pages.articles.header_suffix_other":"published articles","pages.articles.audio_version":"Audio version","pages.articles.consists_of_collections":"{0} This article highlights {{count}} collections|{1} This article highlights {{count}} collection|[2,*] This article highlights {{count}} collections","pages.collections.title":"Collections","pages.collections.collections":"Collections","pages.collections.collection_value":"Collection Value","pages.collections.nfts_owned":"NFTs Owned","pages.collections.header_title":"You own <0>{{nftsCount}} {{nfts}} across <0>{{collectionsCount}} {{collections}}, worth about <0><1>{{worth}}","pages.collections.search_placeholder":"Search by Collection","pages.collections.properties":"Properties","pages.collections.collections_network":"Collections Network","pages.collections.property_search_placeholder":"Feature Search","pages.collections.floor_price":"Floor Price","pages.collections.value":"Value","pages.collections.rarity":"Rarity","pages.collections.report":"Report","pages.collections.hide_collection":"Hide Collection","pages.collections.unhide_collection":"Unhide Collection","pages.collections.no_collections":"You do not own any NFTs yet. Once you do they will be shown here.","pages.collections.all_collections_hidden":"You have hidden all your collections. Unhide and they will appear here.","pages.collections.about_collection":"About Collection","pages.collections.show_hidden":"Show Hidden","pages.collections.show_my_collection":"Show My Collection","pages.collections.owned":"Owned","pages.collections.activities.loading_activities":"We're fetching Activity for this NFT, please hang tight, this can take a while.","pages.collections.activities.loading_activities_collection":"We're fetching Activity for this collection, please hang tight, this can take a while.","pages.collections.activities.ignores_activities":"We don't support activity history for this collection yet.","pages.collections.activities.no_activity":"This collection does not have any activity yet.","pages.collections.activities.types.LABEL_MINT":"Mint","pages.collections.activities.types.LABEL_TRANSFER":"Transfer","pages.collections.activities.types.LABEL_SALE":"Sale","pages.collections.articles.no_articles":"No articles have been linked to this collection as of now.","pages.collections.articles.no_articles_with_filters":"We could not find any articles matching your search criteria, please try again!","pages.collections.articles.search_placeholder":"Search in Articles","pages.collections.articles.sort_latest":"Latest","pages.collections.articles.sort_popularity":"Most Popular","pages.collections.search.loading_results":"Loading results...","pages.collections.search.no_results":"We could not find anything matching your search criteria, please try again!","pages.collections.search.no_results_with_filters":"We could not find anything matching your filters, please try again!","pages.collections.search.no_results_ownership":"You do not own any NFTs in this collection","pages.collections.search.error":"Could not load search results. Please try again later.","pages.collections.sorting.token_number":"Token Number","pages.collections.sorting.recently_received":"Recently Received","pages.collections.sorting.recently_created":"Recently Created","pages.collections.sorting.oldest_collection":"Oldest Collection","pages.collections.traits.description":"List of NFT traits by % of occurrence in the collection","pages.collections.traits.no_traits":"No Properties can be found for this NFT","pages.collections.menu.collection":"Collection","pages.collections.menu.articles":"Articles","pages.collections.menu.activity":"Activity","pages.collections.hidden_modal.collection_hidden":"Collection Hidden","pages.collections.hidden_modal.description":"This collection is currently set to Hidden. Are you sure you want to unhide this collection? You can\n reset the collection to hidden from the collection menu.","pages.collections.hidden_modal.unhide":"Unhide","pages.collections.hidden_modal.error":"Something went wrong. Please try again.","pages.collections.external_modal.you_wish_continue":"You are about to leave Dashbrd to an external website. Dashbrd has no control over the content of\n this site. Are you sure you wish to continue?","pages.collections.external_modal.not_show":"Do not show this message again.","pages.collections.refresh.title":"Refresh your collection","pages.collections.refresh.notice":"You can refresh data every 15 minutes.","pages.collections.refresh.notice_wait":"Please wait. You can refresh data every 15 minutes.","pages.collections.refresh.toast":"We're updating information for your collection.","pages.collections.featured.title":"Featured Collections","pages.collections.featured.button":"Explore Collection","pages.nfts.nft":"nft","pages.nfts.about_nft":"About NFT","pages.nfts.owned_by":"Owned by","pages.nfts.collection_image":"collection image","pages.nfts.menu.properties":"Properties","pages.nfts.menu.activity":"Activity","pages.reports.title":"Submit a Report","pages.reports.description":"Thanks for looking out by reporting things that break the rules. Let us know what's happening and we'll receive the report.","pages.reports.success":"Thank you for your report. We'll review it and see if it breaks our ToS.","pages.reports.failed":"Something went wrong. Please try again.","pages.reports.throttle":"You have made too many requests. Please wait {{time}} before reporting again.","pages.reports.reported":"You have already reported this {{model}}.","pages.reports.reasons.spam":"Spam","pages.reports.reasons.violence":"Promoting Violence","pages.reports.reasons.hate":"Hate","pages.reports.reasons.inappropriate_content":"Inappropriate Content","pages.reports.reasons.impersonation":"Impersonation","pages.reports.reasons.trademark":"Trademark or Copyright","pages.reports.reasons.selfharm":"Self-Harm","pages.reports.reasons.harassment":"Harassment","pages.galleries.title":"Galleries","pages.galleries.empty_title":"No galleries have been published yet. Once they do they will appear here.","pages.galleries.search.loading_results":"Loading results...","pages.galleries.search.no_results":"We could not find anything matching your search criteria, please try again!","pages.galleries.search.placeholder":"Search by name or curator address","pages.galleries.search.placeholder_nfts":"Search by NFTs","pages.galleries.search.error":"Could not load search results. Please try again later.","pages.galleries.my_galleries.title":"My Galleries","pages.galleries.my_galleries.subtitle":"Manage your galleries","pages.galleries.my_galleries.new_gallery":"New Gallery","pages.galleries.my_galleries.no_galleries":"You have not created any galleries yet. To create a gallery, click on the \"Create Gallery\" button.","pages.galleries.my_galleries.no_draft_galleries":"You have no draft galleries yet. To create a gallery, click on the \"Create Gallery\" button.","pages.galleries.my_galleries.succesfully_deleted":"Gallery has been successfully removed","pages.galleries.my_galleries.draft_succesfully_deleted":"Draft has been successfully removed","pages.galleries.my_galleries.successfully_created":"Gallery has been successfully created","pages.galleries.my_galleries.successfully_updated":"Gallery has been successfully updated","pages.galleries.my_galleries.new_gallery_no_nfts":"Creating a Gallery requires you to own an NFT.","pages.galleries.my_galleries.delete_modal.title":"Delete Draft","pages.galleries.my_galleries.delete_modal.text":"Are you sure you want to delete the draft? Everything you've done will be deleted and you won't be able to get it back.","pages.galleries.my_galleries.nfts_no_longer_owned":"NFTs no longer owned by this wallet have been removed from the draft”","pages.galleries.copy_gallery_link":"Copy Gallery Link","pages.galleries.my_nfts":"My NFTs","pages.galleries.value":"Value","pages.galleries.floor_price":"Floor Price","pages.galleries.nfts":"NFTs","pages.galleries.collections":"Collections","pages.galleries.galleries_count_simple":"{0} galleries|{1} gallery|[2,*] galleries","pages.galleries.galleries_count":"{0} {{count}} Galleries|{1} {{count}} Gallery|[2,*] {{count}} Galleries","pages.galleries.collections_count_simple":"{0} collections|{1} collection|[2,*] collections","pages.galleries.collections_count":"{0} {{count}} Collections|{1} {{count}} Collection|[2,*] {{count}} Collections","pages.galleries.nfts_count_simple":"{0} NFTs|{1} NFT|[2,*] NFTs","pages.galleries.nfts_count":"{0} {{count}} NFTs|{1} {{count}} NFT|[2,*] {{count}} NFTs","pages.galleries.users_count_simple":"{0} users|{1} user|[2,*] users","pages.galleries.users_count":"{0} {{count}} Users|{1} {{count}} User|[2,*] {{count}} Users","pages.galleries.featuring":"Featuring","pages.galleries.curated_by":"Curated by","pages.galleries.worth_about":"Worth About","pages.galleries.valued_at":"valued at","pages.galleries.from":"From","pages.galleries.most_popular_galleries":"Most Popular Galleries","pages.galleries.newest_galleries":"Newest Galleries","pages.galleries.most_valuable_galleries":"Most Valuable Galleries","pages.galleries.most_popular":"Most Popular","pages.galleries.newest":"Newest","pages.galleries.most_valuable":"Most Valuable","pages.galleries.create.search_by_nfts":"Search by NFTs","pages.galleries.create.input_placeholder":"Enter gallery name","pages.galleries.create.title_too_long":"Gallery name must not exceed {{max}} characters.","pages.galleries.create.already_selected_nft":"NFT already exists in this gallery","pages.galleries.create.nft_missing_image":"Only NFTs with images can be added to galleries","pages.galleries.create.nft_gallery_limit":"You can only add 16 NFTs per gallery","pages.galleries.create.gallery_cover":"Gallery Cover","pages.galleries.create.gallery_cover_description":"The cover is used for the card on the gallery list page. While the cover is not a requirement it will allow you to add personality and stand out from the crowd.","pages.galleries.create.gallery_cover_information":"Image dimensions must be at least 287px x 190px, with a max size of 2 MB (JPG, PNG or GIF)","pages.galleries.create.no_results":"We could not find anything matching your search criteria, please try again!","pages.galleries.create.templates.cover":"Cover","pages.galleries.create.templates.template":"Template","pages.galleries.create.templates.select":"Select Gallery Template","pages.galleries.create.templates.basic":"Basic Gallery","pages.galleries.create.templates.coming_soon":"More Coming Soon","pages.galleries.create.load_more_collections_one":"Load {{count}} More Collection","pages.galleries.create.load_more_collections_other":"Load {{count}} More Collections","pages.galleries.create.load_more_nfts":"Load More NFTs","pages.galleries.create.can_purchase":"You can purchase NFTs with these top NFT Marketplaces:","pages.galleries.create.must_own_one_nft":"You must own at least one (1) NFT in order to create a gallery.","pages.galleries.create.back_to_galleries":"Back to Galleries","pages.galleries.create.draft_saved":"Draft Saved","pages.galleries.create.saving_to_draft":"Saving to draft","pages.galleries.create.drafts_limit_modal_title":"Draft Gallery Limit","pages.galleries.create.drafts_limit_modal_message":"You’ve hit your limit for draft galleries. While you can still make new galleries and publish them, they won’t be saved as drafts. To Free up space, you can either delete existing drafts or publish them.","pages.galleries.create.drafts_limit_modal_cancel":"Go to Drafts","pages.galleries.delete_modal.title":"Delete Gallery","pages.galleries.delete_modal.confirmation_text":"Are you sure you want to delete the gallery? Deleting a Gallery is permanent, all associated views and likes will be lost.","pages.galleries.consists_of_collections":"{0} This gallery consists of {{count}} collections|{1} This gallery consists of {{count}} collection|[2,*] This gallery consists of {{count}} collections","pages.galleries.guest_banner.title":"Craft the ultimate","pages.galleries.guest_banner.subtitle":"Pick your favorites, curate your gallery, & share it with the world.","pages.profile.title":"Profile","pages.token_panel.balance_tooltip":"Total percentage of the portfolio held in this token","pages.token_panel.insufficient_funds":"Insufficient Balance","pages.token_panel.error":"Dashbrd has failed to load token information. Please try again later.","pages.token_panel.failed_to_retrieve_transactions":"We were unable to fetch your transactions.","pages.token_panel.tabs.transaction_history":"Transaction History","pages.token_panel.tabs.history":"History","pages.token_panel.tabs.market_data":"Market Data","pages.token_panel.details.current_price":"Current Price","pages.token_panel.details.title":"Token Details","pages.token_panel.details.market_cap":"Market Cap","pages.token_panel.details.volume":"Daily Volume","pages.token_panel.details.supply":"Minted Supply","pages.token_panel.details.ath":"All-Time High","pages.token_panel.details.atl":"All-Time Low","pages.token_panel.chart.failed":"Dashbrd has failed to load chart information. Please try again later.","pages.transaction_details_panel.title":"Transaction Details","pages.transaction_details_panel.details.blockchain":"Blockchain","pages.transaction_details_panel.details.timestamp":"Timestamp","pages.transaction_details_panel.details.transaction_hash":"Transaction Hash","pages.transaction_details_panel.details.transaction_fee":"Transaction Fee","pages.transaction_details_panel.details.gas_price":"Gas Price","pages.transaction_details_panel.details.gas_used":"Gas Used","pages.transaction_details_panel.details.nonce":"Nonce","pages.send_receive_panel.send.labels.token_and_amount":"Token and Amount","pages.send_receive_panel.send.labels.destination_address":"Destination Address","pages.send_receive_panel.send.labels.projected_fee":"Projected Fee","pages.send_receive_panel.send.placeholders.enter_amount":"Enter Amount","pages.send_receive_panel.send.placeholders.insert_recipient_address":"Insert Recipient Address","pages.send_receive_panel.send.placeholders.projected_fee":"Projected Fee","pages.send_receive_panel.send.errors.amount":"Insufficient Funds: You do not have enough to cover the amount + fee.","pages.send_receive_panel.send.errors.destination":"Destination address is not correct. Check and input again.","pages.send_receive_panel.send.hints.token_price":"Token Price","pages.send_receive_panel.send.fees.Fast":"Fast","pages.send_receive_panel.send.fees.Avg":"Avg","pages.send_receive_panel.send.fees.Slow":"Slow","pages.send_receive_panel.send.search_dropdown.placeholder":"Search token","pages.send_receive_panel.send.search_dropdown.no_results":"No Results","pages.send_receive_panel.send.search_dropdown.error":"Error occurred while searching tokens.","pages.send_receive_panel.send.transaction_time":"Transaction Time: ~{{ time }} minutes","pages.send_receive_panel.send.from":"From","pages.send_receive_panel.send.to":"To","pages.send_receive_panel.send.amount":"Amount","pages.send_receive_panel.send.fee":"Fee","pages.send_receive_panel.send.total_amount":"Total Amount","pages.send_receive_panel.send.waiting_message":"Review and verify the information on your MetaMask. Sign to send the transaction.","pages.send_receive_panel.send.waiting_spinner_text":"Waiting for confirmation...","pages.send_receive_panel.send.failed_message":"It looks like something went wrong while sending your transaction. Press 'Retry' to make another attempt.","pages.send_receive_panel.receive.alert":"Send only Polygon or Ethereum Network compatible tokens to this address or you could permanently lose your funds!","pages.settings.title":"Settings","pages.settings.sidebar.general":"General","pages.settings.sidebar.notifications":"Notifications","pages.settings.sidebar.session_history":"Sessions History","pages.settings.general.title":"Settings","pages.settings.general.subtitle":"Customize your App Experience","pages.settings.general.currency":"Currency","pages.settings.general.currency_subtitle":"Select your default currency which will be used throughout the app.","pages.settings.general.time_date":"Time & Date","pages.settings.general.time_date_subtitle":"Select how you want time and date be shown inside app.","pages.settings.general.date_format":"Date Format","pages.settings.general.time_format":"Time Format","pages.settings.general.timezone":"Timezone","pages.settings.general.set_defaults":"Set Defaults","pages.settings.general.set_defaults_content":"Reverting to the default settings will remove any customizations previously made. Are you sure?","pages.settings.general.save":"Save Settings","pages.settings.general.saved":"Your settings have been successfully saved","pages.wallet.title":"Wallet","pages.privacy_policy.title":"Privacy Policy","pages.terms_of_service.title":"Terms of Service","pagination.previous":"« Previous","pagination.next":"Next »","passwords.reset":"Your password has been reset!","passwords.sent":"We have emailed your password reset link!","passwords.throttled":"Please wait before retrying.","passwords.token":"This password reset token is invalid.","passwords.user":"We can't find a user with that email address.","urls.landing":"https://dashbrd.com","urls.cookie_policy":"https://dashbrd.com/cookie-policy","urls.privacy_policy":"https://dashbrd.com/privacy-policy","urls.terms_of_service":"https://dashbrd.com/terms-of-service","urls.twitter":"https://x.com/DashbrdApp","urls.discord":"https://discord.gg/MJyWKkCJ5k","urls.github":"https://github.com/ArdentHQ/dashbrd","urls.coingecko":"https://www.coingecko.com","urls.etherscan":"https://etherscan.io","urls.polygonscan":"https://polygonscan.com","urls.alchemy":"https://www.alchemy.com","urls.moralis":"https://moralis.io","urls.mnemonic":"https://www.mnemonichq.com","urls.opensea":"https://opensea.io/","urls.explorers.etherscan.token_transactions":"https://etherscan.io/token/{{token}}?a={{address}}","urls.explorers.etherscan.addresses":"https://etherscan.io/address/{{address}}","urls.explorers.etherscan.transactions":"https://etherscan.io/tx/{{id}}","urls.explorers.etherscan.nft":"https://etherscan.io/nft/{{address}}/{{nftId}}","urls.explorers.polygonscan.token_transactions":"https://polygonscan.com/token/{{token}}?a={{address}}","urls.explorers.polygonscan.addresses":"https://polygonscan.com/address/{{address}}","urls.explorers.polygonscan.transactions":"https://polygonscan.com/tx/{{id}}","urls.explorers.polygonscan.nft":"https://polygonscan.com/nft/{{address}}/{{nftId}}","urls.explorers.mumbai.token_transactions":"https://mumbai.polygonscan.com/token/{{token}}?a={{address}}","urls.explorers.mumbai.addresses":"https://mumbai.polygonscan.com/address/{{address}}","urls.explorers.mumbai.transactions":"https://mumbai.polygonscan.com/tx/{{id}}","urls.explorers.mumbai.nft":"https://mumbai.polygonscan.com/nft/{{address}}/{{nftId}}","urls.explorers.goerli.token_transactions":"https://goerli.etherscan.io/token/{{token}}?a={{address}}","urls.explorers.goerli.addresses":"https://goerli.etherscan.io/address/{{address}}","urls.explorers.goerli.transactions":"https://goerli.etherscan.io/tx/{{id}}","urls.explorers.goerli.nft":"https://goerli.etherscan.io/nft/{{address}}/{{nftId}}","urls.marketplaces.opensea.collection":"https://opensea.io/assets/{{network}}/{{address}}","urls.marketplaces.opensea.nft":"https://opensea.io/assets/{{network}}/{{address}}/{{nftId}}","urls.marketplaces.rarible.collection":"https://rarible.com/collection/{{address}}/items","urls.marketplaces.rarible.nft":"https://rarible.com/token/{{address}}:{{nftId}}","urls.marketplaces.blur.collection":"https://blur.io/collection/{{address}}","urls.marketplaces.blur.nft":"https://blur.io/asset/{{address}}/{{nftId}}","urls.marketplaces.looksrare.collection":"https://looksrare.org/collections/{{address}}","urls.marketplaces.looksrare.nft":"https://looksrare.org/collections/{{address}}/{{nftId}}","validation.accepted":"The {{attribute}} must be accepted.","validation.accepted_if":"The {{attribute}} must be accepted when {{other}} is {{value}}.","validation.active_url":"The {{attribute}} is not a valid URL.","validation.after":"The {{attribute}} must be a date after {{date}}.","validation.after_or_equal":"The {{attribute}} must be a date after or equal to {{date}}.","validation.alpha":"The {{attribute}} must only contain letters.","validation.alpha_dash":"The {{attribute}} must only contain letters, numbers, dashes and underscores.","validation.alpha_num":"The {{attribute}} must only contain letters and numbers.","validation.array":"The {{attribute}} must be an array.","validation.ascii":"The {{attribute}} must only contain single-byte alphanumeric characters and symbols.","validation.before":"The {{attribute}} must be a date before {{date}}.","validation.before_or_equal":"The {{attribute}} must be a date before or equal to {{date}}.","validation.between.array":"The {{attribute}} must have between {{min}} and {{max}} items.","validation.between.file":"The {{attribute}} must be between {{min}} and {{max}} kilobytes.","validation.between.numeric":"The {{attribute}} must be between {{min}} and {{max}}.","validation.between.string":"The {{attribute}} must be between {{min}} and {{max}} characters.","validation.boolean":"The {{attribute}} field must be true or false.","validation.confirmed":"The {{attribute}} confirmation does not match.","validation.current_password":"The password is incorrect.","validation.date":"The {{attribute}} is not a valid date.","validation.date_equals":"The {{attribute}} must be a date equal to {{date}}.","validation.date_format":"The {{attribute}} does not match the format {{format}}.","validation.decimal":"The {{attribute}} must have {{decimal}} decimal places.","validation.declined":"The {{attribute}} must be declined.","validation.declined_if":"The {{attribute}} must be declined when {{other}} is {{value}}.","validation.different":"The {{attribute}} and {{other}} must be different.","validation.digits":"The {{attribute}} must be {{digits}} digits.","validation.digits_between":"The {{attribute}} must be between {{min}} and {{max}} digits.","validation.dimensions":"The {{attribute}} has invalid image dimensions.","validation.distinct":"The {{attribute}} field has a duplicate value.","validation.doesnt_end_with":"The {{attribute}} may not end with one of the following: {{values}}.","validation.doesnt_start_with":"The {{attribute}} may not start with one of the following: {{values}}.","validation.email":"The {{attribute}} must be a valid email address.","validation.ends_with":"The {{attribute}} must end with one of the following: {{values}}.","validation.enum":"The selected {{attribute}} is invalid.","validation.exists":"The selected {{attribute}} is invalid.","validation.file":"The {{attribute}} must be a file.","validation.filled":"The {{attribute}} field must have a value.","validation.gt.array":"The {{attribute}} must have more than {{value}} items.","validation.gt.file":"The {{attribute}} must be greater than {{value}} kilobytes.","validation.gt.numeric":"The {{attribute}} must be greater than {{value}}.","validation.gt.string":"The {{attribute}} must be greater than {{value}} characters.","validation.gte.array":"The {{attribute}} must have {{value}} items or more.","validation.gte.file":"The {{attribute}} must be greater than or equal to {{value}} kilobytes.","validation.gte.numeric":"The {{attribute}} must be greater than or equal to {{value}}.","validation.gte.string":"The {{attribute}} must be greater than or equal to {{value}} characters.","validation.image":"The {{attribute}} must be an image.","validation.in":"The selected {{attribute}} is invalid.","validation.in_array":"The {{attribute}} field does not exist in {{other}}.","validation.integer":"The {{attribute}} must be an integer.","validation.ip":"The {{attribute}} must be a valid IP address.","validation.ipv4":"The {{attribute}} must be a valid IPv4 address.","validation.ipv6":"The {{attribute}} must be a valid IPv6 address.","validation.json":"The {{attribute}} must be a valid JSON string.","validation.lowercase":"The {{attribute}} must be lowercase.","validation.lt.array":"The {{attribute}} must have less than {{value}} items.","validation.lt.file":"The {{attribute}} must be less than {{value}} kilobytes.","validation.lt.numeric":"The {{attribute}} must be less than {{value}}.","validation.lt.string":"The {{attribute}} must be less than {{value}} characters.","validation.lte.array":"The {{attribute}} must not have more than {{value}} items.","validation.lte.file":"The {{attribute}} must be less than or equal to {{value}} kilobytes.","validation.lte.numeric":"The {{attribute}} must be less than or equal to {{value}}.","validation.lte.string":"The {{attribute}} must be less than or equal to {{value}} characters.","validation.mac_address":"The {{attribute}} must be a valid MAC address.","validation.max.array":"The {{attribute}} must not have more than {{max}} items.","validation.max.file":"The {{attribute}} must not be greater than {{max}} kilobytes.","validation.max.numeric":"The {{attribute}} must not be greater than {{max}}.","validation.max.string":"The {{attribute}} must not be greater than {{max}} characters.","validation.max_digits":"The {{attribute}} must not have more than {{max}} digits.","validation.mimes":"The {{attribute}} must be a file of type: {{values}}.","validation.mimetypes":"The {{attribute}} must be a file of type: {{values}}.","validation.min.array":"The {{attribute}} must have at least {{min}} items.","validation.min.file":"The {{attribute}} must be at least {{min}} kilobytes.","validation.min.numeric":"The {{attribute}} must be at least {{min}}.","validation.min.string":"The {{attribute}} must be at least {{min}} characters.","validation.min_digits":"The {{attribute}} must have at least {{min}} digits.","validation.missing":"The {{attribute}} field must be missing.","validation.missing_if":"The {{attribute}} field must be missing when {{other}} is {{value}}.","validation.missing_unless":"The {{attribute}} field must be missing unless {{other}} is {{value}}.","validation.missing_with":"The {{attribute}} field must be missing when {{values}} is present.","validation.missing_with_all":"The {{attribute}} field must be missing when {{values}} are present.","validation.multiple_of":"The {{attribute}} must be a multiple of {{value}}.","validation.not_in":"The selected {{attribute}} is invalid.","validation.not_regex":"The {{attribute}} format is invalid.","validation.numeric":"The {{attribute}} must be a number.","validation.password.letters":"The {{attribute}} must contain at least one letter.","validation.password.mixed":"The {{attribute}} must contain at least one uppercase and one lowercase letter.","validation.password.numbers":"The {{attribute}} must contain at least one number.","validation.password.symbols":"The {{attribute}} must contain at least one symbol.","validation.password.uncompromised":"The given {{attribute}} has appeared in a data leak. Please choose a different {{attribute}}.","validation.present":"The {{attribute}} field must be present.","validation.prohibited":"The {{attribute}} field is prohibited.","validation.prohibited_if":"The {{attribute}} field is prohibited when {{other}} is {{value}}.","validation.prohibited_unless":"The {{attribute}} field is prohibited unless {{other}} is in {{values}}.","validation.prohibits":"The {{attribute}} field prohibits {{other}} from being present.","validation.regex":"The {{attribute}} format is invalid.","validation.required":"The {{attribute}} field is required.","validation.required_array_keys":"The {{attribute}} field must contain entries for: {{values}}.","validation.required_if":"The {{attribute}} field is required when {{other}} is {{value}}.","validation.required_if_accepted":"The {{attribute}} field is required when {{other}} is accepted.","validation.required_unless":"The {{attribute}} field is required unless {{other}} is in {{values}}.","validation.required_with":"The {{attribute}} field is required when {{values}} is present.","validation.required_with_all":"The {{attribute}} field is required when {{values}} are present.","validation.required_without":"The {{attribute}} field is required when {{values}} is not present.","validation.required_without_all":"The {{attribute}} field is required when none of {{values}} are present.","validation.same":"The {{attribute}} and {{other}} must match.","validation.size.array":"The {{attribute}} must contain {{size}} items.","validation.size.file":"The {{attribute}} must be {{size}} kilobytes.","validation.size.numeric":"The {{attribute}} must be {{size}}.","validation.size.string":"The {{attribute}} must be {{size}} characters.","validation.starts_with":"The {{attribute}} must start with one of the following: {{values}}.","validation.string":"The {{attribute}} must be a string.","validation.timezone":"The {{attribute}} must be a valid timezone.","validation.unique":"The {{attribute}} has already been taken.","validation.uploaded":"The {{attribute}} failed to upload.","validation.uppercase":"The {{attribute}} must be uppercase.","validation.url":"The {{attribute}} must be a valid URL.","validation.ulid":"The {{attribute}} must be a valid ULID.","validation.uuid":"The {{attribute}} must be a valid UUID.","validation.custom.attribute-name.rule-name":"custom-message","validation.unsupported_currency_code":"The currency code you provided is invalid or not supported.","validation.unsupported_period":"The period you provided is invalid or not supported.","validation.unsupported_token_symbol":"The token symbol you provided is invalid or not supported.","validation.gallery_title_required":"Gallery name is required.","validation.gallery_title_max_characters":"The gallery name should not exceed 50 characters.","validation.gallery_title_invalid":"The gallery name is invalid.","validation.nfts_required":"Please add at least one NFT.","validation.nfts_max_size":"Galleries can contain no more than {{limit}} NFTs","validation.invalid_nfts":"The NFT in position {{position}} is invalid, please select another one.","validation.invalid_cover":"You have selected an invalid cover image, please try another one."} +{"auth.welcome":"Welcome to Dashbrd","auth.logged_in":"You're logged in!","auth.log_out":"Log out","auth.failed":"These credentials do not match our records.","auth.session_timeout":"Your session has timed out. Please refresh the page and try connecting your account again.","auth.session_timeout_modal":"Seems like your session has timed out. Please connnect your wallet again.","auth.password":"The provided password is incorrect.","auth.throttle":"Too many login attempts. Please try again in {{seconds}} seconds.","auth.wallet.connecting":"Connecting …","auth.wallet.waiting_for_signature":"Waiting for Signature …","auth.wallet.switching_wallet":"Switching Wallet …","auth.wallet.connect":"Connect Wallet","auth.wallet.connect_long":"Connect Your Wallet to Get Started","auth.wallet.sign_subtitle":"Connect Your Wallet to Continue","auth.wallet.disconnect":"Disconnect Wallet","auth.wallet.install":"Install MetaMask","auth.wallet.install_long":"Install MetaMask to Get Started","auth.wallet.sign":"Sign Message","auth.wallet.sign_message":"Welcome to Dashbrd. In order to login, sign this message with your wallet. It doesn't cost you anything!\n\nSigning ID (you can ignore this): {{nonce}}","auth.wallet.connect_subtitle":"Click on the MetaMask icon in your browser to confirm the action and connect your wallet.","auth.wallet.requires_signature":"In order to prevent impersonation, we require a signature to perform this action. This signature is only a signed message and does not give any access to your wallet.","auth.errors.metamask.no_account":"No account found. Please connect your wallet and try again.","auth.errors.metamask.generic":"Connection attempt error. Please retry and follow the steps to connect your wallet.","auth.errors.metamask.invalid_network":"Please switch to Polygon or Ethereum Mainnet in your MetaMask plugin to connect to Dashbrd.","auth.errors.metamask.provider_missing":"You don't have MetaMask installed in your browser. Please install and try again.","auth.errors.metamask.user_rejected":"It looks like you cancelled signing of the authentication message. Please try again.","auth.errors.metamask.provider_not_set":"Ethereum provider is not set","auth.validation.wallet_login_failed":"There was a problem trying to verify your signature. Please try again.","auth.validation.invalid_address":"Your wallet address is invalid. Please try again.","auth.validation.invalid_signature":"Signature is invalid. Please try again.","auth.validation.invalid_network":"Please switch to Polygon or Ethereum Mainnet in your MetaMask plugin to connect to Dashbrd.","common.author":"Author","common.add":"Add","common.amount":"Amount","common.balance":"Balance","common.cancel":"Cancel","common.delete":"Delete","common.edit":"Edit","common.confirm":"Confirm","common.connect":"Connect","common.continue":"Continue","common.done":"Done","common.filter":"Filter","common.items":"Items","common.receive":"Receive","common.received":"Received","common.retry":"Retry","common.records":"Records","common.save":"Save","common.send":"Send","common.sent":"Sent","common.show":"Show","common.searching":"Searching...","common.other":"Other","common.owned":"Owned","common.token":"Token","common.tokens":"Tokens","common.wallet":"Wallet","common.pending":"Pending","common.publish":"Publish","common.published":"Published","common.empty":"Empty","common.your_address":"Your Address","common.warning":"Warning","common.my_address":"My Address","common.my_wallet":"My Wallet","common.my_collections":"My Collections","common.my_balance":"My Balance","common.na":"N/A","common.simple_plural_without_data":"One comment|Many comments","common.simple_plural_with_data":"{{count}} comment|{{count}} comments","common.advanced_plural_without_data":"{0} no comments yet|{1} 1 comment|[2,*] Many comments","common.advanced_plural_with_data":"{0} no comments yet|{1} 1 comment|[2,*] {{count}} comments","common.copy_clipboard":"Copy to Clipboard","common.copy":"Copy","common.download":"Download","common.zoom":"Zoom","common.my_collection":"My Collection","common.max":"Max","common.chain":"Chain","common.copied":"Copied!","common.coming_soon":"Coming Soon","common.more_details":"More Details","common.close":"Close","common.close_toast":"Close toast","common.loading":"Loading","common.price":"Price","common.articles":"Articles","common.most_popular":"Most Popular","common.market_cap":"Market Cap","common.volume":"Volume","common.volume_frequency":"Volume {{frequency}}","common.value":"Value","common.last_n_days":"Last {{count}} Days","common.details":"Details","common.view_all":"View All","common.view_more_on_polygonscan":"View More on Polygonscan","common.view_more_on_etherscan":"View More on Etherscan","common.view_nft_on_etherscan":"View NFT on Etherscan","common.view_nft_on_polygonscan":"View NFT on Polygonscan","common.view_nft_on_goerli_tesnet":"View NFT on Goerli Testnet Explorer","common.view_nft_on_mumbai_tesnet":"View NFT on Mumbai Testnet Explorer","common.polygonscan":"Polygonscan","common.etherscan":"Etherscan","common.featured":"Featured","common.floor_price":"Floor Price","common.floor":"Floor","common.supply":"Supply","common.owners":"Owners","common.created":"Created","common.nft":"NFT","common.collection":"Collection","common.collections":"Collections","common.gallery":"Gallery","common.basic_gallery":"Basic Gallery","common.gallery_name":"Gallery Name","common.create_gallery":"Create Gallery","common.external_link":"External Link","common.follow_link":"Follow Link","common.cover":"Cover","common.template":"Template","common.page":"Page","common.polygon":"Polygon","common.ethereum":"Ethereum","common.mumbai":"Mumbai","common.goerli":"Goerli","common.of":"of","common.pagination_input_placeholder":"Enter the page number","common.pagination_input_placeholder_mobile":"Page number","common.nft_count":"{0} {{count}} NFTs|{1} {{count}} NFT|[2,*] {{count}} NFTs","common.nft_gallery":"NFT Gallery","common.unable_to_retrieve_image":"Unable to retrieve your NFT image at this time","common.optional":"Optional","common.selected":"Selected","common.select":"Select","common.preview":"Preview","common.image_size_error":"Image size must not exceed 2MB","common.image_dimensions_error":"Image dimensions must exceed 287px x 190px","common.write_to_confirm":"Write {{word}} to confirm","common.n_hours":"{0} {{count}} hour|{1} {{count}} hour|[2,*] {{count}} hours","common.n_minutes":"{0} {{count}} minute|{1} {{count}} minute|[2,*] {{count}} minutes","common.report":"Report","common.nfts":"NFTs","common.n_nfts":"{0}NFTs|{1}NFT|[2,*]NFTs","common.n_collections":"{0}collections|{1}collection|[2,*]collections","common.back":"Back","common.back_to":"Back to","common.name":"Name","common.type":"Type","common.from":"From","common.to":"To","common.sale_price":"Sale Price","common.recent_activity":"Recent Activity","common.time":"Time","common.datetime.few_seconds_ago":"A few seconds ago","common.datetime.minutes_ago":"{0} Less than a minute ago|{1} A minute ago|[2,*] {{count}} minutes ago","common.datetime.hours_ago":"{0} Less than an hour ago|{1} An hour ago|[2,*] {{count}} hours ago","common.datetime.days_ago":"{0} Less than a day ago|{1} A day ago|[2,*] {{count}} days ago","common.datetime.weeks_ago":"{0} Less than a week ago|{1} A week ago|[2,*] {{count}} weeks ago","common.datetime.months_ago":"{0} Less than a month ago|{1} A month ago|[2,*] {{count}} months ago","common.datetime.years_ago":"{0} Less than a year ago|{1} A year ago|[2,*] {{count}} years ago","common.no_traits_found":"No traits found.","common.empty_transactions":"You don't have any transactions yet. Once transactions have been made, they will show up here.","common.error":"Error","common.refresh":"Refresh","common.refresh_metadata":"Refresh Metadata","common.refreshing_metadata":"Refreshing Metadata... Please check back later.","common.refreshing_activity":"Refreshing Activity... Please check back later.","common.pending_confirmation":"Pending Confirmation","common.confirmed_transaction":"Confirmed Transaction","common.transaction_error":"Transaction Error","common.transaction_error_description_first_part":"Your transaction encountered an error. View this transaction on","common.transaction_error_description_second_part":"for more details.","common.home":"Home","common.contact":"Contact","common.menu":"Menu","common.website":"Website","common.twitter":"Twitter","common.discord":"Discord","common.facebook":"Facebook","common.reddit":"Reddit","common.x":"X","common.sort":"Sort","common.drafts":"Drafts","common.draft":"Draft","common.delete_draft":"Delete Draft","common.share_on":"Share on {{platform}}","footer.copyright":"{{year}} © Dashbrd. All rights reserved.","footer.all_rights_reserved":"All rights reserved","footer.privacy_policy":"Privacy Policy","footer.terms_of_service":"Terms of Service","footer.powered_by":"Powered by","format.fiat":"{{ value, currency }}","format.number":"{{ value, number }}","metatags.home.title":"Dashbrd | Web3 Portfolio Management Made Simple","metatags.home.description":"Simplify your Web3 journey with Dashbrd. Manage your portfolio of tokens, NFTs, and other digital collectibles across the Ethereum and Polygon blockchains.","metatags.home.image":"/images/meta/home.png","metatags.error.title":"Error {{code}} | Dashbrd","metatags.wallet.title":"My Wallet | Dashbrd","metatags.galleries.title":"Top NFT Galleries | Dashbrd","metatags.galleries.image":"/images/meta/nft-galleries.png","metatags.galleries.description":"Explore user published NFT galleries to find custom curated PFPs, Digital Collectibles, & More.","metatags.galleries.most_popular.title":"Most Popular Galleries | Dashbrd","metatags.galleries.most_popular.image":"/images/meta/most-popular-nft-galleries.png","metatags.galleries.most_popular.description":"Explore and discover Most Popular NFT Galleries created by our users featuring custom curated PFPs, Digital Collectibles, & More.","metatags.galleries.newest.title":"Newest Galleries | Dashbrd","metatags.galleries.newest.image":"/images/meta/newest-nft-galleries.png","metatags.galleries.newest.description":"Explore and discover most recent NFT galleries created by our users featuring custom curated PFPs, Digital Collectibles, & More","metatags.galleries.most_valuable.title":"Most Valuable Galleries | Dashbrd","metatags.galleries.most_valuable.image":"/images/meta/most-valuable-nft-galleries.png","metatags.galleries.most_valuable.description":"Explore and discover Most Valuable NFT Galleries created by our users featuring custom curated PFPs, Digital Collectibles, & More.","metatags.galleries.view.title":"{{name}} | Dashbrd","metatags.galleries.view.description":"{{name}} | A Curated NFT Gallery at Dashbrd","metatags.galleries.view.image":"/images/meta/nft-gallery.png","metatags.my_galleries.title":"My Galleries | Dashbrd","metatags.my_galleries.title_draft":"My Draft Galleries | Dashbrd","metatags.my_galleries.create.title":"Create Gallery | Dashbrd","metatags.my_galleries.edit.title":"Edit {{name}} | Dashbrd","metatags.collections.title":"Collections | Dashbrd","metatags.collections.view.title":"{{name}} Collection | Dashbrd","metatags.collections.view.description":"Immerse yourself in the intricate details of {{name}} collection, featuring remarkable digital assets. Start your NFT journey today!","metatags.collections.view.image":"/images/meta/nft-collection.png","metatags.my-collections.title":"My Collections | Dashbrd","metatags.nfts.view.title":"{{nft}} NFT | Dashbrd","metatags.nfts.view.description":"Uncover the complete story of {{nft}} NFT from the {{collection}} collection, delving into its unique attributes and distinctive features.","metatags.nfts.view.image":"/images/meta/nft-details.png","metatags.settings.title":"Settings | Dashbrd","metatags.articles.title":"Articles | Dashbrd","metatags.articles.view.title":"{{title}} | Dashbrd","metatags.login.title":"Login | Dashbrd","metatags.privacy_policy.title":"Privacy Policy | Dashbrd","metatags.privacy_policy.description":"Dashbrd’s privacy policy outlines the information we collect and explains your choices surrounding how we use information about you.","metatags.terms_of_service.title":"Terms of Service | Dashbrd","metatags.terms_of_service.description":"These Terms of Service cover your use and access to services, products or websites of Dashbrd.","metatags.cookie_policy.title":"Cookie Policy | Dashbrd","metatags.cookie_policy.description":"Dashbrd uses cookies to make the website more user-friendly. Find out about the main types of cookies we use, and what we use them for.","metatags.welcome.title":"Welcome to Dashbrd | Web3 Simplified","pages.onboarding.title":"Get Started","pages.onboarding.heading":"Your monkeys were bored and ran off, we are trying to round them up.","pages.onboarding.message":"We are setting up your account. This process usually takes just a few minutes, but can take up to 15 minutes.","pages.error.heading":"Oops, something went wrong ...","pages.error.message":"Please try again or get in touch if the issue persists.","pages.maintenance.title":"Dashbrd is currently down for scheduled maintenance.","pages.maintenance.description":"We expect to be back soon. Thanks for your patience.","pages.dashboard.title":"My Wallet","pages.dashboard.breakdown.title":"Portfolio Breakdown","pages.dashboard.line_chart.data_error":"Could not load chart data","pages.articles.title":"Articles","pages.articles.featured_collections":"Featured Collections","pages.articles.placeholder_more_soon":"More Soon","pages.articles.no_articles":"No articles have been published yet. Please check back later!","pages.articles.header_title":"Explore our collection of","pages.articles.header_suffix_one":"published article","pages.articles.header_suffix_other":"published articles","pages.articles.audio_version":"Audio version","pages.articles.consists_of_collections":"{0} This article highlights {{count}} collections|{1} This article highlights {{count}} collection|[2,*] This article highlights {{count}} collections","pages.collections.title":"Collections","pages.collections.collections":"Collections","pages.collections.popular_collections":"Popular Collections","pages.collections.collection_value":"Collection Value","pages.collections.nfts_owned":"NFTs Owned","pages.collections.header_title":"You own <0>{{nftsCount}} {{nfts}} across <0>{{collectionsCount}} {{collections}}, worth about <0><1>{{worth}}","pages.collections.search_placeholder":"Search by Collection","pages.collections.properties":"Properties","pages.collections.collections_network":"Collections Network","pages.collections.property_search_placeholder":"Feature Search","pages.collections.floor_price":"Floor Price","pages.collections.value":"Value","pages.collections.rarity":"Rarity","pages.collections.report":"Report","pages.collections.hide_collection":"Hide Collection","pages.collections.unhide_collection":"Unhide Collection","pages.collections.no_collections":"You do not own any NFTs yet. Once you do they will be shown here.","pages.collections.all_collections_hidden":"You have hidden all your collections. Unhide and they will appear here.","pages.collections.about_collection":"About Collection","pages.collections.show_hidden":"Show Hidden","pages.collections.show_my_collection":"Show My Collection","pages.collections.owned":"Owned","pages.collections.activities.loading_activities":"We're fetching Activity for this NFT, please hang tight, this can take a while.","pages.collections.activities.loading_activities_collection":"We're fetching Activity for this collection, please hang tight, this can take a while.","pages.collections.activities.ignores_activities":"We don't support activity history for this collection yet.","pages.collections.activities.no_activity":"This collection does not have any activity yet.","pages.collections.activities.types.LABEL_MINT":"Mint","pages.collections.activities.types.LABEL_TRANSFER":"Transfer","pages.collections.activities.types.LABEL_SALE":"Sale","pages.collections.articles.no_articles":"No articles have been linked to this collection as of now.","pages.collections.articles.no_articles_with_filters":"We could not find any articles matching your search criteria, please try again!","pages.collections.articles.search_placeholder":"Search in Articles","pages.collections.articles.sort_latest":"Latest","pages.collections.articles.sort_popularity":"Most Popular","pages.collections.search.loading_results":"Loading results...","pages.collections.search.no_results":"We could not find anything matching your search criteria, please try again!","pages.collections.search.no_results_with_filters":"We could not find anything matching your filters, please try again!","pages.collections.search.no_results_ownership":"You do not own any NFTs in this collection","pages.collections.search.error":"Could not load search results. Please try again later.","pages.collections.sorting.token_number":"Token Number","pages.collections.sorting.recently_received":"Recently Received","pages.collections.sorting.recently_created":"Recently Created","pages.collections.sorting.oldest_collection":"Oldest Collection","pages.collections.traits.description":"List of NFT traits by % of occurrence in the collection","pages.collections.traits.no_traits":"No Properties can be found for this NFT","pages.collections.menu.collection":"Collection","pages.collections.menu.articles":"Articles","pages.collections.menu.activity":"Activity","pages.collections.hidden_modal.collection_hidden":"Collection Hidden","pages.collections.hidden_modal.description":"This collection is currently set to Hidden. Are you sure you want to unhide this collection? You can\n reset the collection to hidden from the collection menu.","pages.collections.hidden_modal.unhide":"Unhide","pages.collections.hidden_modal.error":"Something went wrong. Please try again.","pages.collections.external_modal.you_wish_continue":"You are about to leave Dashbrd to an external website. Dashbrd has no control over the content of\n this site. Are you sure you wish to continue?","pages.collections.external_modal.not_show":"Do not show this message again.","pages.collections.refresh.title":"Refresh your collection","pages.collections.refresh.notice":"You can refresh data every 15 minutes.","pages.collections.refresh.notice_wait":"Please wait. You can refresh data every 15 minutes.","pages.collections.refresh.toast":"We're updating information for your collection.","pages.collections.featured.title":"Featured Collections","pages.collections.featured.button":"Explore Collection","pages.nfts.nft":"nft","pages.nfts.about_nft":"About NFT","pages.nfts.owned_by":"Owned by","pages.nfts.collection_image":"collection image","pages.nfts.menu.properties":"Properties","pages.nfts.menu.activity":"Activity","pages.reports.title":"Submit a Report","pages.reports.description":"Thanks for looking out by reporting things that break the rules. Let us know what's happening and we'll receive the report.","pages.reports.success":"Thank you for your report. We'll review it and see if it breaks our ToS.","pages.reports.failed":"Something went wrong. Please try again.","pages.reports.throttle":"You have made too many requests. Please wait {{time}} before reporting again.","pages.reports.reported":"You have already reported this {{model}}.","pages.reports.reasons.spam":"Spam","pages.reports.reasons.violence":"Promoting Violence","pages.reports.reasons.hate":"Hate","pages.reports.reasons.inappropriate_content":"Inappropriate Content","pages.reports.reasons.impersonation":"Impersonation","pages.reports.reasons.trademark":"Trademark or Copyright","pages.reports.reasons.selfharm":"Self-Harm","pages.reports.reasons.harassment":"Harassment","pages.galleries.title":"Galleries","pages.galleries.empty_title":"No galleries have been published yet. Once they do they will appear here.","pages.galleries.search.loading_results":"Loading results...","pages.galleries.search.no_results":"We could not find anything matching your search criteria, please try again!","pages.galleries.search.placeholder":"Search by name or curator address","pages.galleries.search.placeholder_nfts":"Search by NFTs","pages.galleries.search.error":"Could not load search results. Please try again later.","pages.galleries.my_galleries.title":"My Galleries","pages.galleries.my_galleries.subtitle":"Manage your galleries","pages.galleries.my_galleries.new_gallery":"New Gallery","pages.galleries.my_galleries.no_galleries":"You have not created any galleries yet. To create a gallery, click on the \"Create Gallery\" button.","pages.galleries.my_galleries.no_draft_galleries":"You have no draft galleries yet. To create a gallery, click on the \"Create Gallery\" button.","pages.galleries.my_galleries.succesfully_deleted":"Gallery has been successfully removed","pages.galleries.my_galleries.draft_succesfully_deleted":"Draft has been successfully removed","pages.galleries.my_galleries.successfully_created":"Gallery has been successfully created","pages.galleries.my_galleries.successfully_updated":"Gallery has been successfully updated","pages.galleries.my_galleries.new_gallery_no_nfts":"Creating a Gallery requires you to own an NFT.","pages.galleries.my_galleries.delete_modal.title":"Delete Draft","pages.galleries.my_galleries.delete_modal.text":"Are you sure you want to delete the draft? Everything you've done will be deleted and you won't be able to get it back.","pages.galleries.my_galleries.nfts_no_longer_owned":"NFTs no longer owned by this wallet have been removed from the draft”","pages.galleries.copy_gallery_link":"Copy Gallery Link","pages.galleries.my_nfts":"My NFTs","pages.galleries.value":"Value","pages.galleries.floor_price":"Floor Price","pages.galleries.nfts":"NFTs","pages.galleries.collections":"Collections","pages.galleries.galleries_count_simple":"{0} galleries|{1} gallery|[2,*] galleries","pages.galleries.galleries_count":"{0} {{count}} Galleries|{1} {{count}} Gallery|[2,*] {{count}} Galleries","pages.galleries.collections_count_simple":"{0} collections|{1} collection|[2,*] collections","pages.galleries.collections_count":"{0} {{count}} Collections|{1} {{count}} Collection|[2,*] {{count}} Collections","pages.galleries.nfts_count_simple":"{0} NFTs|{1} NFT|[2,*] NFTs","pages.galleries.nfts_count":"{0} {{count}} NFTs|{1} {{count}} NFT|[2,*] {{count}} NFTs","pages.galleries.users_count_simple":"{0} users|{1} user|[2,*] users","pages.galleries.users_count":"{0} {{count}} Users|{1} {{count}} User|[2,*] {{count}} Users","pages.galleries.featuring":"Featuring","pages.galleries.curated_by":"Curated by","pages.galleries.worth_about":"Worth About","pages.galleries.valued_at":"valued at","pages.galleries.from":"From","pages.galleries.most_popular_galleries":"Most Popular Galleries","pages.galleries.newest_galleries":"Newest Galleries","pages.galleries.most_valuable_galleries":"Most Valuable Galleries","pages.galleries.most_popular":"Most Popular","pages.galleries.newest":"Newest","pages.galleries.most_valuable":"Most Valuable","pages.galleries.create.search_by_nfts":"Search by NFTs","pages.galleries.create.input_placeholder":"Enter gallery name","pages.galleries.create.title_too_long":"Gallery name must not exceed {{max}} characters.","pages.galleries.create.already_selected_nft":"NFT already exists in this gallery","pages.galleries.create.nft_missing_image":"Only NFTs with images can be added to galleries","pages.galleries.create.nft_gallery_limit":"You can only add 16 NFTs per gallery","pages.galleries.create.gallery_cover":"Gallery Cover","pages.galleries.create.gallery_cover_description":"The cover is used for the card on the gallery list page. While the cover is not a requirement it will allow you to add personality and stand out from the crowd.","pages.galleries.create.gallery_cover_information":"Image dimensions must be at least 287px x 190px, with a max size of 2 MB (JPG, PNG or GIF)","pages.galleries.create.no_results":"We could not find anything matching your search criteria, please try again!","pages.galleries.create.templates.cover":"Cover","pages.galleries.create.templates.template":"Template","pages.galleries.create.templates.select":"Select Gallery Template","pages.galleries.create.templates.basic":"Basic Gallery","pages.galleries.create.templates.coming_soon":"More Coming Soon","pages.galleries.create.load_more_collections_one":"Load {{count}} More Collection","pages.galleries.create.load_more_collections_other":"Load {{count}} More Collections","pages.galleries.create.load_more_nfts":"Load More NFTs","pages.galleries.create.can_purchase":"You can purchase NFTs with these top NFT Marketplaces:","pages.galleries.create.must_own_one_nft":"You must own at least one (1) NFT in order to create a gallery.","pages.galleries.create.back_to_galleries":"Back to Galleries","pages.galleries.create.draft_saved":"Draft Saved","pages.galleries.create.saving_to_draft":"Saving to draft","pages.galleries.create.drafts_limit_modal_title":"Draft Gallery Limit","pages.galleries.create.drafts_limit_modal_message":"You’ve hit your limit for draft galleries. While you can still make new galleries and publish them, they won’t be saved as drafts. To Free up space, you can either delete existing drafts or publish them.","pages.galleries.create.drafts_limit_modal_cancel":"Go to Drafts","pages.galleries.delete_modal.title":"Delete Gallery","pages.galleries.delete_modal.confirmation_text":"Are you sure you want to delete the gallery? Deleting a Gallery is permanent, all associated views and likes will be lost.","pages.galleries.consists_of_collections":"{0} This gallery consists of {{count}} collections|{1} This gallery consists of {{count}} collection|[2,*] This gallery consists of {{count}} collections","pages.galleries.guest_banner.title":"Craft the ultimate","pages.galleries.guest_banner.subtitle":"Pick your favorites, curate your gallery, & share it with the world.","pages.profile.title":"Profile","pages.token_panel.balance_tooltip":"Total percentage of the portfolio held in this token","pages.token_panel.insufficient_funds":"Insufficient Balance","pages.token_panel.error":"Dashbrd has failed to load token information. Please try again later.","pages.token_panel.failed_to_retrieve_transactions":"We were unable to fetch your transactions.","pages.token_panel.tabs.transaction_history":"Transaction History","pages.token_panel.tabs.history":"History","pages.token_panel.tabs.market_data":"Market Data","pages.token_panel.details.current_price":"Current Price","pages.token_panel.details.title":"Token Details","pages.token_panel.details.market_cap":"Market Cap","pages.token_panel.details.volume":"Daily Volume","pages.token_panel.details.supply":"Minted Supply","pages.token_panel.details.ath":"All-Time High","pages.token_panel.details.atl":"All-Time Low","pages.token_panel.chart.failed":"Dashbrd has failed to load chart information. Please try again later.","pages.transaction_details_panel.title":"Transaction Details","pages.transaction_details_panel.details.blockchain":"Blockchain","pages.transaction_details_panel.details.timestamp":"Timestamp","pages.transaction_details_panel.details.transaction_hash":"Transaction Hash","pages.transaction_details_panel.details.transaction_fee":"Transaction Fee","pages.transaction_details_panel.details.gas_price":"Gas Price","pages.transaction_details_panel.details.gas_used":"Gas Used","pages.transaction_details_panel.details.nonce":"Nonce","pages.send_receive_panel.send.labels.token_and_amount":"Token and Amount","pages.send_receive_panel.send.labels.destination_address":"Destination Address","pages.send_receive_panel.send.labels.projected_fee":"Projected Fee","pages.send_receive_panel.send.placeholders.enter_amount":"Enter Amount","pages.send_receive_panel.send.placeholders.insert_recipient_address":"Insert Recipient Address","pages.send_receive_panel.send.placeholders.projected_fee":"Projected Fee","pages.send_receive_panel.send.errors.amount":"Insufficient Funds: You do not have enough to cover the amount + fee.","pages.send_receive_panel.send.errors.destination":"Destination address is not correct. Check and input again.","pages.send_receive_panel.send.hints.token_price":"Token Price","pages.send_receive_panel.send.fees.Fast":"Fast","pages.send_receive_panel.send.fees.Avg":"Avg","pages.send_receive_panel.send.fees.Slow":"Slow","pages.send_receive_panel.send.search_dropdown.placeholder":"Search token","pages.send_receive_panel.send.search_dropdown.no_results":"No Results","pages.send_receive_panel.send.search_dropdown.error":"Error occurred while searching tokens.","pages.send_receive_panel.send.transaction_time":"Transaction Time: ~{{ time }} minutes","pages.send_receive_panel.send.from":"From","pages.send_receive_panel.send.to":"To","pages.send_receive_panel.send.amount":"Amount","pages.send_receive_panel.send.fee":"Fee","pages.send_receive_panel.send.total_amount":"Total Amount","pages.send_receive_panel.send.waiting_message":"Review and verify the information on your MetaMask. Sign to send the transaction.","pages.send_receive_panel.send.waiting_spinner_text":"Waiting for confirmation...","pages.send_receive_panel.send.failed_message":"It looks like something went wrong while sending your transaction. Press 'Retry' to make another attempt.","pages.send_receive_panel.receive.alert":"Send only Polygon or Ethereum Network compatible tokens to this address or you could permanently lose your funds!","pages.settings.title":"Settings","pages.settings.sidebar.general":"General","pages.settings.sidebar.notifications":"Notifications","pages.settings.sidebar.session_history":"Sessions History","pages.settings.general.title":"Settings","pages.settings.general.subtitle":"Customize your App Experience","pages.settings.general.currency":"Currency","pages.settings.general.currency_subtitle":"Select your default currency which will be used throughout the app.","pages.settings.general.time_date":"Time & Date","pages.settings.general.time_date_subtitle":"Select how you want time and date be shown inside app.","pages.settings.general.date_format":"Date Format","pages.settings.general.time_format":"Time Format","pages.settings.general.timezone":"Timezone","pages.settings.general.set_defaults":"Set Defaults","pages.settings.general.set_defaults_content":"Reverting to the default settings will remove any customizations previously made. Are you sure?","pages.settings.general.save":"Save Settings","pages.settings.general.saved":"Your settings have been successfully saved","pages.wallet.title":"Wallet","pages.privacy_policy.title":"Privacy Policy","pages.terms_of_service.title":"Terms of Service","pagination.previous":"« Previous","pagination.next":"Next »","passwords.reset":"Your password has been reset!","passwords.sent":"We have emailed your password reset link!","passwords.throttled":"Please wait before retrying.","passwords.token":"This password reset token is invalid.","passwords.user":"We can't find a user with that email address.","urls.landing":"https://dashbrd.com","urls.cookie_policy":"https://dashbrd.com/cookie-policy","urls.privacy_policy":"https://dashbrd.com/privacy-policy","urls.terms_of_service":"https://dashbrd.com/terms-of-service","urls.twitter":"https://x.com/DashbrdApp","urls.discord":"https://discord.gg/MJyWKkCJ5k","urls.github":"https://github.com/ArdentHQ/dashbrd","urls.coingecko":"https://www.coingecko.com","urls.etherscan":"https://etherscan.io","urls.polygonscan":"https://polygonscan.com","urls.alchemy":"https://www.alchemy.com","urls.moralis":"https://moralis.io","urls.mnemonic":"https://www.mnemonichq.com","urls.opensea":"https://opensea.io/","urls.explorers.etherscan.token_transactions":"https://etherscan.io/token/{{token}}?a={{address}}","urls.explorers.etherscan.addresses":"https://etherscan.io/address/{{address}}","urls.explorers.etherscan.transactions":"https://etherscan.io/tx/{{id}}","urls.explorers.etherscan.nft":"https://etherscan.io/nft/{{address}}/{{nftId}}","urls.explorers.polygonscan.token_transactions":"https://polygonscan.com/token/{{token}}?a={{address}}","urls.explorers.polygonscan.addresses":"https://polygonscan.com/address/{{address}}","urls.explorers.polygonscan.transactions":"https://polygonscan.com/tx/{{id}}","urls.explorers.polygonscan.nft":"https://polygonscan.com/nft/{{address}}/{{nftId}}","urls.explorers.mumbai.token_transactions":"https://mumbai.polygonscan.com/token/{{token}}?a={{address}}","urls.explorers.mumbai.addresses":"https://mumbai.polygonscan.com/address/{{address}}","urls.explorers.mumbai.transactions":"https://mumbai.polygonscan.com/tx/{{id}}","urls.explorers.mumbai.nft":"https://mumbai.polygonscan.com/nft/{{address}}/{{nftId}}","urls.explorers.goerli.token_transactions":"https://goerli.etherscan.io/token/{{token}}?a={{address}}","urls.explorers.goerli.addresses":"https://goerli.etherscan.io/address/{{address}}","urls.explorers.goerli.transactions":"https://goerli.etherscan.io/tx/{{id}}","urls.explorers.goerli.nft":"https://goerli.etherscan.io/nft/{{address}}/{{nftId}}","urls.marketplaces.opensea.collection":"https://opensea.io/assets/{{network}}/{{address}}","urls.marketplaces.opensea.nft":"https://opensea.io/assets/{{network}}/{{address}}/{{nftId}}","urls.marketplaces.rarible.collection":"https://rarible.com/collection/{{address}}/items","urls.marketplaces.rarible.nft":"https://rarible.com/token/{{address}}:{{nftId}}","urls.marketplaces.blur.collection":"https://blur.io/collection/{{address}}","urls.marketplaces.blur.nft":"https://blur.io/asset/{{address}}/{{nftId}}","urls.marketplaces.looksrare.collection":"https://looksrare.org/collections/{{address}}","urls.marketplaces.looksrare.nft":"https://looksrare.org/collections/{{address}}/{{nftId}}","validation.accepted":"The {{attribute}} must be accepted.","validation.accepted_if":"The {{attribute}} must be accepted when {{other}} is {{value}}.","validation.active_url":"The {{attribute}} is not a valid URL.","validation.after":"The {{attribute}} must be a date after {{date}}.","validation.after_or_equal":"The {{attribute}} must be a date after or equal to {{date}}.","validation.alpha":"The {{attribute}} must only contain letters.","validation.alpha_dash":"The {{attribute}} must only contain letters, numbers, dashes and underscores.","validation.alpha_num":"The {{attribute}} must only contain letters and numbers.","validation.array":"The {{attribute}} must be an array.","validation.ascii":"The {{attribute}} must only contain single-byte alphanumeric characters and symbols.","validation.before":"The {{attribute}} must be a date before {{date}}.","validation.before_or_equal":"The {{attribute}} must be a date before or equal to {{date}}.","validation.between.array":"The {{attribute}} must have between {{min}} and {{max}} items.","validation.between.file":"The {{attribute}} must be between {{min}} and {{max}} kilobytes.","validation.between.numeric":"The {{attribute}} must be between {{min}} and {{max}}.","validation.between.string":"The {{attribute}} must be between {{min}} and {{max}} characters.","validation.boolean":"The {{attribute}} field must be true or false.","validation.confirmed":"The {{attribute}} confirmation does not match.","validation.current_password":"The password is incorrect.","validation.date":"The {{attribute}} is not a valid date.","validation.date_equals":"The {{attribute}} must be a date equal to {{date}}.","validation.date_format":"The {{attribute}} does not match the format {{format}}.","validation.decimal":"The {{attribute}} must have {{decimal}} decimal places.","validation.declined":"The {{attribute}} must be declined.","validation.declined_if":"The {{attribute}} must be declined when {{other}} is {{value}}.","validation.different":"The {{attribute}} and {{other}} must be different.","validation.digits":"The {{attribute}} must be {{digits}} digits.","validation.digits_between":"The {{attribute}} must be between {{min}} and {{max}} digits.","validation.dimensions":"The {{attribute}} has invalid image dimensions.","validation.distinct":"The {{attribute}} field has a duplicate value.","validation.doesnt_end_with":"The {{attribute}} may not end with one of the following: {{values}}.","validation.doesnt_start_with":"The {{attribute}} may not start with one of the following: {{values}}.","validation.email":"The {{attribute}} must be a valid email address.","validation.ends_with":"The {{attribute}} must end with one of the following: {{values}}.","validation.enum":"The selected {{attribute}} is invalid.","validation.exists":"The selected {{attribute}} is invalid.","validation.file":"The {{attribute}} must be a file.","validation.filled":"The {{attribute}} field must have a value.","validation.gt.array":"The {{attribute}} must have more than {{value}} items.","validation.gt.file":"The {{attribute}} must be greater than {{value}} kilobytes.","validation.gt.numeric":"The {{attribute}} must be greater than {{value}}.","validation.gt.string":"The {{attribute}} must be greater than {{value}} characters.","validation.gte.array":"The {{attribute}} must have {{value}} items or more.","validation.gte.file":"The {{attribute}} must be greater than or equal to {{value}} kilobytes.","validation.gte.numeric":"The {{attribute}} must be greater than or equal to {{value}}.","validation.gte.string":"The {{attribute}} must be greater than or equal to {{value}} characters.","validation.image":"The {{attribute}} must be an image.","validation.in":"The selected {{attribute}} is invalid.","validation.in_array":"The {{attribute}} field does not exist in {{other}}.","validation.integer":"The {{attribute}} must be an integer.","validation.ip":"The {{attribute}} must be a valid IP address.","validation.ipv4":"The {{attribute}} must be a valid IPv4 address.","validation.ipv6":"The {{attribute}} must be a valid IPv6 address.","validation.json":"The {{attribute}} must be a valid JSON string.","validation.lowercase":"The {{attribute}} must be lowercase.","validation.lt.array":"The {{attribute}} must have less than {{value}} items.","validation.lt.file":"The {{attribute}} must be less than {{value}} kilobytes.","validation.lt.numeric":"The {{attribute}} must be less than {{value}}.","validation.lt.string":"The {{attribute}} must be less than {{value}} characters.","validation.lte.array":"The {{attribute}} must not have more than {{value}} items.","validation.lte.file":"The {{attribute}} must be less than or equal to {{value}} kilobytes.","validation.lte.numeric":"The {{attribute}} must be less than or equal to {{value}}.","validation.lte.string":"The {{attribute}} must be less than or equal to {{value}} characters.","validation.mac_address":"The {{attribute}} must be a valid MAC address.","validation.max.array":"The {{attribute}} must not have more than {{max}} items.","validation.max.file":"The {{attribute}} must not be greater than {{max}} kilobytes.","validation.max.numeric":"The {{attribute}} must not be greater than {{max}}.","validation.max.string":"The {{attribute}} must not be greater than {{max}} characters.","validation.max_digits":"The {{attribute}} must not have more than {{max}} digits.","validation.mimes":"The {{attribute}} must be a file of type: {{values}}.","validation.mimetypes":"The {{attribute}} must be a file of type: {{values}}.","validation.min.array":"The {{attribute}} must have at least {{min}} items.","validation.min.file":"The {{attribute}} must be at least {{min}} kilobytes.","validation.min.numeric":"The {{attribute}} must be at least {{min}}.","validation.min.string":"The {{attribute}} must be at least {{min}} characters.","validation.min_digits":"The {{attribute}} must have at least {{min}} digits.","validation.missing":"The {{attribute}} field must be missing.","validation.missing_if":"The {{attribute}} field must be missing when {{other}} is {{value}}.","validation.missing_unless":"The {{attribute}} field must be missing unless {{other}} is {{value}}.","validation.missing_with":"The {{attribute}} field must be missing when {{values}} is present.","validation.missing_with_all":"The {{attribute}} field must be missing when {{values}} are present.","validation.multiple_of":"The {{attribute}} must be a multiple of {{value}}.","validation.not_in":"The selected {{attribute}} is invalid.","validation.not_regex":"The {{attribute}} format is invalid.","validation.numeric":"The {{attribute}} must be a number.","validation.password.letters":"The {{attribute}} must contain at least one letter.","validation.password.mixed":"The {{attribute}} must contain at least one uppercase and one lowercase letter.","validation.password.numbers":"The {{attribute}} must contain at least one number.","validation.password.symbols":"The {{attribute}} must contain at least one symbol.","validation.password.uncompromised":"The given {{attribute}} has appeared in a data leak. Please choose a different {{attribute}}.","validation.present":"The {{attribute}} field must be present.","validation.prohibited":"The {{attribute}} field is prohibited.","validation.prohibited_if":"The {{attribute}} field is prohibited when {{other}} is {{value}}.","validation.prohibited_unless":"The {{attribute}} field is prohibited unless {{other}} is in {{values}}.","validation.prohibits":"The {{attribute}} field prohibits {{other}} from being present.","validation.regex":"The {{attribute}} format is invalid.","validation.required":"The {{attribute}} field is required.","validation.required_array_keys":"The {{attribute}} field must contain entries for: {{values}}.","validation.required_if":"The {{attribute}} field is required when {{other}} is {{value}}.","validation.required_if_accepted":"The {{attribute}} field is required when {{other}} is accepted.","validation.required_unless":"The {{attribute}} field is required unless {{other}} is in {{values}}.","validation.required_with":"The {{attribute}} field is required when {{values}} is present.","validation.required_with_all":"The {{attribute}} field is required when {{values}} are present.","validation.required_without":"The {{attribute}} field is required when {{values}} is not present.","validation.required_without_all":"The {{attribute}} field is required when none of {{values}} are present.","validation.same":"The {{attribute}} and {{other}} must match.","validation.size.array":"The {{attribute}} must contain {{size}} items.","validation.size.file":"The {{attribute}} must be {{size}} kilobytes.","validation.size.numeric":"The {{attribute}} must be {{size}}.","validation.size.string":"The {{attribute}} must be {{size}} characters.","validation.starts_with":"The {{attribute}} must start with one of the following: {{values}}.","validation.string":"The {{attribute}} must be a string.","validation.timezone":"The {{attribute}} must be a valid timezone.","validation.unique":"The {{attribute}} has already been taken.","validation.uploaded":"The {{attribute}} failed to upload.","validation.uppercase":"The {{attribute}} must be uppercase.","validation.url":"The {{attribute}} must be a valid URL.","validation.ulid":"The {{attribute}} must be a valid ULID.","validation.uuid":"The {{attribute}} must be a valid UUID.","validation.custom.attribute-name.rule-name":"custom-message","validation.unsupported_currency_code":"The currency code you provided is invalid or not supported.","validation.unsupported_period":"The period you provided is invalid or not supported.","validation.unsupported_token_symbol":"The token symbol you provided is invalid or not supported.","validation.gallery_title_required":"Gallery name is required.","validation.gallery_title_max_characters":"The gallery name should not exceed 50 characters.","validation.gallery_title_invalid":"The gallery name is invalid.","validation.nfts_required":"Please add at least one NFT.","validation.nfts_max_size":"Galleries can contain no more than {{limit}} NFTs","validation.invalid_nfts":"The NFT in position {{position}} is invalid, please select another one.","validation.invalid_cover":"You have selected an invalid cover image, please try another one."} \ No newline at end of file From d79d358c6b8731825979bdb97cc3de1c8d2faa37 Mon Sep 17 00:00:00 2001 From: patricio0312rev Date: Thu, 23 Nov 2023 14:55:48 +0000 Subject: [PATCH 37/61] style: resolve style guide violations --- resources/css/_carousel.css | 1 - resources/css/app.css | 21 ++++----------------- 2 files changed, 4 insertions(+), 18 deletions(-) diff --git a/resources/css/_carousel.css b/resources/css/_carousel.css index 049ab2416..2a8c24b04 100644 --- a/resources/css/_carousel.css +++ b/resources/css/_carousel.css @@ -1,4 +1,3 @@ @import "swiper/css"; @import "swiper/css/grid"; @import "swiper/css/pagination"; - diff --git a/resources/css/app.css b/resources/css/app.css index fd59d31a1..4c9ce01d5 100644 --- a/resources/css/app.css +++ b/resources/css/app.css @@ -51,32 +51,19 @@ } .featured-collections-overlay { - background-image: linear-gradient( - 180deg, - rgb(var(--theme-color-primary-50)) 47.38%, - transparent 216.53% - ); + background-image: linear-gradient(180deg, rgb(var(--theme-color-primary-50)) 47.38%, transparent 216.53%); } .dark .featured-collections-overlay { - background-image: linear-gradient( - 181deg, - rgb(var(--theme-color-dark-800)) 41.03%, - transparent 208.87%); + background-image: linear-gradient(181deg, rgb(var(--theme-color-dark-800)) 41.03%, transparent 208.87%); } @media (min-width: 960px) { .featured-collections-overlay { - background-image: linear-gradient( - 90deg, - rgb(var(--theme-color-primary-50)) 55.67%, - transparent 151.85%); + background-image: linear-gradient(90deg, rgb(var(--theme-color-primary-50)) 55.67%, transparent 151.85%); } .dark .featured-collections-overlay { - background-image: linear-gradient( - 90deg, - rgb(var(--theme-color-dark-800)) 55.67%, - transparent 151.85%); + background-image: linear-gradient(90deg, rgb(var(--theme-color-dark-800)) 55.67%, transparent 151.85%); } } From 027639135155f5a0e9749bc0bb6ec3b930eda371 Mon Sep 17 00:00:00 2001 From: patricio0312rev Date: Thu, 23 Nov 2023 14:56:32 +0000 Subject: [PATCH 38/61] style: resolve style guide violations --- app/Data/Collections/CollectionFeaturedData.php | 1 - app/Http/Controllers/CollectionController.php | 2 +- lang/en/pages.php | 2 +- routes/web.php | 2 +- 4 files changed, 3 insertions(+), 4 deletions(-) diff --git a/app/Data/Collections/CollectionFeaturedData.php b/app/Data/Collections/CollectionFeaturedData.php index f5a406793..a1221cb77 100644 --- a/app/Data/Collections/CollectionFeaturedData.php +++ b/app/Data/Collections/CollectionFeaturedData.php @@ -5,7 +5,6 @@ namespace App\Data\Collections; use App\Data\Gallery\GalleryNftData; -use App\Data\Nfts\NftData; use App\Enums\CurrencyCode; use App\Models\Collection; use App\Transformers\IpfsGatewayUrlTransformer; diff --git a/app/Http/Controllers/CollectionController.php b/app/Http/Controllers/CollectionController.php index 75f03a0e4..5496f3056 100644 --- a/app/Http/Controllers/CollectionController.php +++ b/app/Http/Controllers/CollectionController.php @@ -49,7 +49,7 @@ public function index(Request $request): Response|JsonResponse|RedirectResponse return $collection->nfts()->inRandomOrder()->take(3)->get(); }); }); - + $currency = $user ? $user->currency() : CurrencyCode::USD; $collectionQuery = $user ? $user->collections() : Collection::query(); diff --git a/lang/en/pages.php b/lang/en/pages.php index 3f766d51c..82ebe3581 100644 --- a/lang/en/pages.php +++ b/lang/en/pages.php @@ -124,7 +124,7 @@ 'featured' => [ 'title' => 'Featured Collections', 'button' => 'Explore Collection', - ] + ], ], 'nfts' => [ diff --git a/routes/web.php b/routes/web.php index 093b82725..78f6e19fb 100644 --- a/routes/web.php +++ b/routes/web.php @@ -88,7 +88,7 @@ }); Route::group(['middleware' => 'features:collections'], function () { - Route::group(['prefix' => 'my-collections'], function() { + Route::group(['prefix' => 'my-collections'], function () { Route::get('', [MyCollectionsController::class, 'index'])->name('my-collections')->middleware(EnsureOnboarded::class); }); From 846b5f29d0d732ac3a260cee4a0914dbd268bce3 Mon Sep 17 00:00:00 2001 From: Juan Patricio Marroquin Date: Thu, 23 Nov 2023 10:11:40 -0500 Subject: [PATCH 39/61] fix: type for DataCollection in CollectionFeaturedData --- .../Collections/CollectionFeaturedData.php | 2 +- resources/types/generated.d.ts | 914 ++++++++---------- 2 files changed, 387 insertions(+), 529 deletions(-) diff --git a/app/Data/Collections/CollectionFeaturedData.php b/app/Data/Collections/CollectionFeaturedData.php index a1221cb77..c32300cc5 100644 --- a/app/Data/Collections/CollectionFeaturedData.php +++ b/app/Data/Collections/CollectionFeaturedData.php @@ -20,7 +20,7 @@ class CollectionFeaturedData extends Data { /** - * @param DataCollection $nfts + * @param DataCollection $nfts */ public function __construct( public int $id, diff --git a/resources/types/generated.d.ts b/resources/types/generated.d.ts index c55fa3cec..b0fdcb531 100644 --- a/resources/types/generated.d.ts +++ b/resources/types/generated.d.ts @@ -1,547 +1,405 @@ declare namespace App.Data { - export type Attributes = { - currency: string; - date_format: string; - time_format: "12" | "24"; - timezone: string; - }; - export type AuthData = { - user: App.Data.UserData | null; - wallet: App.Data.Wallet.WalletData | null; - authenticated: boolean; - signed: boolean; - }; - export type CurrencyPriceData = { - price: number; - percentChange24h: number; - }; - export type ImagesData = { - /** 96x96 */ thumb: string | null; - /** 256x256 */ small: string | null; - /** 512x512 */ large: string | null; - }; - export type NetworkData = { - name: string; - isMainnet: boolean; - chainId: number; - publicRpcProvider: string; - explorerUrl: string; - }; - export type PriceHistoryData = { - timestamp: number; - price: number; - }; - export type SimpleWalletData = { - address: string; - domain: string | null; - avatar: App.Data.Wallet.WalletAvatarData; - }; - export type TokenListItemData = { - guid: number | null; - name: string; - symbol: string; - token_price: string | null; - address: string; - is_native_token: boolean; - balance: string; - decimals: number; - chain_id: App.Enums.Chain; - network_id: number; - minted_supply: string | null; - total_market_cap: string | null; - ath: string | null; - atl: string | null; - total_volume: string | null; - fiat_balance: string | null; - price_change_24h_in_currency: string | null; - website_url: string | null; - twitter_url: string | null; - discord_url: string | null; - explorer_url: string; - logo_url: string | null; - percentage: string; - }; - export type TokenPortfolioData = { - name: string; - symbol: string; - balance: string | null; - decimals: string | null; - fiat_balance: string; - percentage: string; - }; - export type TransactionData = { - hash: string; - isSent: boolean; - isErrored: boolean; - isPending: boolean; - timestamp: number; - amount: string; - fee: string; - from: string; - to: string; - gasPrice: string; - gasUsed: string; - nonce: string; - }; - export type UserData = { - attributes: Attributes; - }; +export type Attributes = { +currency: string; +date_format: string; +time_format: "12"|"24"; +timezone: string; +}; +export type AuthData = { +user: App.Data.UserData | null; +wallet: App.Data.Wallet.WalletData | null; +authenticated: boolean; +signed: boolean; +}; +export type CurrencyPriceData = { +price: number; +percentChange24h: number; +}; +export type ImagesData = {/** 96x96 */ thumb:string | null;/** 256x256 */ small:string | null;/** 512x512 */ large:string | null;}; +export type NetworkData = { +name: string; +isMainnet: boolean; +chainId: number; +publicRpcProvider: string; +explorerUrl: string; +}; +export type PriceHistoryData = { +timestamp: number; +price: number; +}; +export type SimpleWalletData = { +address: string; +domain: string | null; +avatar: App.Data.Wallet.WalletAvatarData; +}; +export type TokenListItemData = { +guid: number | null; +name: string; +symbol: string; +token_price: string | null; +address: string; +is_native_token: boolean; +balance: string; +decimals: number; +chain_id: App.Enums.Chain; +network_id: number; +minted_supply: string | null; +total_market_cap: string | null; +ath: string | null; +atl: string | null; +total_volume: string | null; +fiat_balance: string | null; +price_change_24h_in_currency: string | null; +website_url: string | null; +twitter_url: string | null; +discord_url: string | null; +explorer_url: string; +logo_url: string | null; +percentage: string; +}; +export type TokenPortfolioData = { +name: string; +symbol: string; +balance: string | null; +decimals: string | null; +fiat_balance: string; +percentage: string; +}; +export type TransactionData = { +hash: string; +isSent: boolean; +isErrored: boolean; +isPending: boolean; +timestamp: number; +amount: string; +fee: string; +from: string; +to: string; +gasPrice: string; +gasUsed: string; +nonce: string; +}; +export type UserData = { +attributes: Attributes; +}; } declare namespace App.Data.Articles { - export type ArticleData = { - id: number; - title: string; - slug: string; - category: App.Enums.ArticleCategoryEnum; - audioSrc: string | null; - content: string; - image: { small: string; small2x: string; medium: string; medium2x: string; large: string; large2x: string }; - publishedAt: number; - userId: number; - authorName: string; - authorAvatar: { thumb: string | null; thumb2x: string | null }; - featuredCollections: Array; - metaDescription: string | null; - }; - export type ArticlesData = { - paginated: { - data: Array; - links: Array<{ url: string | null; label: string; active: boolean }>; - meta: { - current_page: number; - first_page_url: string; - from: number | null; - last_page: number; - last_page_url: string; - next_page_url: string | null; - path: string; - per_page: number; - prev_page_url: string | null; - to: number | null; - total: number; - }; - }; - }; - export type FeaturedCollectionData = { - name: string; - slug: string; - image: string | null; - }; +export type ArticleData = { +id: number; +title: string; +slug: string; +category: App.Enums.ArticleCategoryEnum; +audioSrc: string | null; +content: string; +image: { small: string, small2x: string, medium: string, medium2x: string, large: string, large2x: string }; +publishedAt: number; +userId: number; +authorName: string; +authorAvatar: { thumb: string | null, thumb2x: string | null }; +featuredCollections: Array; +metaDescription: string | null; +}; +export type ArticlesData = { +paginated: {data:Array;links:Array<{url:string | null;label:string;active:boolean;}>;meta:{current_page:number;first_page_url:string;from:number | null;last_page:number;last_page_url:string;next_page_url:string | null;path:string;per_page:number;prev_page_url:string | null;to:number | null;total:number;};}; +}; +export type FeaturedCollectionData = { +name: string; +slug: string; +image: string | null; +}; } declare namespace App.Data.Collections { - export type CollectionBasicDetailsData = { - slug: string; - chainId: App.Enums.Chain; - }; - export type CollectionData = { - id: number; - name: string; - slug: string; - address: string; - chainId: App.Enums.Chain; - floorPrice: string | null; - floorPriceFiat: number | null; - floorPriceCurrency: string | null; - floorPriceDecimals: number | null; - image: string | null; - banner: string | null; - openSeaSlug: string | null; - website: string; - nftsCount: number; - nfts: Array; - }; - export type CollectionDetailData = { - name: string; - slug: string; - description: string | null; - address: string; - chainId: App.Enums.Chain; - floorPrice: string | null; - floorPriceCurrency: string | null; - floorPriceDecimals: number | null; - floorPriceFiat: number | null; - image: string | null; - banner: string | null; - bannerUpdatedAt: string | null; - openSeaSlug: string | null; - website: string | null; - twitter: string | null; - discord: string | null; - supply: number | null; - volume: string | null; - owners: number | null; - nftsCount: number; - mintedAt: number | null; - activityUpdatedAt: string | null; - activityUpdateRequestedAt: string | null; - isFetchingActivity: boolean | null; - }; - export type CollectionFeaturedData = { - id: number; - name: string; - slug: string; - address: string; - chainId: App.Enums.Chain; - floorPrice: string | null; - floorPriceFiat: number | null; - floorPriceCurrency: string | null; - floorPriceDecimals: number | null; - image: string | null; - banner: string | null; - openSeaSlug: string | null; - website: string; - nftsCount: number; - nfts: Array; - isFeatured: boolean; - description: string | null; - volume: string | null; - }; - export type CollectionNftData = { - id: number; - collectionId: number; - name: string | null; - tokenNumber: string; - images: App.Data.Nfts.NftImagesData; - traits: Array; - }; - export type CollectionStatsData = { - nfts: number; - collections: number; - value: number | null; - }; - export type CollectionTraitData = { - displayType: string; - name: string; - /** Use the displayType to infer the actual type. */ value: string | number; - /** Only present for numeric displayTypes. */ valueMin: ?number; - /** Only present for numeric displayTypes. */ valueMax: ?number; - nftsCount: number; - nftsPercentage: number; - }; - export type CollectionTraitFilterData = { - name: string; - value: string; - displayType: string; - nftsCount: number; - }; - export type PopularCollectionData = { - id: number; - name: string; - slug: string; - chainId: App.Enums.Chain; - floorPrice: string | null; - floorPriceCurrency: string | null; - floorPriceDecimals: number | null; - volume: string | null; - volumeFiat: number | null; - volumeCurrency: string | null; - volumeDecimals: number | null; - image: string | null; - }; - export type SimpleNftData = { - id: number; - tokenNumber: string; - images: App.Data.Nfts.NftImagesData; - }; +export type CollectionBasicDetailsData = { +slug: string; +chainId: App.Enums.Chain; +}; +export type CollectionData = { +id: number; +name: string; +slug: string; +address: string; +chainId: App.Enums.Chain; +floorPrice: string | null; +floorPriceFiat: number | null; +floorPriceCurrency: string | null; +floorPriceDecimals: number | null; +image: string | null; +banner: string | null; +openSeaSlug: string | null; +website: string; +nftsCount: number; +nfts: Array; +}; +export type CollectionDetailData = { +name: string; +slug: string; +description: string | null; +address: string; +chainId: App.Enums.Chain; +floorPrice: string | null; +floorPriceCurrency: string | null; +floorPriceDecimals: number | null; +floorPriceFiat: number | null; +image: string | null; +banner: string | null; +bannerUpdatedAt: string | null; +openSeaSlug: string | null; +website: string | null; +twitter: string | null; +discord: string | null; +supply: number | null; +volume: string | null; +owners: number | null; +nftsCount: number; +mintedAt: number | null; +activityUpdatedAt: string | null; +activityUpdateRequestedAt: string | null; +isFetchingActivity: boolean | null; +}; +export type CollectionFeaturedData = { +id: number; +name: string; +slug: string; +address: string; +chainId: App.Enums.Chain; +floorPrice: string | null; +floorPriceFiat: number | null; +floorPriceCurrency: string | null; +floorPriceDecimals: number | null; +image: string | null; +banner: string | null; +openSeaSlug: string | null; +website: string; +nftsCount: number; +nfts: Array; +isFeatured: boolean; +description: string | null; +volume: string | null; +}; +export type CollectionNftData = { +id: number; +collectionId: number; +name: string | null; +tokenNumber: string; +images: App.Data.Nfts.NftImagesData; +traits: Array; +}; +export type CollectionStatsData = { +nfts: number; +collections: number; +value: number | null; +}; +export type CollectionTraitData = {displayType:string;name:string;/** Use the displayType to infer the actual type. */ value:string | number;/** Only present for numeric displayTypes. */ valueMin:?number;/** Only present for numeric displayTypes. */ valueMax:?number;nftsCount:number;nftsPercentage:number;}; +export type CollectionTraitFilterData = { +name: string; +value: string; +displayType: string; +nftsCount: number; +}; +export type PopularCollectionData = { +id: number; +name: string; +slug: string; +chainId: App.Enums.Chain; +floorPrice: string | null; +floorPriceCurrency: string | null; +floorPriceDecimals: number | null; +volume: string | null; +volumeFiat: number | null; +volumeCurrency: string | null; +volumeDecimals: number | null; +image: string | null; +}; +export type SimpleNftData = { +id: number; +tokenNumber: string; +images: App.Data.Nfts.NftImagesData; +}; } declare namespace App.Data.Gallery { - export type GalleriesCardData = { - paginated: { - data: Array; - links: Array<{ url: string | null; label: string; active: boolean }>; - meta: { - current_page: number; - first_page_url: string; - from: number | null; - last_page: number; - last_page_url: string; - next_page_url: string | null; - path: string; - per_page: number; - prev_page_url: string | null; - to: number | null; - total: number; - }; - }; - }; - export type GalleriesData = { - paginated: { - data: Array; - links: Array<{ url: string | null; label: string; active: boolean }>; - meta: { - current_page: number; - first_page_url: string; - from: number | null; - last_page: number; - last_page_url: string; - next_page_url: string | null; - path: string; - per_page: number; - prev_page_url: string | null; - to: number | null; - total: number; - }; - }; - }; - export type GalleriesStatsData = { - users: number; - galleries: number; - collections: number; - nfts: number; - }; - export type GalleryCardData = { - id: number; - name: string; - slug: string; - likes: number; - views: number; - nftsCount: number; - collectionsCount: number; - value: number | null; - coverImage: string | null; - wallet: App.Data.SimpleWalletData; - nfts: Array; - isOwner: boolean; - hasLiked: boolean; - }; - export type GalleryCollectionData = { - name: string; - slug: string; - address: string; - chainId: App.Enums.Chain; - floorPrice: string | null; - floorPriceFiat: number | null; - floorPriceCurrency: string | null; - floorPriceDecimals: number | null; - image: string | null; - banner: string | null; - bannerUpdatedAt: string | null; - openSeaSlug: string | null; - website: string | null; - nftsCount: number | null; - }; - export type GalleryCollectionsData = { - paginated: { - data: Array; - links: Array<{ url: string | null; label: string; active: boolean }>; - meta: { - current_page: number; - first_page_url: string; - from: number | null; - last_page: number; - last_page_url: string; - next_page_url: string | null; - path: string; - per_page: number; - prev_page_url: string | null; - to: number | null; - total: number; - }; - }; - }; - export type GalleryData = { - id: number; - name: string; - slug: string; - likes: number; - views: number; - nftsCount: number; - collectionsCount: number; - value: number | null; - coverImage: string | null; - wallet: App.Data.SimpleWalletData; - nfts: App.Data.Gallery.GalleryNftsData; - isOwner: boolean; - hasLiked: boolean; - }; - export type GalleryNftData = { - id: number; - name: string | null; - tokenNumber: string; - tokenAddress: string; - chainId: number; - images: App.Data.ImagesData; - collectionName: string; - collectionSlug: string; - collectionNftCount: number; - collectionWebsite: string; - collectionImage: string | null; - floorPrice: string | null; - floorPriceCurrency: string | null; - floorPriceDecimals: number | null; - lastActivityFetchedAt: string | null; - lastViewedAt: string | null; - ownedByCurrentUser: boolean; - }; - export type GalleryNftsData = { - paginated: { - data: Array; - links: Array<{ url: string | null; label: string; active: boolean }>; - meta: { - current_page: number; - first_page_url: string; - from: number | null; - last_page: number; - last_page_url: string; - next_page_url: string | null; - path: string; - per_page: number; - prev_page_url: string | null; - to: number | null; - total: number; - }; - }; - }; - export type GalleryStatsData = { - collections: number; - nfts: number; - likes: number; - }; +export type GalleriesCardData = { +paginated: {data:Array;links:Array<{url:string | null;label:string;active:boolean;}>;meta:{current_page:number;first_page_url:string;from:number | null;last_page:number;last_page_url:string;next_page_url:string | null;path:string;per_page:number;prev_page_url:string | null;to:number | null;total:number;};}; +}; +export type GalleriesData = { +paginated: {data:Array;links:Array<{url:string | null;label:string;active:boolean;}>;meta:{current_page:number;first_page_url:string;from:number | null;last_page:number;last_page_url:string;next_page_url:string | null;path:string;per_page:number;prev_page_url:string | null;to:number | null;total:number;};}; +}; +export type GalleriesStatsData = { +users: number; +galleries: number; +collections: number; +nfts: number; +}; +export type GalleryCardData = { +id: number; +name: string; +slug: string; +likes: number; +views: number; +nftsCount: number; +collectionsCount: number; +value: number | null; +coverImage: string | null; +wallet: App.Data.SimpleWalletData; +nfts: Array; +isOwner: boolean; +hasLiked: boolean; +}; +export type GalleryCollectionData = { +name: string; +slug: string; +address: string; +chainId: App.Enums.Chain; +floorPrice: string | null; +floorPriceFiat: number | null; +floorPriceCurrency: string | null; +floorPriceDecimals: number | null; +image: string | null; +banner: string | null; +bannerUpdatedAt: string | null; +openSeaSlug: string | null; +website: string | null; +nftsCount: number | null; +}; +export type GalleryCollectionsData = { +paginated: {data:Array;links:Array<{url:string | null;label:string;active:boolean;}>;meta:{current_page:number;first_page_url:string;from:number | null;last_page:number;last_page_url:string;next_page_url:string | null;path:string;per_page:number;prev_page_url:string | null;to:number | null;total:number;};}; +}; +export type GalleryData = { +id: number; +name: string; +slug: string; +likes: number; +views: number; +nftsCount: number; +collectionsCount: number; +value: number | null; +coverImage: string | null; +wallet: App.Data.SimpleWalletData; +nfts: App.Data.Gallery.GalleryNftsData; +isOwner: boolean; +hasLiked: boolean; +}; +export type GalleryNftData = { +id: number; +name: string | null; +tokenNumber: string; +tokenAddress: string; +chainId: number; +images: App.Data.ImagesData; +collectionName: string; +collectionSlug: string; +collectionNftCount: number; +collectionWebsite: string; +collectionImage: string | null; +floorPrice: string | null; +floorPriceCurrency: string | null; +floorPriceDecimals: number | null; +lastActivityFetchedAt: string | null; +lastViewedAt: string | null; +ownedByCurrentUser: boolean; +}; +export type GalleryNftsData = { +paginated: {data:Array;links:Array<{url:string | null;label:string;active:boolean;}>;meta:{current_page:number;first_page_url:string;from:number | null;last_page:number;last_page_url:string;next_page_url:string | null;path:string;per_page:number;prev_page_url:string | null;to:number | null;total:number;};}; +}; +export type GalleryStatsData = { +collections: number; +nfts: number; +likes: number; +}; } declare namespace App.Data.Network { - export type NetworkWithCollectionsData = { - id: number; - name: string; - isMainnet: boolean; - chainId: App.Enums.Chain; - publicRpcProvider: string; - explorerUrl: string; - collectionsCount: number; - }; +export type NetworkWithCollectionsData = { +id: number; +name: string; +isMainnet: boolean; +chainId: App.Enums.Chain; +publicRpcProvider: string; +explorerUrl: string; +collectionsCount: number; +}; } declare namespace App.Data.Nfts { - export type NftActivitiesData = { - paginated: { - data: Array; - links: Array<{ url: string | null; label: string; active: boolean }>; - meta: { - current_page: number; - first_page_url: string; - from: number | null; - last_page: number; - last_page_url: string; - next_page_url: string | null; - path: string; - per_page: number; - prev_page_url: string | null; - to: number | null; - total: number; - }; - }; - }; - export type NftActivityData = { - id: string; - sender: string; - recipient: string; - timestamp: number; - nft: App.Data.Collections.CollectionNftData; - type: App.Enums.NftTransferType; - totalNative: string | null; - totalUsd: string | null; - }; - export type NftCollectionData = { - name: string; - slug: string; - description: string | null; - address: string; - chainId: App.Enums.Chain; - floorPrice: string | null; - website: string; - image: string | null; - openSeaSlug: string | null; - }; - export type NftData = { - id: number; - name: string | null; - description: string | null; - tokenNumber: string; - collection: App.Data.Nfts.NftCollectionData; - images: App.Data.Nfts.NftImagesData; - wallet: App.Data.SimpleWalletData | null; - lastViewedAt: string | null; - lastActivityFetchedAt: string | null; - }; - export type NftImagesData = { - /** 96x96 */ thumb: string | null; - /** 256x256 */ small: string | null; - /** 512x512 */ large: string | null; - original: string | null; - originalRaw: string | null; - }; +export type NftActivitiesData = { +paginated: {data:Array;links:Array<{url:string | null;label:string;active:boolean;}>;meta:{current_page:number;first_page_url:string;from:number | null;last_page:number;last_page_url:string;next_page_url:string | null;path:string;per_page:number;prev_page_url:string | null;to:number | null;total:number;};}; +}; +export type NftActivityData = { +id: string; +sender: string; +recipient: string; +timestamp: number; +nft: App.Data.Collections.CollectionNftData; +type: App.Enums.NftTransferType; +totalNative: string | null; +totalUsd: string | null; +}; +export type NftCollectionData = { +name: string; +slug: string; +description: string | null; +address: string; +chainId: App.Enums.Chain; +floorPrice: string | null; +website: string; +image: string | null; +openSeaSlug: string | null; +}; +export type NftData = { +id: number; +name: string | null; +description: string | null; +tokenNumber: string; +collection: App.Data.Nfts.NftCollectionData; +images: App.Data.Nfts.NftImagesData; +wallet: App.Data.SimpleWalletData | null; +lastViewedAt: string | null; +lastActivityFetchedAt: string | null; +}; +export type NftImagesData = {/** 96x96 */ thumb:string | null;/** 256x256 */ small:string | null;/** 512x512 */ large:string | null;original:string|null;originalRaw:string|null;}; } declare namespace App.Data.Token { - export type TokenData = { - address: string; - isNativeToken: boolean; - isDefaultToken: boolean; - chainId: App.Enums.Chain; - guid: number | null; - name: string; - symbol: string; - decimals: number; - images: App.Data.ImagesData; - marketCap: number | null; - volume: number | null; - socials: { website: string | null; discord: string | null; twitter: string | null }; - marketData: { - market_cap: string | null; - total_volume: string | null; - minted_supply: string | null; - ath: string | null; - atl: string | null; - }; - }; - export type TokenPriceData = { - guid: number; - price: Partial>; - }; - export type TokenPriceLookupData = Partial>>>; - export type TokenPricesData = { - paginated: { - data: Array; - links: Array<{ url: string | null; label: string; active: boolean }>; - meta: { - current_page: number; - first_page_url: string; - from: number | null; - last_page: number; - last_page_url: string; - next_page_url: string | null; - path: string; - per_page: number; - prev_page_url: string | null; - to: number | null; - total: number; - }; +export type TokenData = { +address: string; +isNativeToken: boolean; +isDefaultToken: boolean; +chainId: App.Enums.Chain; +guid: number | null; +name: string; +symbol: string; +decimals: number; +images: App.Data.ImagesData; +marketCap: number | null; +volume: number | null; +socials: { website: string | null; discord: string | null; twitter: string | null; }; +marketData: { + market_cap: string|null; + total_volume: string|null; + minted_supply: string|null; + ath: string|null; + atl: string|null; }; - }; +}; +export type TokenPriceData = { +guid: number; +price: Partial>; +}; +export type TokenPriceLookupData = Partial>>>; +export type TokenPricesData = { +paginated: {data:Array;links:Array<{url:string | null;label:string;active:boolean;}>;meta:{current_page:number;first_page_url:string;from:number | null;last_page:number;last_page_url:string;next_page_url:string | null;path:string;per_page:number;prev_page_url:string | null;to:number | null;total:number;};}; +}; } declare namespace App.Data.Wallet { - export type WalletAvatarData = { - default: string | null; - small: string | null; - small2x: string | null; - }; - export type WalletBalance = { - address: string; - balance: string; - formattedBalance: string; - }; - export type WalletData = { - address: string; - domain: string | null; - avatar: WalletAvatarData; - totalUsd: number; - totalBalanceInCurrency: string; - totalTokens: number; - collectionCount: number; - galleryCount: number; - timestamps: { tokens_fetched_at: number | null; native_balances_fetched_at: number | null }; - isRefreshingCollections: boolean; - canRefreshCollections: boolean; - }; +export type WalletAvatarData = { +default: string | null; +small: string | null; +small2x: string | null; +}; +export type WalletBalance = { +address: string; +balance: string; +formattedBalance: string; +}; +export type WalletData = {address:string;domain:string | null;avatar:WalletAvatarData;totalUsd:number;totalBalanceInCurrency:string;totalTokens:number;collectionCount:number;galleryCount:number;timestamps:{tokens_fetched_at: number|null, native_balances_fetched_at: number|null};isRefreshingCollections:boolean;canRefreshCollections:boolean;}; } declare namespace App.Enums { - export type Chain = 1 | 5 | 137 | 80001; - export type NftTransferType = "LABEL_MINT" | "LABEL_SALE" | "LABEL_TRANSFER"; +export type Chain = 1 | 5 | 137 | 80001; +export type NftTransferType = 'LABEL_MINT' | 'LABEL_SALE' | 'LABEL_TRANSFER'; } From dc40526c97b188431e23bf8f47b5bf4756de0d97 Mon Sep 17 00:00:00 2001 From: Juan Patricio Marroquin Date: Thu, 23 Nov 2023 10:27:06 -0500 Subject: [PATCH 40/61] feat: setNfts method for collections model --- app/Http/Controllers/CollectionController.php | 5 +- app/Models/Collection.php | 5 + resources/types/generated.d.ts | 914 ++++++++++-------- 3 files changed, 536 insertions(+), 388 deletions(-) diff --git a/app/Http/Controllers/CollectionController.php b/app/Http/Controllers/CollectionController.php index 5496f3056..98275bd84 100644 --- a/app/Http/Controllers/CollectionController.php +++ b/app/Http/Controllers/CollectionController.php @@ -29,6 +29,7 @@ use Illuminate\Http\JsonResponse; use Illuminate\Http\RedirectResponse; use Illuminate\Http\Request; +use Illuminate\Pagination\LengthAwarePaginator; use Illuminate\Support\Facades\Cache; use Inertia\Inertia; use Inertia\Response; @@ -45,9 +46,9 @@ public function index(Request $request): Response|JsonResponse|RedirectResponse ->get(); $featuredCollections->each(function (Collection $collection) { - $collection->nfts = Cache::remember('featuredNftsForCollection'.$collection->id, 60 * 12, function () use ($collection) { + $collection->setNfts(Cache::remember('featuredNftsForCollection'.$collection->id, 60 * 12, function () use ($collection) { return $collection->nfts()->inRandomOrder()->take(3)->get(); - }); + })); }); $currency = $user ? $user->currency() : CurrencyCode::USD; diff --git a/app/Models/Collection.php b/app/Models/Collection.php index 6ddcd18fb..4d2bb881a 100644 --- a/app/Models/Collection.php +++ b/app/Models/Collection.php @@ -531,4 +531,9 @@ public function isSpam(): bool { return SpamContract::isSpam($this->address, $this->network); } + + public function setNfts($nfts) + { + $this->nfts = $nfts; + } } diff --git a/resources/types/generated.d.ts b/resources/types/generated.d.ts index b0fdcb531..c55fa3cec 100644 --- a/resources/types/generated.d.ts +++ b/resources/types/generated.d.ts @@ -1,405 +1,547 @@ declare namespace App.Data { -export type Attributes = { -currency: string; -date_format: string; -time_format: "12"|"24"; -timezone: string; -}; -export type AuthData = { -user: App.Data.UserData | null; -wallet: App.Data.Wallet.WalletData | null; -authenticated: boolean; -signed: boolean; -}; -export type CurrencyPriceData = { -price: number; -percentChange24h: number; -}; -export type ImagesData = {/** 96x96 */ thumb:string | null;/** 256x256 */ small:string | null;/** 512x512 */ large:string | null;}; -export type NetworkData = { -name: string; -isMainnet: boolean; -chainId: number; -publicRpcProvider: string; -explorerUrl: string; -}; -export type PriceHistoryData = { -timestamp: number; -price: number; -}; -export type SimpleWalletData = { -address: string; -domain: string | null; -avatar: App.Data.Wallet.WalletAvatarData; -}; -export type TokenListItemData = { -guid: number | null; -name: string; -symbol: string; -token_price: string | null; -address: string; -is_native_token: boolean; -balance: string; -decimals: number; -chain_id: App.Enums.Chain; -network_id: number; -minted_supply: string | null; -total_market_cap: string | null; -ath: string | null; -atl: string | null; -total_volume: string | null; -fiat_balance: string | null; -price_change_24h_in_currency: string | null; -website_url: string | null; -twitter_url: string | null; -discord_url: string | null; -explorer_url: string; -logo_url: string | null; -percentage: string; -}; -export type TokenPortfolioData = { -name: string; -symbol: string; -balance: string | null; -decimals: string | null; -fiat_balance: string; -percentage: string; -}; -export type TransactionData = { -hash: string; -isSent: boolean; -isErrored: boolean; -isPending: boolean; -timestamp: number; -amount: string; -fee: string; -from: string; -to: string; -gasPrice: string; -gasUsed: string; -nonce: string; -}; -export type UserData = { -attributes: Attributes; -}; + export type Attributes = { + currency: string; + date_format: string; + time_format: "12" | "24"; + timezone: string; + }; + export type AuthData = { + user: App.Data.UserData | null; + wallet: App.Data.Wallet.WalletData | null; + authenticated: boolean; + signed: boolean; + }; + export type CurrencyPriceData = { + price: number; + percentChange24h: number; + }; + export type ImagesData = { + /** 96x96 */ thumb: string | null; + /** 256x256 */ small: string | null; + /** 512x512 */ large: string | null; + }; + export type NetworkData = { + name: string; + isMainnet: boolean; + chainId: number; + publicRpcProvider: string; + explorerUrl: string; + }; + export type PriceHistoryData = { + timestamp: number; + price: number; + }; + export type SimpleWalletData = { + address: string; + domain: string | null; + avatar: App.Data.Wallet.WalletAvatarData; + }; + export type TokenListItemData = { + guid: number | null; + name: string; + symbol: string; + token_price: string | null; + address: string; + is_native_token: boolean; + balance: string; + decimals: number; + chain_id: App.Enums.Chain; + network_id: number; + minted_supply: string | null; + total_market_cap: string | null; + ath: string | null; + atl: string | null; + total_volume: string | null; + fiat_balance: string | null; + price_change_24h_in_currency: string | null; + website_url: string | null; + twitter_url: string | null; + discord_url: string | null; + explorer_url: string; + logo_url: string | null; + percentage: string; + }; + export type TokenPortfolioData = { + name: string; + symbol: string; + balance: string | null; + decimals: string | null; + fiat_balance: string; + percentage: string; + }; + export type TransactionData = { + hash: string; + isSent: boolean; + isErrored: boolean; + isPending: boolean; + timestamp: number; + amount: string; + fee: string; + from: string; + to: string; + gasPrice: string; + gasUsed: string; + nonce: string; + }; + export type UserData = { + attributes: Attributes; + }; } declare namespace App.Data.Articles { -export type ArticleData = { -id: number; -title: string; -slug: string; -category: App.Enums.ArticleCategoryEnum; -audioSrc: string | null; -content: string; -image: { small: string, small2x: string, medium: string, medium2x: string, large: string, large2x: string }; -publishedAt: number; -userId: number; -authorName: string; -authorAvatar: { thumb: string | null, thumb2x: string | null }; -featuredCollections: Array; -metaDescription: string | null; -}; -export type ArticlesData = { -paginated: {data:Array;links:Array<{url:string | null;label:string;active:boolean;}>;meta:{current_page:number;first_page_url:string;from:number | null;last_page:number;last_page_url:string;next_page_url:string | null;path:string;per_page:number;prev_page_url:string | null;to:number | null;total:number;};}; -}; -export type FeaturedCollectionData = { -name: string; -slug: string; -image: string | null; -}; + export type ArticleData = { + id: number; + title: string; + slug: string; + category: App.Enums.ArticleCategoryEnum; + audioSrc: string | null; + content: string; + image: { small: string; small2x: string; medium: string; medium2x: string; large: string; large2x: string }; + publishedAt: number; + userId: number; + authorName: string; + authorAvatar: { thumb: string | null; thumb2x: string | null }; + featuredCollections: Array; + metaDescription: string | null; + }; + export type ArticlesData = { + paginated: { + data: Array; + links: Array<{ url: string | null; label: string; active: boolean }>; + meta: { + current_page: number; + first_page_url: string; + from: number | null; + last_page: number; + last_page_url: string; + next_page_url: string | null; + path: string; + per_page: number; + prev_page_url: string | null; + to: number | null; + total: number; + }; + }; + }; + export type FeaturedCollectionData = { + name: string; + slug: string; + image: string | null; + }; } declare namespace App.Data.Collections { -export type CollectionBasicDetailsData = { -slug: string; -chainId: App.Enums.Chain; -}; -export type CollectionData = { -id: number; -name: string; -slug: string; -address: string; -chainId: App.Enums.Chain; -floorPrice: string | null; -floorPriceFiat: number | null; -floorPriceCurrency: string | null; -floorPriceDecimals: number | null; -image: string | null; -banner: string | null; -openSeaSlug: string | null; -website: string; -nftsCount: number; -nfts: Array; -}; -export type CollectionDetailData = { -name: string; -slug: string; -description: string | null; -address: string; -chainId: App.Enums.Chain; -floorPrice: string | null; -floorPriceCurrency: string | null; -floorPriceDecimals: number | null; -floorPriceFiat: number | null; -image: string | null; -banner: string | null; -bannerUpdatedAt: string | null; -openSeaSlug: string | null; -website: string | null; -twitter: string | null; -discord: string | null; -supply: number | null; -volume: string | null; -owners: number | null; -nftsCount: number; -mintedAt: number | null; -activityUpdatedAt: string | null; -activityUpdateRequestedAt: string | null; -isFetchingActivity: boolean | null; -}; -export type CollectionFeaturedData = { -id: number; -name: string; -slug: string; -address: string; -chainId: App.Enums.Chain; -floorPrice: string | null; -floorPriceFiat: number | null; -floorPriceCurrency: string | null; -floorPriceDecimals: number | null; -image: string | null; -banner: string | null; -openSeaSlug: string | null; -website: string; -nftsCount: number; -nfts: Array; -isFeatured: boolean; -description: string | null; -volume: string | null; -}; -export type CollectionNftData = { -id: number; -collectionId: number; -name: string | null; -tokenNumber: string; -images: App.Data.Nfts.NftImagesData; -traits: Array; -}; -export type CollectionStatsData = { -nfts: number; -collections: number; -value: number | null; -}; -export type CollectionTraitData = {displayType:string;name:string;/** Use the displayType to infer the actual type. */ value:string | number;/** Only present for numeric displayTypes. */ valueMin:?number;/** Only present for numeric displayTypes. */ valueMax:?number;nftsCount:number;nftsPercentage:number;}; -export type CollectionTraitFilterData = { -name: string; -value: string; -displayType: string; -nftsCount: number; -}; -export type PopularCollectionData = { -id: number; -name: string; -slug: string; -chainId: App.Enums.Chain; -floorPrice: string | null; -floorPriceCurrency: string | null; -floorPriceDecimals: number | null; -volume: string | null; -volumeFiat: number | null; -volumeCurrency: string | null; -volumeDecimals: number | null; -image: string | null; -}; -export type SimpleNftData = { -id: number; -tokenNumber: string; -images: App.Data.Nfts.NftImagesData; -}; + export type CollectionBasicDetailsData = { + slug: string; + chainId: App.Enums.Chain; + }; + export type CollectionData = { + id: number; + name: string; + slug: string; + address: string; + chainId: App.Enums.Chain; + floorPrice: string | null; + floorPriceFiat: number | null; + floorPriceCurrency: string | null; + floorPriceDecimals: number | null; + image: string | null; + banner: string | null; + openSeaSlug: string | null; + website: string; + nftsCount: number; + nfts: Array; + }; + export type CollectionDetailData = { + name: string; + slug: string; + description: string | null; + address: string; + chainId: App.Enums.Chain; + floorPrice: string | null; + floorPriceCurrency: string | null; + floorPriceDecimals: number | null; + floorPriceFiat: number | null; + image: string | null; + banner: string | null; + bannerUpdatedAt: string | null; + openSeaSlug: string | null; + website: string | null; + twitter: string | null; + discord: string | null; + supply: number | null; + volume: string | null; + owners: number | null; + nftsCount: number; + mintedAt: number | null; + activityUpdatedAt: string | null; + activityUpdateRequestedAt: string | null; + isFetchingActivity: boolean | null; + }; + export type CollectionFeaturedData = { + id: number; + name: string; + slug: string; + address: string; + chainId: App.Enums.Chain; + floorPrice: string | null; + floorPriceFiat: number | null; + floorPriceCurrency: string | null; + floorPriceDecimals: number | null; + image: string | null; + banner: string | null; + openSeaSlug: string | null; + website: string; + nftsCount: number; + nfts: Array; + isFeatured: boolean; + description: string | null; + volume: string | null; + }; + export type CollectionNftData = { + id: number; + collectionId: number; + name: string | null; + tokenNumber: string; + images: App.Data.Nfts.NftImagesData; + traits: Array; + }; + export type CollectionStatsData = { + nfts: number; + collections: number; + value: number | null; + }; + export type CollectionTraitData = { + displayType: string; + name: string; + /** Use the displayType to infer the actual type. */ value: string | number; + /** Only present for numeric displayTypes. */ valueMin: ?number; + /** Only present for numeric displayTypes. */ valueMax: ?number; + nftsCount: number; + nftsPercentage: number; + }; + export type CollectionTraitFilterData = { + name: string; + value: string; + displayType: string; + nftsCount: number; + }; + export type PopularCollectionData = { + id: number; + name: string; + slug: string; + chainId: App.Enums.Chain; + floorPrice: string | null; + floorPriceCurrency: string | null; + floorPriceDecimals: number | null; + volume: string | null; + volumeFiat: number | null; + volumeCurrency: string | null; + volumeDecimals: number | null; + image: string | null; + }; + export type SimpleNftData = { + id: number; + tokenNumber: string; + images: App.Data.Nfts.NftImagesData; + }; } declare namespace App.Data.Gallery { -export type GalleriesCardData = { -paginated: {data:Array;links:Array<{url:string | null;label:string;active:boolean;}>;meta:{current_page:number;first_page_url:string;from:number | null;last_page:number;last_page_url:string;next_page_url:string | null;path:string;per_page:number;prev_page_url:string | null;to:number | null;total:number;};}; -}; -export type GalleriesData = { -paginated: {data:Array;links:Array<{url:string | null;label:string;active:boolean;}>;meta:{current_page:number;first_page_url:string;from:number | null;last_page:number;last_page_url:string;next_page_url:string | null;path:string;per_page:number;prev_page_url:string | null;to:number | null;total:number;};}; -}; -export type GalleriesStatsData = { -users: number; -galleries: number; -collections: number; -nfts: number; -}; -export type GalleryCardData = { -id: number; -name: string; -slug: string; -likes: number; -views: number; -nftsCount: number; -collectionsCount: number; -value: number | null; -coverImage: string | null; -wallet: App.Data.SimpleWalletData; -nfts: Array; -isOwner: boolean; -hasLiked: boolean; -}; -export type GalleryCollectionData = { -name: string; -slug: string; -address: string; -chainId: App.Enums.Chain; -floorPrice: string | null; -floorPriceFiat: number | null; -floorPriceCurrency: string | null; -floorPriceDecimals: number | null; -image: string | null; -banner: string | null; -bannerUpdatedAt: string | null; -openSeaSlug: string | null; -website: string | null; -nftsCount: number | null; -}; -export type GalleryCollectionsData = { -paginated: {data:Array;links:Array<{url:string | null;label:string;active:boolean;}>;meta:{current_page:number;first_page_url:string;from:number | null;last_page:number;last_page_url:string;next_page_url:string | null;path:string;per_page:number;prev_page_url:string | null;to:number | null;total:number;};}; -}; -export type GalleryData = { -id: number; -name: string; -slug: string; -likes: number; -views: number; -nftsCount: number; -collectionsCount: number; -value: number | null; -coverImage: string | null; -wallet: App.Data.SimpleWalletData; -nfts: App.Data.Gallery.GalleryNftsData; -isOwner: boolean; -hasLiked: boolean; -}; -export type GalleryNftData = { -id: number; -name: string | null; -tokenNumber: string; -tokenAddress: string; -chainId: number; -images: App.Data.ImagesData; -collectionName: string; -collectionSlug: string; -collectionNftCount: number; -collectionWebsite: string; -collectionImage: string | null; -floorPrice: string | null; -floorPriceCurrency: string | null; -floorPriceDecimals: number | null; -lastActivityFetchedAt: string | null; -lastViewedAt: string | null; -ownedByCurrentUser: boolean; -}; -export type GalleryNftsData = { -paginated: {data:Array;links:Array<{url:string | null;label:string;active:boolean;}>;meta:{current_page:number;first_page_url:string;from:number | null;last_page:number;last_page_url:string;next_page_url:string | null;path:string;per_page:number;prev_page_url:string | null;to:number | null;total:number;};}; -}; -export type GalleryStatsData = { -collections: number; -nfts: number; -likes: number; -}; + export type GalleriesCardData = { + paginated: { + data: Array; + links: Array<{ url: string | null; label: string; active: boolean }>; + meta: { + current_page: number; + first_page_url: string; + from: number | null; + last_page: number; + last_page_url: string; + next_page_url: string | null; + path: string; + per_page: number; + prev_page_url: string | null; + to: number | null; + total: number; + }; + }; + }; + export type GalleriesData = { + paginated: { + data: Array; + links: Array<{ url: string | null; label: string; active: boolean }>; + meta: { + current_page: number; + first_page_url: string; + from: number | null; + last_page: number; + last_page_url: string; + next_page_url: string | null; + path: string; + per_page: number; + prev_page_url: string | null; + to: number | null; + total: number; + }; + }; + }; + export type GalleriesStatsData = { + users: number; + galleries: number; + collections: number; + nfts: number; + }; + export type GalleryCardData = { + id: number; + name: string; + slug: string; + likes: number; + views: number; + nftsCount: number; + collectionsCount: number; + value: number | null; + coverImage: string | null; + wallet: App.Data.SimpleWalletData; + nfts: Array; + isOwner: boolean; + hasLiked: boolean; + }; + export type GalleryCollectionData = { + name: string; + slug: string; + address: string; + chainId: App.Enums.Chain; + floorPrice: string | null; + floorPriceFiat: number | null; + floorPriceCurrency: string | null; + floorPriceDecimals: number | null; + image: string | null; + banner: string | null; + bannerUpdatedAt: string | null; + openSeaSlug: string | null; + website: string | null; + nftsCount: number | null; + }; + export type GalleryCollectionsData = { + paginated: { + data: Array; + links: Array<{ url: string | null; label: string; active: boolean }>; + meta: { + current_page: number; + first_page_url: string; + from: number | null; + last_page: number; + last_page_url: string; + next_page_url: string | null; + path: string; + per_page: number; + prev_page_url: string | null; + to: number | null; + total: number; + }; + }; + }; + export type GalleryData = { + id: number; + name: string; + slug: string; + likes: number; + views: number; + nftsCount: number; + collectionsCount: number; + value: number | null; + coverImage: string | null; + wallet: App.Data.SimpleWalletData; + nfts: App.Data.Gallery.GalleryNftsData; + isOwner: boolean; + hasLiked: boolean; + }; + export type GalleryNftData = { + id: number; + name: string | null; + tokenNumber: string; + tokenAddress: string; + chainId: number; + images: App.Data.ImagesData; + collectionName: string; + collectionSlug: string; + collectionNftCount: number; + collectionWebsite: string; + collectionImage: string | null; + floorPrice: string | null; + floorPriceCurrency: string | null; + floorPriceDecimals: number | null; + lastActivityFetchedAt: string | null; + lastViewedAt: string | null; + ownedByCurrentUser: boolean; + }; + export type GalleryNftsData = { + paginated: { + data: Array; + links: Array<{ url: string | null; label: string; active: boolean }>; + meta: { + current_page: number; + first_page_url: string; + from: number | null; + last_page: number; + last_page_url: string; + next_page_url: string | null; + path: string; + per_page: number; + prev_page_url: string | null; + to: number | null; + total: number; + }; + }; + }; + export type GalleryStatsData = { + collections: number; + nfts: number; + likes: number; + }; } declare namespace App.Data.Network { -export type NetworkWithCollectionsData = { -id: number; -name: string; -isMainnet: boolean; -chainId: App.Enums.Chain; -publicRpcProvider: string; -explorerUrl: string; -collectionsCount: number; -}; + export type NetworkWithCollectionsData = { + id: number; + name: string; + isMainnet: boolean; + chainId: App.Enums.Chain; + publicRpcProvider: string; + explorerUrl: string; + collectionsCount: number; + }; } declare namespace App.Data.Nfts { -export type NftActivitiesData = { -paginated: {data:Array;links:Array<{url:string | null;label:string;active:boolean;}>;meta:{current_page:number;first_page_url:string;from:number | null;last_page:number;last_page_url:string;next_page_url:string | null;path:string;per_page:number;prev_page_url:string | null;to:number | null;total:number;};}; -}; -export type NftActivityData = { -id: string; -sender: string; -recipient: string; -timestamp: number; -nft: App.Data.Collections.CollectionNftData; -type: App.Enums.NftTransferType; -totalNative: string | null; -totalUsd: string | null; -}; -export type NftCollectionData = { -name: string; -slug: string; -description: string | null; -address: string; -chainId: App.Enums.Chain; -floorPrice: string | null; -website: string; -image: string | null; -openSeaSlug: string | null; -}; -export type NftData = { -id: number; -name: string | null; -description: string | null; -tokenNumber: string; -collection: App.Data.Nfts.NftCollectionData; -images: App.Data.Nfts.NftImagesData; -wallet: App.Data.SimpleWalletData | null; -lastViewedAt: string | null; -lastActivityFetchedAt: string | null; -}; -export type NftImagesData = {/** 96x96 */ thumb:string | null;/** 256x256 */ small:string | null;/** 512x512 */ large:string | null;original:string|null;originalRaw:string|null;}; + export type NftActivitiesData = { + paginated: { + data: Array; + links: Array<{ url: string | null; label: string; active: boolean }>; + meta: { + current_page: number; + first_page_url: string; + from: number | null; + last_page: number; + last_page_url: string; + next_page_url: string | null; + path: string; + per_page: number; + prev_page_url: string | null; + to: number | null; + total: number; + }; + }; + }; + export type NftActivityData = { + id: string; + sender: string; + recipient: string; + timestamp: number; + nft: App.Data.Collections.CollectionNftData; + type: App.Enums.NftTransferType; + totalNative: string | null; + totalUsd: string | null; + }; + export type NftCollectionData = { + name: string; + slug: string; + description: string | null; + address: string; + chainId: App.Enums.Chain; + floorPrice: string | null; + website: string; + image: string | null; + openSeaSlug: string | null; + }; + export type NftData = { + id: number; + name: string | null; + description: string | null; + tokenNumber: string; + collection: App.Data.Nfts.NftCollectionData; + images: App.Data.Nfts.NftImagesData; + wallet: App.Data.SimpleWalletData | null; + lastViewedAt: string | null; + lastActivityFetchedAt: string | null; + }; + export type NftImagesData = { + /** 96x96 */ thumb: string | null; + /** 256x256 */ small: string | null; + /** 512x512 */ large: string | null; + original: string | null; + originalRaw: string | null; + }; } declare namespace App.Data.Token { -export type TokenData = { -address: string; -isNativeToken: boolean; -isDefaultToken: boolean; -chainId: App.Enums.Chain; -guid: number | null; -name: string; -symbol: string; -decimals: number; -images: App.Data.ImagesData; -marketCap: number | null; -volume: number | null; -socials: { website: string | null; discord: string | null; twitter: string | null; }; -marketData: { - market_cap: string|null; - total_volume: string|null; - minted_supply: string|null; - ath: string|null; - atl: string|null; + export type TokenData = { + address: string; + isNativeToken: boolean; + isDefaultToken: boolean; + chainId: App.Enums.Chain; + guid: number | null; + name: string; + symbol: string; + decimals: number; + images: App.Data.ImagesData; + marketCap: number | null; + volume: number | null; + socials: { website: string | null; discord: string | null; twitter: string | null }; + marketData: { + market_cap: string | null; + total_volume: string | null; + minted_supply: string | null; + ath: string | null; + atl: string | null; + }; + }; + export type TokenPriceData = { + guid: number; + price: Partial>; + }; + export type TokenPriceLookupData = Partial>>>; + export type TokenPricesData = { + paginated: { + data: Array; + links: Array<{ url: string | null; label: string; active: boolean }>; + meta: { + current_page: number; + first_page_url: string; + from: number | null; + last_page: number; + last_page_url: string; + next_page_url: string | null; + path: string; + per_page: number; + prev_page_url: string | null; + to: number | null; + total: number; + }; }; -}; -export type TokenPriceData = { -guid: number; -price: Partial>; -}; -export type TokenPriceLookupData = Partial>>>; -export type TokenPricesData = { -paginated: {data:Array;links:Array<{url:string | null;label:string;active:boolean;}>;meta:{current_page:number;first_page_url:string;from:number | null;last_page:number;last_page_url:string;next_page_url:string | null;path:string;per_page:number;prev_page_url:string | null;to:number | null;total:number;};}; -}; + }; } declare namespace App.Data.Wallet { -export type WalletAvatarData = { -default: string | null; -small: string | null; -small2x: string | null; -}; -export type WalletBalance = { -address: string; -balance: string; -formattedBalance: string; -}; -export type WalletData = {address:string;domain:string | null;avatar:WalletAvatarData;totalUsd:number;totalBalanceInCurrency:string;totalTokens:number;collectionCount:number;galleryCount:number;timestamps:{tokens_fetched_at: number|null, native_balances_fetched_at: number|null};isRefreshingCollections:boolean;canRefreshCollections:boolean;}; + export type WalletAvatarData = { + default: string | null; + small: string | null; + small2x: string | null; + }; + export type WalletBalance = { + address: string; + balance: string; + formattedBalance: string; + }; + export type WalletData = { + address: string; + domain: string | null; + avatar: WalletAvatarData; + totalUsd: number; + totalBalanceInCurrency: string; + totalTokens: number; + collectionCount: number; + galleryCount: number; + timestamps: { tokens_fetched_at: number | null; native_balances_fetched_at: number | null }; + isRefreshingCollections: boolean; + canRefreshCollections: boolean; + }; } declare namespace App.Enums { -export type Chain = 1 | 5 | 137 | 80001; -export type NftTransferType = 'LABEL_MINT' | 'LABEL_SALE' | 'LABEL_TRANSFER'; + export type Chain = 1 | 5 | 137 | 80001; + export type NftTransferType = "LABEL_MINT" | "LABEL_SALE" | "LABEL_TRANSFER"; } From 273b4b2a27de94b942a396aee14d757748fd7cc6 Mon Sep 17 00:00:00 2001 From: Juan Patricio Marroquin Date: Thu, 23 Nov 2023 10:31:35 -0500 Subject: [PATCH 41/61] fix: set types for setNfts --- app/Models/Collection.php | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/app/Models/Collection.php b/app/Models/Collection.php index 4d2bb881a..90221d817 100644 --- a/app/Models/Collection.php +++ b/app/Models/Collection.php @@ -532,7 +532,7 @@ public function isSpam(): bool return SpamContract::isSpam($this->address, $this->network); } - public function setNfts($nfts) + public function setNfts(array $nfts): void { $this->nfts = $nfts; } From 468aa62b8f3c4b6da93961d7b4e24c940d8b7d73 Mon Sep 17 00:00:00 2001 From: Juan Patricio Marroquin Date: Thu, 23 Nov 2023 10:47:31 -0500 Subject: [PATCH 42/61] fix: remove setNfts method --- app/Http/Controllers/CollectionController.php | 4 ++-- app/Models/Collection.php | 5 ----- 2 files changed, 2 insertions(+), 7 deletions(-) diff --git a/app/Http/Controllers/CollectionController.php b/app/Http/Controllers/CollectionController.php index 98275bd84..f9cf84181 100644 --- a/app/Http/Controllers/CollectionController.php +++ b/app/Http/Controllers/CollectionController.php @@ -46,9 +46,9 @@ public function index(Request $request): Response|JsonResponse|RedirectResponse ->get(); $featuredCollections->each(function (Collection $collection) { - $collection->setNfts(Cache::remember('featuredNftsForCollection'.$collection->id, 60 * 12, function () use ($collection) { + $collection->nfts = Cache::remember('featuredNftsForCollection'.$collection->id, 60 * 12, function () use ($collection) { return $collection->nfts()->inRandomOrder()->take(3)->get(); - })); + }); }); $currency = $user ? $user->currency() : CurrencyCode::USD; diff --git a/app/Models/Collection.php b/app/Models/Collection.php index 90221d817..6ddcd18fb 100644 --- a/app/Models/Collection.php +++ b/app/Models/Collection.php @@ -531,9 +531,4 @@ public function isSpam(): bool { return SpamContract::isSpam($this->address, $this->network); } - - public function setNfts(array $nfts): void - { - $this->nfts = $nfts; - } } From 1e2e92c0f8ec06b8c3f4b8b1933834774e2139c4 Mon Sep 17 00:00:00 2001 From: Juan Patricio Marroquin Date: Thu, 23 Nov 2023 11:09:18 -0500 Subject: [PATCH 43/61] fix: set cachedNfts as Collection property --- app/Data/Collections/CollectionFeaturedData.php | 2 +- app/Http/Controllers/CollectionController.php | 2 +- app/Models/Collection.php | 7 +++++++ 3 files changed, 9 insertions(+), 2 deletions(-) diff --git a/app/Data/Collections/CollectionFeaturedData.php b/app/Data/Collections/CollectionFeaturedData.php index c32300cc5..d48ced6e0 100644 --- a/app/Data/Collections/CollectionFeaturedData.php +++ b/app/Data/Collections/CollectionFeaturedData.php @@ -64,7 +64,7 @@ public static function fromModel(Collection $collection, CurrencyCode $currency) openSeaSlug: $collection->extra_attributes->get('opensea_slug'), website: $collection->website(), nftsCount: $collection->nfts_count, - nfts: GalleryNftData::collection($collection->nfts), + nfts: GalleryNftData::collection($collection->cachedNfts), isFeatured: $collection->is_featured, description: $collection->description, volume: $collection->volume, diff --git a/app/Http/Controllers/CollectionController.php b/app/Http/Controllers/CollectionController.php index f9cf84181..45034c029 100644 --- a/app/Http/Controllers/CollectionController.php +++ b/app/Http/Controllers/CollectionController.php @@ -46,7 +46,7 @@ public function index(Request $request): Response|JsonResponse|RedirectResponse ->get(); $featuredCollections->each(function (Collection $collection) { - $collection->nfts = Cache::remember('featuredNftsForCollection'.$collection->id, 60 * 12, function () use ($collection) { + $collection->cachedNfts = Cache::remember('featuredNftsForCollection'.$collection->id, 60 * 12, function () use ($collection) { return $collection->nfts()->inRandomOrder()->take(3)->get(); }); }); diff --git a/app/Models/Collection.php b/app/Models/Collection.php index 6ddcd18fb..36fba6adf 100644 --- a/app/Models/Collection.php +++ b/app/Models/Collection.php @@ -6,6 +6,7 @@ use App\Casts\StrippedHtml; use App\Enums\CurrencyCode; +use App\Models\Nft; use App\Models\Traits\BelongsToNetwork; use App\Models\Traits\Reportable; use App\Notifications\CollectionReport; @@ -33,6 +34,7 @@ * @property ?string $floor_price * @property ?string $last_indexed_token_number * @property ?string $image + * @property \Illuminate\Database\Eloquent\Collection|null $cachedNfts * * @method BelongsToMany
articlesWithCollections() */ @@ -44,6 +46,11 @@ class Collection extends Model const DISCORD_URL = 'https://discord.gg/'; + /** + * @var \Illuminate\Database\Eloquent\Collection|null + */ + public $cachedNfts = null; + /** * @var array */ From 9b55da7fa4095cd91f9587694445332dcde561df Mon Sep 17 00:00:00 2001 From: patricio0312rev Date: Thu, 23 Nov 2023 16:10:54 +0000 Subject: [PATCH 44/61] style: resolve style guide violations --- app/Models/Collection.php | 1 - 1 file changed, 1 deletion(-) diff --git a/app/Models/Collection.php b/app/Models/Collection.php index 36fba6adf..443c5c4d6 100644 --- a/app/Models/Collection.php +++ b/app/Models/Collection.php @@ -6,7 +6,6 @@ use App\Casts\StrippedHtml; use App\Enums\CurrencyCode; -use App\Models\Nft; use App\Models\Traits\BelongsToNetwork; use App\Models\Traits\Reportable; use App\Notifications\CollectionReport; From 8534aea19f262559c22e4ca74ccda3dda3ea62db Mon Sep 17 00:00:00 2001 From: Juan Patricio Marroquin Date: Thu, 23 Nov 2023 11:10:56 -0500 Subject: [PATCH 45/61] fix: remove null from cachedNfts type --- app/Models/Collection.php | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/app/Models/Collection.php b/app/Models/Collection.php index 36fba6adf..19cc87c72 100644 --- a/app/Models/Collection.php +++ b/app/Models/Collection.php @@ -34,7 +34,7 @@ * @property ?string $floor_price * @property ?string $last_indexed_token_number * @property ?string $image - * @property \Illuminate\Database\Eloquent\Collection|null $cachedNfts + * @property \Illuminate\Database\Eloquent\Collection $cachedNfts * * @method BelongsToMany
articlesWithCollections() */ @@ -47,9 +47,9 @@ class Collection extends Model const DISCORD_URL = 'https://discord.gg/'; /** - * @var \Illuminate\Database\Eloquent\Collection|null + * @var \Illuminate\Database\Eloquent\Collection */ - public $cachedNfts = null; + public $cachedNfts; /** * @var array From 8320784b439f066ea5c6911319b593fda8645d4c Mon Sep 17 00:00:00 2001 From: Juan Patricio Marroquin Date: Thu, 23 Nov 2023 11:45:20 -0500 Subject: [PATCH 46/61] test: CollectionController index --- database/factories/CollectionFactory.php | 1 + .../Controllers/CollectionControllerTest.php | 50 +++++++++++++++++++ 2 files changed, 51 insertions(+) diff --git a/database/factories/CollectionFactory.php b/database/factories/CollectionFactory.php index 92a619610..c2d6d2b45 100644 --- a/database/factories/CollectionFactory.php +++ b/database/factories/CollectionFactory.php @@ -38,6 +38,7 @@ public function definition(): array 'image' => fake()->imageUrl(360, 360, 'animals', true), 'website' => fake()->url(), ]), + 'is_featured' => fn () => random_int(0, 1), ]; } } diff --git a/tests/App/Http/Controllers/CollectionControllerTest.php b/tests/App/Http/Controllers/CollectionControllerTest.php index 635f619df..1eb9c5a1a 100644 --- a/tests/App/Http/Controllers/CollectionControllerTest.php +++ b/tests/App/Http/Controllers/CollectionControllerTest.php @@ -2,6 +2,7 @@ declare(strict_types=1); +use App\Enums\CurrencyCode; use App\Enums\TraitDisplayType; use App\Jobs\FetchCollectionActivity; use App\Jobs\FetchCollectionBanner; @@ -11,8 +12,10 @@ use App\Models\Network; use App\Models\Nft; use App\Models\Token; +use App\Models\User; use Carbon\Carbon; use Illuminate\Support\Facades\Bus; +use Illuminate\Support\Facades\Cache; use Inertia\Testing\AssertableInertia as Assert; it('can render the collections overview page', function () { @@ -23,6 +26,52 @@ ->assertStatus(200); }); +it('can return featured collections', function() { + $user = createUser(); + + Collection::factory(8)->create([ + 'is_featured' => false, + ]); + + Collection::factory(2)->create([ + 'is_featured' => true, + ]); + + $this->actingAs($user) + ->get(route('collections')) + ->assertStatus(200) + ->assertInertia( + fn (Assert $page) => $page + ->component('Collections/Index') + ->has( + 'featuredCollections' + ), + fn (Assert $page) => + $page->where('featuredCollections', 2) + + ); +}); + +it('can cache 3 random nfts from a featured collection', function() { + $user = createUser(); + + $collection = Collection::factory()->create([ + 'is_featured' => true, + ]); + + $nfts = Nft::factory(10)->create([ + 'collection_id' => $collection->id, + ]); + + $this->actingAs($user) + ->get(route('collections')) + ->assertStatus(200); + + $cachedNfts = Cache::get('featuredNftsForCollection' . $collection->id); + + expect(count($cachedNfts))->toEqual(3); +}); +/* it('can render the collections view page', function () { $user = createUser(); @@ -845,3 +894,4 @@ function attachImageToArticles($articles) Bus::assertNotDispatched(FetchCollectionActivity::class); }); + */ From c6e275349c975aaefe660b6d76cdc45bd35fbaed Mon Sep 17 00:00:00 2001 From: patricio0312rev Date: Thu, 23 Nov 2023 16:48:58 +0000 Subject: [PATCH 47/61] style: resolve style guide violations --- .../App/Http/Controllers/CollectionControllerTest.php | 11 ++++------- 1 file changed, 4 insertions(+), 7 deletions(-) diff --git a/tests/App/Http/Controllers/CollectionControllerTest.php b/tests/App/Http/Controllers/CollectionControllerTest.php index 1eb9c5a1a..04bb478d7 100644 --- a/tests/App/Http/Controllers/CollectionControllerTest.php +++ b/tests/App/Http/Controllers/CollectionControllerTest.php @@ -2,7 +2,6 @@ declare(strict_types=1); -use App\Enums\CurrencyCode; use App\Enums\TraitDisplayType; use App\Jobs\FetchCollectionActivity; use App\Jobs\FetchCollectionBanner; @@ -12,7 +11,6 @@ use App\Models\Network; use App\Models\Nft; use App\Models\Token; -use App\Models\User; use Carbon\Carbon; use Illuminate\Support\Facades\Bus; use Illuminate\Support\Facades\Cache; @@ -26,7 +24,7 @@ ->assertStatus(200); }); -it('can return featured collections', function() { +it('can return featured collections', function () { $user = createUser(); Collection::factory(8)->create([ @@ -46,13 +44,12 @@ ->has( 'featuredCollections' ), - fn (Assert $page) => - $page->where('featuredCollections', 2) + fn (Assert $page) => $page->where('featuredCollections', 2) ); }); -it('can cache 3 random nfts from a featured collection', function() { +it('can cache 3 random nfts from a featured collection', function () { $user = createUser(); $collection = Collection::factory()->create([ @@ -67,7 +64,7 @@ ->get(route('collections')) ->assertStatus(200); - $cachedNfts = Cache::get('featuredNftsForCollection' . $collection->id); + $cachedNfts = Cache::get('featuredNftsForCollection'.$collection->id); expect(count($cachedNfts))->toEqual(3); }); From 93f44bd1667dc162a30d768f49fa0342258fbfb3 Mon Sep 17 00:00:00 2001 From: Juan Patricio Marroquin Date: Thu, 23 Nov 2023 11:56:16 -0500 Subject: [PATCH 48/61] fix: restore tests --- tests/App/Http/Controllers/CollectionControllerTest.php | 3 +-- 1 file changed, 1 insertion(+), 2 deletions(-) diff --git a/tests/App/Http/Controllers/CollectionControllerTest.php b/tests/App/Http/Controllers/CollectionControllerTest.php index 1eb9c5a1a..6918d0323 100644 --- a/tests/App/Http/Controllers/CollectionControllerTest.php +++ b/tests/App/Http/Controllers/CollectionControllerTest.php @@ -71,7 +71,7 @@ expect(count($cachedNfts))->toEqual(3); }); -/* + it('can render the collections view page', function () { $user = createUser(); @@ -894,4 +894,3 @@ function attachImageToArticles($articles) Bus::assertNotDispatched(FetchCollectionActivity::class); }); - */ From 75714ecfdfdea839da4965fb145ec6d360284174 Mon Sep 17 00:00:00 2001 From: Juan Patricio Marroquin Date: Thu, 23 Nov 2023 11:56:21 -0500 Subject: [PATCH 49/61] fix: restore phpunit --- phpunit.xml | 5 ++--- 1 file changed, 2 insertions(+), 3 deletions(-) diff --git a/phpunit.xml b/phpunit.xml index 0ff1d4e8b..3af49fe2a 100644 --- a/phpunit.xml +++ b/phpunit.xml @@ -15,10 +15,9 @@ - + - - + From 57e80990db0ad4867ffcc1b56a6a86ffb5d5699c Mon Sep 17 00:00:00 2001 From: Patricio Marroquin <55117912+patricio0312rev@users.noreply.github.com> Date: Fri, 24 Nov 2023 06:19:43 -0500 Subject: [PATCH 50/61] Update resources/js/Pages/Collections/Components/FeaturedCollections/FeaturedCollectionsItem.tsx Co-authored-by: ItsANameToo <35610748+ItsANameToo@users.noreply.github.com> --- .../Components/FeaturedCollections/FeaturedCollectionsItem.tsx | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/resources/js/Pages/Collections/Components/FeaturedCollections/FeaturedCollectionsItem.tsx b/resources/js/Pages/Collections/Components/FeaturedCollections/FeaturedCollectionsItem.tsx index 50144d466..b59d87a90 100644 --- a/resources/js/Pages/Collections/Components/FeaturedCollections/FeaturedCollectionsItem.tsx +++ b/resources/js/Pages/Collections/Components/FeaturedCollections/FeaturedCollectionsItem.tsx @@ -13,7 +13,7 @@ const truncateDescription = ( description: App.Data.Collections.CollectionFeaturedData["description"], ): string | null => { if (description !== null && description.length > 120) { - return description.slice(0, 120) + "..."; + return description.slice(0, 117) + "..."; } return description; From fcc63e8efce18d72dfcb10528cf6bba535d473a8 Mon Sep 17 00:00:00 2001 From: Juan Patricio Marroquin Date: Fri, 24 Nov 2023 06:29:21 -0500 Subject: [PATCH 51/61] fix: add margin between hero and table --- resources/js/Pages/Collections/Index.tsx | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/resources/js/Pages/Collections/Index.tsx b/resources/js/Pages/Collections/Index.tsx index 2ec8a3d2a..cb2027cc4 100644 --- a/resources/js/Pages/Collections/Index.tsx +++ b/resources/js/Pages/Collections/Index.tsx @@ -31,7 +31,7 @@ const CollectionsIndex = ({ -
+
{t("pages.collections.popular_collections")}
From fccf8eb8b962e7e9b1dd6fa4bed92c553dae2ba7 Mon Sep 17 00:00:00 2001 From: Juan Patricio Marroquin Date: Fri, 24 Nov 2023 06:32:39 -0500 Subject: [PATCH 52/61] fix: update number of seconds for cache --- app/Http/Controllers/CollectionController.php | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/app/Http/Controllers/CollectionController.php b/app/Http/Controllers/CollectionController.php index 45034c029..08a38d25e 100644 --- a/app/Http/Controllers/CollectionController.php +++ b/app/Http/Controllers/CollectionController.php @@ -46,7 +46,7 @@ public function index(Request $request): Response|JsonResponse|RedirectResponse ->get(); $featuredCollections->each(function (Collection $collection) { - $collection->cachedNfts = Cache::remember('featuredNftsForCollection'.$collection->id, 60 * 12, function () use ($collection) { + $collection->cachedNfts = Cache::remember('featuredNftsForCollection'.$collection->id, 3600 * 12, function () use ($collection) { return $collection->nfts()->inRandomOrder()->take(3)->get(); }); }); From d986fda4285cb17d1dc38bfa431402c3b2197fae Mon Sep 17 00:00:00 2001 From: Juan Patricio Marroquin Date: Fri, 24 Nov 2023 06:40:52 -0500 Subject: [PATCH 53/61] feat: FeaturedCollectionStats --- .../FeaturedCollectionStats.tsx | 62 +++++++++++++++++++ .../FeaturedCollectionsItem.tsx | 50 +++------------ .../Components/FeaturedCollections/index.tsx | 1 + 3 files changed, 71 insertions(+), 42 deletions(-) create mode 100644 resources/js/Pages/Collections/Components/FeaturedCollections/FeaturedCollectionStats.tsx diff --git a/resources/js/Pages/Collections/Components/FeaturedCollections/FeaturedCollectionStats.tsx b/resources/js/Pages/Collections/Components/FeaturedCollections/FeaturedCollectionStats.tsx new file mode 100644 index 000000000..7b37df584 --- /dev/null +++ b/resources/js/Pages/Collections/Components/FeaturedCollections/FeaturedCollectionStats.tsx @@ -0,0 +1,62 @@ +import React from "react"; +import { useTranslation } from "react-i18next"; +import { GridHeader } from "@/Components/GridHeader"; +import { FormatCrypto } from "@/Utils/Currency"; + +export const FeaturedCollectionStats = ({ + floorPrice, + floorPriceCurrency, + floorPriceDecimals, + nftsCount, + volume, +}: { + floorPrice: string | null; + floorPriceCurrency: string | null; + floorPriceDecimals: number | null; + nftsCount: number; + volume: string | null; +}): JSX.Element => { + const { t } = useTranslation(); + + const token: Pick = { + name: "", + symbol: floorPriceCurrency ?? "", + decimals: floorPriceDecimals ?? 18, + }; + + return ( +
+ +
+ + } + /> +
+ + } + /> +
+ ); +}; diff --git a/resources/js/Pages/Collections/Components/FeaturedCollections/FeaturedCollectionsItem.tsx b/resources/js/Pages/Collections/Components/FeaturedCollections/FeaturedCollectionsItem.tsx index b59d87a90..32237228b 100644 --- a/resources/js/Pages/Collections/Components/FeaturedCollections/FeaturedCollectionsItem.tsx +++ b/resources/js/Pages/Collections/Components/FeaturedCollections/FeaturedCollectionsItem.tsx @@ -1,13 +1,12 @@ import cn from "classnames"; import React from "react"; import { useTranslation } from "react-i18next"; +import { FeaturedCollectionStats } from "./FeaturedCollectionStats"; import { ButtonLink } from "@/Components/Buttons/ButtonLink"; -import { GridHeader } from "@/Components/GridHeader"; import { Heading } from "@/Components/Heading"; import { Img } from "@/Components/Image"; import { NetworkIcon } from "@/Components/Networks/NetworkIcon"; import { CollectionNft } from "@/Pages/Collections/Components/CollectionNft"; -import { FormatCrypto } from "@/Utils/Currency"; const truncateDescription = ( description: App.Data.Collections.CollectionFeaturedData["description"], @@ -24,12 +23,6 @@ const FeaturedCollectionInfo = ({ data }: { data: App.Data.Collections.Collectio const defaultNftCardStyles = "bg-white dark:bg-theme-dark-900 grid w-full h-full min-w-full lg:min-w-fit lg:w-52 lg:h-fit"; - - const token: Pick = { - name: "", - symbol: data.floorPriceCurrency ?? "", - decimals: data.floorPriceDecimals ?? 18, - }; return (
@@ -66,40 +59,13 @@ const FeaturedCollectionInfo = ({ data }: { data: App.Data.Collections.Collectio
-
- -
- - } - /> -
- - } - /> -
- + Date: Fri, 24 Nov 2023 06:44:20 -0500 Subject: [PATCH 54/61] feat: FeaturedCollectionNfts --- .../FeaturedCollectionNfts.tsx | 29 +++++++++++++++++++ .../FeaturedCollectionsItem.tsx | 24 ++------------- .../Components/FeaturedCollections/index.tsx | 1 + 3 files changed, 32 insertions(+), 22 deletions(-) create mode 100644 resources/js/Pages/Collections/Components/FeaturedCollections/FeaturedCollectionNfts.tsx diff --git a/resources/js/Pages/Collections/Components/FeaturedCollections/FeaturedCollectionNfts.tsx b/resources/js/Pages/Collections/Components/FeaturedCollections/FeaturedCollectionNfts.tsx new file mode 100644 index 000000000..5445e3fb9 --- /dev/null +++ b/resources/js/Pages/Collections/Components/FeaturedCollections/FeaturedCollectionNfts.tsx @@ -0,0 +1,29 @@ +import cn from "classnames"; +import React from "react"; +import { CollectionNft } from "@/Pages/Collections/Components/CollectionNft"; + +export const FeaturedCollectionNfts = ({ nfts }: { nfts: App.Data.Gallery.GalleryNftData[] }): JSX.Element => { + const defaultNftCardStyles = + "bg-white dark:bg-theme-dark-900 grid w-full h-full min-w-full lg:min-w-fit lg:w-52 lg:h-fit"; + + return ( +
+ + {nfts.length > 1 && ( + + )} + {nfts.length > 2 && ( +
+ ); +}; diff --git a/resources/js/Pages/Collections/Components/FeaturedCollections/FeaturedCollectionsItem.tsx b/resources/js/Pages/Collections/Components/FeaturedCollections/FeaturedCollectionsItem.tsx index 32237228b..4f779aa7c 100644 --- a/resources/js/Pages/Collections/Components/FeaturedCollections/FeaturedCollectionsItem.tsx +++ b/resources/js/Pages/Collections/Components/FeaturedCollections/FeaturedCollectionsItem.tsx @@ -1,12 +1,11 @@ -import cn from "classnames"; import React from "react"; import { useTranslation } from "react-i18next"; +import { FeaturedCollectionNfts } from "./FeaturedCollectionNfts"; import { FeaturedCollectionStats } from "./FeaturedCollectionStats"; import { ButtonLink } from "@/Components/Buttons/ButtonLink"; import { Heading } from "@/Components/Heading"; import { Img } from "@/Components/Image"; import { NetworkIcon } from "@/Components/Networks/NetworkIcon"; -import { CollectionNft } from "@/Pages/Collections/Components/CollectionNft"; const truncateDescription = ( description: App.Data.Collections.CollectionFeaturedData["description"], @@ -21,8 +20,6 @@ const truncateDescription = ( const FeaturedCollectionInfo = ({ data }: { data: App.Data.Collections.CollectionFeaturedData }): JSX.Element => { const { t } = useTranslation(); - const defaultNftCardStyles = - "bg-white dark:bg-theme-dark-900 grid w-full h-full min-w-full lg:min-w-fit lg:w-52 lg:h-fit"; return (
@@ -78,24 +75,7 @@ const FeaturedCollectionInfo = ({ data }: { data: App.Data.Collections.Collectio
-
- - {data.nfts.length > 1 && ( - - )} - {data.nfts.length > 2 && ( -
+
); diff --git a/resources/js/Pages/Collections/Components/FeaturedCollections/index.tsx b/resources/js/Pages/Collections/Components/FeaturedCollections/index.tsx index 2af89315d..17af26011 100644 --- a/resources/js/Pages/Collections/Components/FeaturedCollections/index.tsx +++ b/resources/js/Pages/Collections/Components/FeaturedCollections/index.tsx @@ -1,3 +1,4 @@ export * from "./FeaturedCollectionsCarousel"; export * from "./FeaturedCollectionsItem"; +export * from "./FeaturedCollectionNfts"; export * from "./FeaturedCollectionStats"; From 60b73b18d75f5f0e7d100d12da6d12130066087e Mon Sep 17 00:00:00 2001 From: patricio0312rev Date: Fri, 24 Nov 2023 11:47:14 +0000 Subject: [PATCH 55/61] style: resolve style guide violations --- resources/js/Pages/Collections/Index.tsx | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/resources/js/Pages/Collections/Index.tsx b/resources/js/Pages/Collections/Index.tsx index 51644ac93..30239ec70 100644 --- a/resources/js/Pages/Collections/Index.tsx +++ b/resources/js/Pages/Collections/Index.tsx @@ -54,7 +54,7 @@ const CollectionsIndex = ({ return ( - {t("pages.collections.popular_collections")} + {t("pages.collections.popular_collections")}
From 7bde290e4f8dd714f93fb20e5255ae4f5f081a5b Mon Sep 17 00:00:00 2001 From: Juan Patricio Marroquin Date: Fri, 24 Nov 2023 06:49:02 -0500 Subject: [PATCH 56/61] fix: featured collections page --- resources/js/I18n/Locales/en.json | 2 +- resources/js/Pages/Collections/Index.tsx | 3 +-- 2 files changed, 2 insertions(+), 3 deletions(-) diff --git a/resources/js/I18n/Locales/en.json b/resources/js/I18n/Locales/en.json index f157af260..fc9ecd829 100644 --- a/resources/js/I18n/Locales/en.json +++ b/resources/js/I18n/Locales/en.json @@ -1 +1 @@ -{"auth.welcome":"Welcome to Dashbrd","auth.logged_in":"You're logged in!","auth.log_out":"Log out","auth.failed":"These credentials do not match our records.","auth.session_timeout":"Your session has timed out. Please refresh the page and try connecting your account again.","auth.session_timeout_modal":"Seems like your session has timed out. Please connnect your wallet again.","auth.password":"The provided password is incorrect.","auth.throttle":"Too many login attempts. Please try again in {{seconds}} seconds.","auth.wallet.connecting":"Connecting …","auth.wallet.waiting_for_signature":"Waiting for Signature …","auth.wallet.switching_wallet":"Switching Wallet …","auth.wallet.connect":"Connect Wallet","auth.wallet.connect_long":"Connect Your Wallet to Get Started","auth.wallet.sign_subtitle":"Connect Your Wallet to Continue","auth.wallet.disconnect":"Disconnect Wallet","auth.wallet.install":"Install MetaMask","auth.wallet.install_long":"Install MetaMask to Get Started","auth.wallet.sign":"Sign Message","auth.wallet.sign_message":"Welcome to Dashbrd. In order to login, sign this message with your wallet. It doesn't cost you anything!\n\nSigning ID (you can ignore this): {{nonce}}","auth.wallet.connect_subtitle":"Click on the MetaMask icon in your browser to confirm the action and connect your wallet.","auth.wallet.requires_signature":"In order to prevent impersonation, we require a signature to perform this action. This signature is only a signed message and does not give any access to your wallet.","auth.errors.metamask.no_account":"No account found. Please connect your wallet and try again.","auth.errors.metamask.generic":"Connection attempt error. Please retry and follow the steps to connect your wallet.","auth.errors.metamask.invalid_network":"Please switch to Polygon or Ethereum Mainnet in your MetaMask plugin to connect to Dashbrd.","auth.errors.metamask.provider_missing":"You don't have MetaMask installed in your browser. Please install and try again.","auth.errors.metamask.user_rejected":"It looks like you cancelled signing of the authentication message. Please try again.","auth.errors.metamask.provider_not_set":"Ethereum provider is not set","auth.validation.wallet_login_failed":"There was a problem trying to verify your signature. Please try again.","auth.validation.invalid_address":"Your wallet address is invalid. Please try again.","auth.validation.invalid_signature":"Signature is invalid. Please try again.","auth.validation.invalid_network":"Please switch to Polygon or Ethereum Mainnet in your MetaMask plugin to connect to Dashbrd.","common.author":"Author","common.add":"Add","common.amount":"Amount","common.balance":"Balance","common.cancel":"Cancel","common.delete":"Delete","common.edit":"Edit","common.confirm":"Confirm","common.connect":"Connect","common.continue":"Continue","common.done":"Done","common.filter":"Filter","common.items":"Items","common.receive":"Receive","common.received":"Received","common.retry":"Retry","common.records":"Records","common.save":"Save","common.send":"Send","common.sent":"Sent","common.show":"Show","common.searching":"Searching...","common.other":"Other","common.owned":"Owned","common.token":"Token","common.tokens":"Tokens","common.wallet":"Wallet","common.pending":"Pending","common.publish":"Publish","common.published":"Published","common.empty":"Empty","common.your_address":"Your Address","common.warning":"Warning","common.my_address":"My Address","common.my_wallet":"My Wallet","common.my_collections":"My Collections","common.my_balance":"My Balance","common.na":"N/A","common.simple_plural_without_data":"One comment|Many comments","common.simple_plural_with_data":"{{count}} comment|{{count}} comments","common.advanced_plural_without_data":"{0} no comments yet|{1} 1 comment|[2,*] Many comments","common.advanced_plural_with_data":"{0} no comments yet|{1} 1 comment|[2,*] {{count}} comments","common.copy_clipboard":"Copy to Clipboard","common.copy":"Copy","common.download":"Download","common.zoom":"Zoom","common.my_collection":"My Collection","common.max":"Max","common.chain":"Chain","common.copied":"Copied!","common.coming_soon":"Coming Soon","common.more_details":"More Details","common.close":"Close","common.close_toast":"Close toast","common.loading":"Loading","common.price":"Price","common.articles":"Articles","common.most_popular":"Most Popular","common.market_cap":"Market Cap","common.volume":"Volume","common.volume_frequency":"Volume {{frequency}}","common.value":"Value","common.last_n_days":"Last {{count}} Days","common.details":"Details","common.view_all":"View All","common.view_more_on_polygonscan":"View More on Polygonscan","common.view_more_on_etherscan":"View More on Etherscan","common.view_nft_on_etherscan":"View NFT on Etherscan","common.view_nft_on_polygonscan":"View NFT on Polygonscan","common.view_nft_on_goerli_tesnet":"View NFT on Goerli Testnet Explorer","common.view_nft_on_mumbai_tesnet":"View NFT on Mumbai Testnet Explorer","common.polygonscan":"Polygonscan","common.etherscan":"Etherscan","common.featured":"Featured","common.floor_price":"Floor Price","common.floor":"Floor","common.supply":"Supply","common.owners":"Owners","common.created":"Created","common.nft":"NFT","common.collection":"Collection","common.collections":"Collections","common.gallery":"Gallery","common.basic_gallery":"Basic Gallery","common.gallery_name":"Gallery Name","common.create_gallery":"Create Gallery","common.external_link":"External Link","common.follow_link":"Follow Link","common.cover":"Cover","common.template":"Template","common.page":"Page","common.polygon":"Polygon","common.ethereum":"Ethereum","common.mumbai":"Mumbai","common.goerli":"Goerli","common.of":"of","common.pagination_input_placeholder":"Enter the page number","common.pagination_input_placeholder_mobile":"Page number","common.nft_count":"{0} {{count}} NFTs|{1} {{count}} NFT|[2,*] {{count}} NFTs","common.nft_gallery":"NFT Gallery","common.unable_to_retrieve_image":"Unable to retrieve your NFT image at this time","common.optional":"Optional","common.selected":"Selected","common.select":"Select","common.preview":"Preview","common.image_size_error":"Image size must not exceed 2MB","common.image_dimensions_error":"Image dimensions must exceed 287px x 190px","common.write_to_confirm":"Write {{word}} to confirm","common.n_hours":"{0} {{count}} hour|{1} {{count}} hour|[2,*] {{count}} hours","common.n_minutes":"{0} {{count}} minute|{1} {{count}} minute|[2,*] {{count}} minutes","common.report":"Report","common.nfts":"NFTs","common.n_nfts":"{0}NFTs|{1}NFT|[2,*]NFTs","common.n_collections":"{0}collections|{1}collection|[2,*]collections","common.back":"Back","common.back_to":"Back to","common.name":"Name","common.type":"Type","common.from":"From","common.to":"To","common.sale_price":"Sale Price","common.recent_activity":"Recent Activity","common.time":"Time","common.datetime.few_seconds_ago":"A few seconds ago","common.datetime.minutes_ago":"{0} Less than a minute ago|{1} A minute ago|[2,*] {{count}} minutes ago","common.datetime.hours_ago":"{0} Less than an hour ago|{1} An hour ago|[2,*] {{count}} hours ago","common.datetime.days_ago":"{0} Less than a day ago|{1} A day ago|[2,*] {{count}} days ago","common.datetime.weeks_ago":"{0} Less than a week ago|{1} A week ago|[2,*] {{count}} weeks ago","common.datetime.months_ago":"{0} Less than a month ago|{1} A month ago|[2,*] {{count}} months ago","common.datetime.years_ago":"{0} Less than a year ago|{1} A year ago|[2,*] {{count}} years ago","common.no_traits_found":"No traits found.","common.empty_transactions":"You don't have any transactions yet. Once transactions have been made, they will show up here.","common.error":"Error","common.refresh":"Refresh","common.refresh_metadata":"Refresh Metadata","common.refreshing_metadata":"Refreshing Metadata... Please check back later.","common.refreshing_activity":"Refreshing Activity... Please check back later.","common.pending_confirmation":"Pending Confirmation","common.confirmed_transaction":"Confirmed Transaction","common.transaction_error":"Transaction Error","common.transaction_error_description_first_part":"Your transaction encountered an error. View this transaction on","common.transaction_error_description_second_part":"for more details.","common.home":"Home","common.contact":"Contact","common.menu":"Menu","common.website":"Website","common.twitter":"Twitter","common.discord":"Discord","common.facebook":"Facebook","common.reddit":"Reddit","common.x":"X","common.sort":"Sort","common.drafts":"Drafts","common.draft":"Draft","common.delete_draft":"Delete Draft","common.share_on":"Share on {{platform}}","footer.copyright":"{{year}} © Dashbrd. All rights reserved.","footer.all_rights_reserved":"All rights reserved","footer.privacy_policy":"Privacy Policy","footer.terms_of_service":"Terms of Service","footer.powered_by":"Powered by","format.fiat":"{{ value, currency }}","format.number":"{{ value, number }}","metatags.home.title":"Dashbrd | Web3 Portfolio Management Made Simple","metatags.home.description":"Simplify your Web3 journey with Dashbrd. Manage your portfolio of tokens, NFTs, and other digital collectibles across the Ethereum and Polygon blockchains.","metatags.home.image":"/images/meta/home.png","metatags.error.title":"Error {{code}} | Dashbrd","metatags.wallet.title":"My Wallet | Dashbrd","metatags.galleries.title":"Top NFT Galleries | Dashbrd","metatags.galleries.image":"/images/meta/nft-galleries.png","metatags.galleries.description":"Explore user published NFT galleries to find custom curated PFPs, Digital Collectibles, & More.","metatags.galleries.most_popular.title":"Most Popular Galleries | Dashbrd","metatags.galleries.most_popular.image":"/images/meta/most-popular-nft-galleries.png","metatags.galleries.most_popular.description":"Explore and discover Most Popular NFT Galleries created by our users featuring custom curated PFPs, Digital Collectibles, & More.","metatags.galleries.newest.title":"Newest Galleries | Dashbrd","metatags.galleries.newest.image":"/images/meta/newest-nft-galleries.png","metatags.galleries.newest.description":"Explore and discover most recent NFT galleries created by our users featuring custom curated PFPs, Digital Collectibles, & More","metatags.galleries.most_valuable.title":"Most Valuable Galleries | Dashbrd","metatags.galleries.most_valuable.image":"/images/meta/most-valuable-nft-galleries.png","metatags.galleries.most_valuable.description":"Explore and discover Most Valuable NFT Galleries created by our users featuring custom curated PFPs, Digital Collectibles, & More.","metatags.galleries.view.title":"{{name}} | Dashbrd","metatags.galleries.view.description":"{{name}} | A Curated NFT Gallery at Dashbrd","metatags.galleries.view.image":"/images/meta/nft-gallery.png","metatags.my_galleries.title":"My Galleries | Dashbrd","metatags.my_galleries.title_draft":"My Draft Galleries | Dashbrd","metatags.my_galleries.create.title":"Create Gallery | Dashbrd","metatags.my_galleries.edit.title":"Edit {{name}} | Dashbrd","metatags.collections.title":"Collections | Dashbrd","metatags.collections.view.title":"{{name}} Collection | Dashbrd","metatags.collections.view.description":"Immerse yourself in the intricate details of {{name}} collection, featuring remarkable digital assets. Start your NFT journey today!","metatags.collections.view.image":"/images/meta/nft-collection.png","metatags.my-collections.title":"My Collections | Dashbrd","metatags.nfts.view.title":"{{nft}} NFT | Dashbrd","metatags.nfts.view.description":"Uncover the complete story of {{nft}} NFT from the {{collection}} collection, delving into its unique attributes and distinctive features.","metatags.nfts.view.image":"/images/meta/nft-details.png","metatags.settings.title":"Settings | Dashbrd","metatags.articles.title":"Articles | Dashbrd","metatags.articles.view.title":"{{title}} | Dashbrd","metatags.login.title":"Login | Dashbrd","metatags.privacy_policy.title":"Privacy Policy | Dashbrd","metatags.privacy_policy.description":"Dashbrd’s privacy policy outlines the information we collect and explains your choices surrounding how we use information about you.","metatags.terms_of_service.title":"Terms of Service | Dashbrd","metatags.terms_of_service.description":"These Terms of Service cover your use and access to services, products or websites of Dashbrd.","metatags.cookie_policy.title":"Cookie Policy | Dashbrd","metatags.cookie_policy.description":"Dashbrd uses cookies to make the website more user-friendly. Find out about the main types of cookies we use, and what we use them for.","metatags.welcome.title":"Welcome to Dashbrd | Web3 Simplified","pages.onboarding.title":"Get Started","pages.onboarding.heading":"Your monkeys were bored and ran off, we are trying to round them up.","pages.onboarding.message":"We are setting up your account. This process usually takes just a few minutes, but can take up to 15 minutes.","pages.error.heading":"Oops, something went wrong ...","pages.error.message":"Please try again or get in touch if the issue persists.","pages.maintenance.title":"Dashbrd is currently down for scheduled maintenance.","pages.maintenance.description":"We expect to be back soon. Thanks for your patience.","pages.dashboard.title":"My Wallet","pages.dashboard.breakdown.title":"Portfolio Breakdown","pages.dashboard.line_chart.data_error":"Could not load chart data","pages.articles.title":"Articles","pages.articles.featured_collections":"Featured Collections","pages.articles.placeholder_more_soon":"More Soon","pages.articles.no_articles":"No articles have been published yet. Please check back later!","pages.articles.header_title":"Explore our collection of","pages.articles.header_suffix_one":"published article","pages.articles.header_suffix_other":"published articles","pages.articles.audio_version":"Audio version","pages.articles.consists_of_collections":"{0} This article highlights {{count}} collections|{1} This article highlights {{count}} collection|[2,*] This article highlights {{count}} collections","pages.collections.title":"Collections","pages.collections.collections":"Collections","pages.collections.popular_collections":"Popular Collections","pages.collections.collection_value":"Collection Value","pages.collections.nfts_owned":"NFTs Owned","pages.collections.header_title":"You own <0>{{nftsCount}} {{nfts}} across <0>{{collectionsCount}} {{collections}}, worth about <0><1>{{worth}}","pages.collections.search_placeholder":"Search by Collection","pages.collections.properties":"Properties","pages.collections.collections_network":"Collections Network","pages.collections.property_search_placeholder":"Feature Search","pages.collections.floor_price":"Floor Price","pages.collections.value":"Value","pages.collections.rarity":"Rarity","pages.collections.report":"Report","pages.collections.hide_collection":"Hide Collection","pages.collections.unhide_collection":"Unhide Collection","pages.collections.no_collections":"You do not own any NFTs yet. Once you do they will be shown here.","pages.collections.all_collections_hidden":"You have hidden all your collections. Unhide and they will appear here.","pages.collections.about_collection":"About Collection","pages.collections.show_hidden":"Show Hidden","pages.collections.show_my_collection":"Show My Collection","pages.collections.owned":"Owned","pages.collections.activities.loading_activities":"We're fetching Activity for this NFT, please hang tight, this can take a while.","pages.collections.activities.loading_activities_collection":"We're fetching Activity for this collection, please hang tight, this can take a while.","pages.collections.activities.ignores_activities":"We don't support activity history for this collection yet.","pages.collections.activities.no_activity":"This collection does not have any activity yet.","pages.collections.activities.types.LABEL_MINT":"Mint","pages.collections.activities.types.LABEL_TRANSFER":"Transfer","pages.collections.activities.types.LABEL_SALE":"Sale","pages.collections.articles.no_articles":"No articles have been linked to this collection as of now.","pages.collections.articles.no_articles_with_filters":"We could not find any articles matching your search criteria, please try again!","pages.collections.articles.search_placeholder":"Search in Articles","pages.collections.articles.sort_latest":"Latest","pages.collections.articles.sort_popularity":"Most Popular","pages.collections.search.loading_results":"Loading results...","pages.collections.search.no_results":"We could not find anything matching your search criteria, please try again!","pages.collections.search.no_results_with_filters":"We could not find anything matching your filters, please try again!","pages.collections.search.no_results_ownership":"You do not own any NFTs in this collection","pages.collections.search.error":"Could not load search results. Please try again later.","pages.collections.sorting.token_number":"Token Number","pages.collections.sorting.recently_received":"Recently Received","pages.collections.sorting.recently_created":"Recently Created","pages.collections.sorting.oldest_collection":"Oldest Collection","pages.collections.traits.description":"List of NFT traits by % of occurrence in the collection","pages.collections.traits.no_traits":"No Properties can be found for this NFT","pages.collections.menu.collection":"Collection","pages.collections.menu.articles":"Articles","pages.collections.menu.activity":"Activity","pages.collections.hidden_modal.collection_hidden":"Collection Hidden","pages.collections.hidden_modal.description":"This collection is currently set to Hidden. Are you sure you want to unhide this collection? You can\n reset the collection to hidden from the collection menu.","pages.collections.hidden_modal.unhide":"Unhide","pages.collections.hidden_modal.error":"Something went wrong. Please try again.","pages.collections.external_modal.you_wish_continue":"You are about to leave Dashbrd to an external website. Dashbrd has no control over the content of\n this site. Are you sure you wish to continue?","pages.collections.external_modal.not_show":"Do not show this message again.","pages.collections.refresh.title":"Refresh your collection","pages.collections.refresh.notice":"You can refresh data every 15 minutes.","pages.collections.refresh.notice_wait":"Please wait. You can refresh data every 15 minutes.","pages.collections.refresh.toast":"We're updating information for your collection.","pages.collections.featured.title":"Featured Collections","pages.collections.featured.button":"Explore Collection","pages.nfts.nft":"nft","pages.nfts.about_nft":"About NFT","pages.nfts.owned_by":"Owned by","pages.nfts.collection_image":"collection image","pages.nfts.menu.properties":"Properties","pages.nfts.menu.activity":"Activity","pages.reports.title":"Submit a Report","pages.reports.description":"Thanks for looking out by reporting things that break the rules. Let us know what's happening and we'll receive the report.","pages.reports.success":"Thank you for your report. We'll review it and see if it breaks our ToS.","pages.reports.failed":"Something went wrong. Please try again.","pages.reports.throttle":"You have made too many requests. Please wait {{time}} before reporting again.","pages.reports.reported":"You have already reported this {{model}}.","pages.reports.reasons.spam":"Spam","pages.reports.reasons.violence":"Promoting Violence","pages.reports.reasons.hate":"Hate","pages.reports.reasons.inappropriate_content":"Inappropriate Content","pages.reports.reasons.impersonation":"Impersonation","pages.reports.reasons.trademark":"Trademark or Copyright","pages.reports.reasons.selfharm":"Self-Harm","pages.reports.reasons.harassment":"Harassment","pages.galleries.title":"Galleries","pages.galleries.empty_title":"No galleries have been published yet. Once they do they will appear here.","pages.galleries.search.loading_results":"Loading results...","pages.galleries.search.no_results":"We could not find anything matching your search criteria, please try again!","pages.galleries.search.placeholder":"Search by name or curator address","pages.galleries.search.placeholder_nfts":"Search by NFTs","pages.galleries.search.error":"Could not load search results. Please try again later.","pages.galleries.my_galleries.title":"My Galleries","pages.galleries.my_galleries.subtitle":"Manage your galleries","pages.galleries.my_galleries.new_gallery":"New Gallery","pages.galleries.my_galleries.no_galleries":"You have not created any galleries yet. To create a gallery, click on the \"Create Gallery\" button.","pages.galleries.my_galleries.no_draft_galleries":"You have no draft galleries yet. To create a gallery, click on the \"Create Gallery\" button.","pages.galleries.my_galleries.succesfully_deleted":"Gallery has been successfully removed","pages.galleries.my_galleries.draft_succesfully_deleted":"Draft has been successfully removed","pages.galleries.my_galleries.successfully_created":"Gallery has been successfully created","pages.galleries.my_galleries.successfully_updated":"Gallery has been successfully updated","pages.galleries.my_galleries.new_gallery_no_nfts":"Creating a Gallery requires you to own an NFT.","pages.galleries.my_galleries.delete_modal.title":"Delete Draft","pages.galleries.my_galleries.delete_modal.text":"Are you sure you want to delete the draft? Everything you've done will be deleted and you won't be able to get it back.","pages.galleries.my_galleries.nfts_no_longer_owned":"NFTs no longer owned by this wallet have been removed from the draft”","pages.galleries.copy_gallery_link":"Copy Gallery Link","pages.galleries.my_nfts":"My NFTs","pages.galleries.value":"Value","pages.galleries.floor_price":"Floor Price","pages.galleries.nfts":"NFTs","pages.galleries.collections":"Collections","pages.galleries.galleries_count_simple":"{0} galleries|{1} gallery|[2,*] galleries","pages.galleries.galleries_count":"{0} {{count}} Galleries|{1} {{count}} Gallery|[2,*] {{count}} Galleries","pages.galleries.collections_count_simple":"{0} collections|{1} collection|[2,*] collections","pages.galleries.collections_count":"{0} {{count}} Collections|{1} {{count}} Collection|[2,*] {{count}} Collections","pages.galleries.nfts_count_simple":"{0} NFTs|{1} NFT|[2,*] NFTs","pages.galleries.nfts_count":"{0} {{count}} NFTs|{1} {{count}} NFT|[2,*] {{count}} NFTs","pages.galleries.users_count_simple":"{0} users|{1} user|[2,*] users","pages.galleries.users_count":"{0} {{count}} Users|{1} {{count}} User|[2,*] {{count}} Users","pages.galleries.featuring":"Featuring","pages.galleries.curated_by":"Curated by","pages.galleries.worth_about":"Worth About","pages.galleries.valued_at":"valued at","pages.galleries.from":"From","pages.galleries.most_popular_galleries":"Most Popular Galleries","pages.galleries.newest_galleries":"Newest Galleries","pages.galleries.most_valuable_galleries":"Most Valuable Galleries","pages.galleries.most_popular":"Most Popular","pages.galleries.newest":"Newest","pages.galleries.most_valuable":"Most Valuable","pages.galleries.create.search_by_nfts":"Search by NFTs","pages.galleries.create.input_placeholder":"Enter gallery name","pages.galleries.create.title_too_long":"Gallery name must not exceed {{max}} characters.","pages.galleries.create.already_selected_nft":"NFT already exists in this gallery","pages.galleries.create.nft_missing_image":"Only NFTs with images can be added to galleries","pages.galleries.create.nft_gallery_limit":"You can only add 16 NFTs per gallery","pages.galleries.create.gallery_cover":"Gallery Cover","pages.galleries.create.gallery_cover_description":"The cover is used for the card on the gallery list page. While the cover is not a requirement it will allow you to add personality and stand out from the crowd.","pages.galleries.create.gallery_cover_information":"Image dimensions must be at least 287px x 190px, with a max size of 2 MB (JPG, PNG or GIF)","pages.galleries.create.no_results":"We could not find anything matching your search criteria, please try again!","pages.galleries.create.templates.cover":"Cover","pages.galleries.create.templates.template":"Template","pages.galleries.create.templates.select":"Select Gallery Template","pages.galleries.create.templates.basic":"Basic Gallery","pages.galleries.create.templates.coming_soon":"More Coming Soon","pages.galleries.create.load_more_collections_one":"Load {{count}} More Collection","pages.galleries.create.load_more_collections_other":"Load {{count}} More Collections","pages.galleries.create.load_more_nfts":"Load More NFTs","pages.galleries.create.can_purchase":"You can purchase NFTs with these top NFT Marketplaces:","pages.galleries.create.must_own_one_nft":"You must own at least one (1) NFT in order to create a gallery.","pages.galleries.create.back_to_galleries":"Back to Galleries","pages.galleries.create.draft_saved":"Draft Saved","pages.galleries.create.saving_to_draft":"Saving to draft","pages.galleries.create.drafts_limit_modal_title":"Draft Gallery Limit","pages.galleries.create.drafts_limit_modal_message":"You’ve hit your limit for draft galleries. While you can still make new galleries and publish them, they won’t be saved as drafts. To Free up space, you can either delete existing drafts or publish them.","pages.galleries.create.drafts_limit_modal_cancel":"Go to Drafts","pages.galleries.delete_modal.title":"Delete Gallery","pages.galleries.delete_modal.confirmation_text":"Are you sure you want to delete the gallery? Deleting a Gallery is permanent, all associated views and likes will be lost.","pages.galleries.consists_of_collections":"{0} This gallery consists of {{count}} collections|{1} This gallery consists of {{count}} collection|[2,*] This gallery consists of {{count}} collections","pages.galleries.guest_banner.title":"Craft the ultimate","pages.galleries.guest_banner.subtitle":"Pick your favorites, curate your gallery, & share it with the world.","pages.profile.title":"Profile","pages.token_panel.balance_tooltip":"Total percentage of the portfolio held in this token","pages.token_panel.insufficient_funds":"Insufficient Balance","pages.token_panel.error":"Dashbrd has failed to load token information. Please try again later.","pages.token_panel.failed_to_retrieve_transactions":"We were unable to fetch your transactions.","pages.token_panel.tabs.transaction_history":"Transaction History","pages.token_panel.tabs.history":"History","pages.token_panel.tabs.market_data":"Market Data","pages.token_panel.details.current_price":"Current Price","pages.token_panel.details.title":"Token Details","pages.token_panel.details.market_cap":"Market Cap","pages.token_panel.details.volume":"Daily Volume","pages.token_panel.details.supply":"Minted Supply","pages.token_panel.details.ath":"All-Time High","pages.token_panel.details.atl":"All-Time Low","pages.token_panel.chart.failed":"Dashbrd has failed to load chart information. Please try again later.","pages.transaction_details_panel.title":"Transaction Details","pages.transaction_details_panel.details.blockchain":"Blockchain","pages.transaction_details_panel.details.timestamp":"Timestamp","pages.transaction_details_panel.details.transaction_hash":"Transaction Hash","pages.transaction_details_panel.details.transaction_fee":"Transaction Fee","pages.transaction_details_panel.details.gas_price":"Gas Price","pages.transaction_details_panel.details.gas_used":"Gas Used","pages.transaction_details_panel.details.nonce":"Nonce","pages.send_receive_panel.send.labels.token_and_amount":"Token and Amount","pages.send_receive_panel.send.labels.destination_address":"Destination Address","pages.send_receive_panel.send.labels.projected_fee":"Projected Fee","pages.send_receive_panel.send.placeholders.enter_amount":"Enter Amount","pages.send_receive_panel.send.placeholders.insert_recipient_address":"Insert Recipient Address","pages.send_receive_panel.send.placeholders.projected_fee":"Projected Fee","pages.send_receive_panel.send.errors.amount":"Insufficient Funds: You do not have enough to cover the amount + fee.","pages.send_receive_panel.send.errors.destination":"Destination address is not correct. Check and input again.","pages.send_receive_panel.send.hints.token_price":"Token Price","pages.send_receive_panel.send.fees.Fast":"Fast","pages.send_receive_panel.send.fees.Avg":"Avg","pages.send_receive_panel.send.fees.Slow":"Slow","pages.send_receive_panel.send.search_dropdown.placeholder":"Search token","pages.send_receive_panel.send.search_dropdown.no_results":"No Results","pages.send_receive_panel.send.search_dropdown.error":"Error occurred while searching tokens.","pages.send_receive_panel.send.transaction_time":"Transaction Time: ~{{ time }} minutes","pages.send_receive_panel.send.from":"From","pages.send_receive_panel.send.to":"To","pages.send_receive_panel.send.amount":"Amount","pages.send_receive_panel.send.fee":"Fee","pages.send_receive_panel.send.total_amount":"Total Amount","pages.send_receive_panel.send.waiting_message":"Review and verify the information on your MetaMask. Sign to send the transaction.","pages.send_receive_panel.send.waiting_spinner_text":"Waiting for confirmation...","pages.send_receive_panel.send.failed_message":"It looks like something went wrong while sending your transaction. Press 'Retry' to make another attempt.","pages.send_receive_panel.receive.alert":"Send only Polygon or Ethereum Network compatible tokens to this address or you could permanently lose your funds!","pages.settings.title":"Settings","pages.settings.sidebar.general":"General","pages.settings.sidebar.notifications":"Notifications","pages.settings.sidebar.session_history":"Sessions History","pages.settings.general.title":"Settings","pages.settings.general.subtitle":"Customize your App Experience","pages.settings.general.currency":"Currency","pages.settings.general.currency_subtitle":"Select your default currency which will be used throughout the app.","pages.settings.general.time_date":"Time & Date","pages.settings.general.time_date_subtitle":"Select how you want time and date be shown inside app.","pages.settings.general.date_format":"Date Format","pages.settings.general.time_format":"Time Format","pages.settings.general.timezone":"Timezone","pages.settings.general.set_defaults":"Set Defaults","pages.settings.general.set_defaults_content":"Reverting to the default settings will remove any customizations previously made. Are you sure?","pages.settings.general.save":"Save Settings","pages.settings.general.saved":"Your settings have been successfully saved","pages.wallet.title":"Wallet","pages.privacy_policy.title":"Privacy Policy","pages.terms_of_service.title":"Terms of Service","pagination.previous":"« Previous","pagination.next":"Next »","passwords.reset":"Your password has been reset!","passwords.sent":"We have emailed your password reset link!","passwords.throttled":"Please wait before retrying.","passwords.token":"This password reset token is invalid.","passwords.user":"We can't find a user with that email address.","urls.landing":"https://dashbrd.com","urls.cookie_policy":"https://dashbrd.com/cookie-policy","urls.privacy_policy":"https://dashbrd.com/privacy-policy","urls.terms_of_service":"https://dashbrd.com/terms-of-service","urls.twitter":"https://x.com/DashbrdApp","urls.discord":"https://discord.gg/MJyWKkCJ5k","urls.github":"https://github.com/ArdentHQ/dashbrd","urls.coingecko":"https://www.coingecko.com","urls.etherscan":"https://etherscan.io","urls.polygonscan":"https://polygonscan.com","urls.alchemy":"https://www.alchemy.com","urls.moralis":"https://moralis.io","urls.mnemonic":"https://www.mnemonichq.com","urls.opensea":"https://opensea.io/","urls.explorers.etherscan.token_transactions":"https://etherscan.io/token/{{token}}?a={{address}}","urls.explorers.etherscan.addresses":"https://etherscan.io/address/{{address}}","urls.explorers.etherscan.transactions":"https://etherscan.io/tx/{{id}}","urls.explorers.etherscan.nft":"https://etherscan.io/nft/{{address}}/{{nftId}}","urls.explorers.polygonscan.token_transactions":"https://polygonscan.com/token/{{token}}?a={{address}}","urls.explorers.polygonscan.addresses":"https://polygonscan.com/address/{{address}}","urls.explorers.polygonscan.transactions":"https://polygonscan.com/tx/{{id}}","urls.explorers.polygonscan.nft":"https://polygonscan.com/nft/{{address}}/{{nftId}}","urls.explorers.mumbai.token_transactions":"https://mumbai.polygonscan.com/token/{{token}}?a={{address}}","urls.explorers.mumbai.addresses":"https://mumbai.polygonscan.com/address/{{address}}","urls.explorers.mumbai.transactions":"https://mumbai.polygonscan.com/tx/{{id}}","urls.explorers.mumbai.nft":"https://mumbai.polygonscan.com/nft/{{address}}/{{nftId}}","urls.explorers.goerli.token_transactions":"https://goerli.etherscan.io/token/{{token}}?a={{address}}","urls.explorers.goerli.addresses":"https://goerli.etherscan.io/address/{{address}}","urls.explorers.goerli.transactions":"https://goerli.etherscan.io/tx/{{id}}","urls.explorers.goerli.nft":"https://goerli.etherscan.io/nft/{{address}}/{{nftId}}","urls.marketplaces.opensea.collection":"https://opensea.io/assets/{{network}}/{{address}}","urls.marketplaces.opensea.nft":"https://opensea.io/assets/{{network}}/{{address}}/{{nftId}}","urls.marketplaces.rarible.collection":"https://rarible.com/collection/{{address}}/items","urls.marketplaces.rarible.nft":"https://rarible.com/token/{{address}}:{{nftId}}","urls.marketplaces.blur.collection":"https://blur.io/collection/{{address}}","urls.marketplaces.blur.nft":"https://blur.io/asset/{{address}}/{{nftId}}","urls.marketplaces.looksrare.collection":"https://looksrare.org/collections/{{address}}","urls.marketplaces.looksrare.nft":"https://looksrare.org/collections/{{address}}/{{nftId}}","validation.accepted":"The {{attribute}} must be accepted.","validation.accepted_if":"The {{attribute}} must be accepted when {{other}} is {{value}}.","validation.active_url":"The {{attribute}} is not a valid URL.","validation.after":"The {{attribute}} must be a date after {{date}}.","validation.after_or_equal":"The {{attribute}} must be a date after or equal to {{date}}.","validation.alpha":"The {{attribute}} must only contain letters.","validation.alpha_dash":"The {{attribute}} must only contain letters, numbers, dashes and underscores.","validation.alpha_num":"The {{attribute}} must only contain letters and numbers.","validation.array":"The {{attribute}} must be an array.","validation.ascii":"The {{attribute}} must only contain single-byte alphanumeric characters and symbols.","validation.before":"The {{attribute}} must be a date before {{date}}.","validation.before_or_equal":"The {{attribute}} must be a date before or equal to {{date}}.","validation.between.array":"The {{attribute}} must have between {{min}} and {{max}} items.","validation.between.file":"The {{attribute}} must be between {{min}} and {{max}} kilobytes.","validation.between.numeric":"The {{attribute}} must be between {{min}} and {{max}}.","validation.between.string":"The {{attribute}} must be between {{min}} and {{max}} characters.","validation.boolean":"The {{attribute}} field must be true or false.","validation.confirmed":"The {{attribute}} confirmation does not match.","validation.current_password":"The password is incorrect.","validation.date":"The {{attribute}} is not a valid date.","validation.date_equals":"The {{attribute}} must be a date equal to {{date}}.","validation.date_format":"The {{attribute}} does not match the format {{format}}.","validation.decimal":"The {{attribute}} must have {{decimal}} decimal places.","validation.declined":"The {{attribute}} must be declined.","validation.declined_if":"The {{attribute}} must be declined when {{other}} is {{value}}.","validation.different":"The {{attribute}} and {{other}} must be different.","validation.digits":"The {{attribute}} must be {{digits}} digits.","validation.digits_between":"The {{attribute}} must be between {{min}} and {{max}} digits.","validation.dimensions":"The {{attribute}} has invalid image dimensions.","validation.distinct":"The {{attribute}} field has a duplicate value.","validation.doesnt_end_with":"The {{attribute}} may not end with one of the following: {{values}}.","validation.doesnt_start_with":"The {{attribute}} may not start with one of the following: {{values}}.","validation.email":"The {{attribute}} must be a valid email address.","validation.ends_with":"The {{attribute}} must end with one of the following: {{values}}.","validation.enum":"The selected {{attribute}} is invalid.","validation.exists":"The selected {{attribute}} is invalid.","validation.file":"The {{attribute}} must be a file.","validation.filled":"The {{attribute}} field must have a value.","validation.gt.array":"The {{attribute}} must have more than {{value}} items.","validation.gt.file":"The {{attribute}} must be greater than {{value}} kilobytes.","validation.gt.numeric":"The {{attribute}} must be greater than {{value}}.","validation.gt.string":"The {{attribute}} must be greater than {{value}} characters.","validation.gte.array":"The {{attribute}} must have {{value}} items or more.","validation.gte.file":"The {{attribute}} must be greater than or equal to {{value}} kilobytes.","validation.gte.numeric":"The {{attribute}} must be greater than or equal to {{value}}.","validation.gte.string":"The {{attribute}} must be greater than or equal to {{value}} characters.","validation.image":"The {{attribute}} must be an image.","validation.in":"The selected {{attribute}} is invalid.","validation.in_array":"The {{attribute}} field does not exist in {{other}}.","validation.integer":"The {{attribute}} must be an integer.","validation.ip":"The {{attribute}} must be a valid IP address.","validation.ipv4":"The {{attribute}} must be a valid IPv4 address.","validation.ipv6":"The {{attribute}} must be a valid IPv6 address.","validation.json":"The {{attribute}} must be a valid JSON string.","validation.lowercase":"The {{attribute}} must be lowercase.","validation.lt.array":"The {{attribute}} must have less than {{value}} items.","validation.lt.file":"The {{attribute}} must be less than {{value}} kilobytes.","validation.lt.numeric":"The {{attribute}} must be less than {{value}}.","validation.lt.string":"The {{attribute}} must be less than {{value}} characters.","validation.lte.array":"The {{attribute}} must not have more than {{value}} items.","validation.lte.file":"The {{attribute}} must be less than or equal to {{value}} kilobytes.","validation.lte.numeric":"The {{attribute}} must be less than or equal to {{value}}.","validation.lte.string":"The {{attribute}} must be less than or equal to {{value}} characters.","validation.mac_address":"The {{attribute}} must be a valid MAC address.","validation.max.array":"The {{attribute}} must not have more than {{max}} items.","validation.max.file":"The {{attribute}} must not be greater than {{max}} kilobytes.","validation.max.numeric":"The {{attribute}} must not be greater than {{max}}.","validation.max.string":"The {{attribute}} must not be greater than {{max}} characters.","validation.max_digits":"The {{attribute}} must not have more than {{max}} digits.","validation.mimes":"The {{attribute}} must be a file of type: {{values}}.","validation.mimetypes":"The {{attribute}} must be a file of type: {{values}}.","validation.min.array":"The {{attribute}} must have at least {{min}} items.","validation.min.file":"The {{attribute}} must be at least {{min}} kilobytes.","validation.min.numeric":"The {{attribute}} must be at least {{min}}.","validation.min.string":"The {{attribute}} must be at least {{min}} characters.","validation.min_digits":"The {{attribute}} must have at least {{min}} digits.","validation.missing":"The {{attribute}} field must be missing.","validation.missing_if":"The {{attribute}} field must be missing when {{other}} is {{value}}.","validation.missing_unless":"The {{attribute}} field must be missing unless {{other}} is {{value}}.","validation.missing_with":"The {{attribute}} field must be missing when {{values}} is present.","validation.missing_with_all":"The {{attribute}} field must be missing when {{values}} are present.","validation.multiple_of":"The {{attribute}} must be a multiple of {{value}}.","validation.not_in":"The selected {{attribute}} is invalid.","validation.not_regex":"The {{attribute}} format is invalid.","validation.numeric":"The {{attribute}} must be a number.","validation.password.letters":"The {{attribute}} must contain at least one letter.","validation.password.mixed":"The {{attribute}} must contain at least one uppercase and one lowercase letter.","validation.password.numbers":"The {{attribute}} must contain at least one number.","validation.password.symbols":"The {{attribute}} must contain at least one symbol.","validation.password.uncompromised":"The given {{attribute}} has appeared in a data leak. Please choose a different {{attribute}}.","validation.present":"The {{attribute}} field must be present.","validation.prohibited":"The {{attribute}} field is prohibited.","validation.prohibited_if":"The {{attribute}} field is prohibited when {{other}} is {{value}}.","validation.prohibited_unless":"The {{attribute}} field is prohibited unless {{other}} is in {{values}}.","validation.prohibits":"The {{attribute}} field prohibits {{other}} from being present.","validation.regex":"The {{attribute}} format is invalid.","validation.required":"The {{attribute}} field is required.","validation.required_array_keys":"The {{attribute}} field must contain entries for: {{values}}.","validation.required_if":"The {{attribute}} field is required when {{other}} is {{value}}.","validation.required_if_accepted":"The {{attribute}} field is required when {{other}} is accepted.","validation.required_unless":"The {{attribute}} field is required unless {{other}} is in {{values}}.","validation.required_with":"The {{attribute}} field is required when {{values}} is present.","validation.required_with_all":"The {{attribute}} field is required when {{values}} are present.","validation.required_without":"The {{attribute}} field is required when {{values}} is not present.","validation.required_without_all":"The {{attribute}} field is required when none of {{values}} are present.","validation.same":"The {{attribute}} and {{other}} must match.","validation.size.array":"The {{attribute}} must contain {{size}} items.","validation.size.file":"The {{attribute}} must be {{size}} kilobytes.","validation.size.numeric":"The {{attribute}} must be {{size}}.","validation.size.string":"The {{attribute}} must be {{size}} characters.","validation.starts_with":"The {{attribute}} must start with one of the following: {{values}}.","validation.string":"The {{attribute}} must be a string.","validation.timezone":"The {{attribute}} must be a valid timezone.","validation.unique":"The {{attribute}} has already been taken.","validation.uploaded":"The {{attribute}} failed to upload.","validation.uppercase":"The {{attribute}} must be uppercase.","validation.url":"The {{attribute}} must be a valid URL.","validation.ulid":"The {{attribute}} must be a valid ULID.","validation.uuid":"The {{attribute}} must be a valid UUID.","validation.custom.attribute-name.rule-name":"custom-message","validation.unsupported_currency_code":"The currency code you provided is invalid or not supported.","validation.unsupported_period":"The period you provided is invalid or not supported.","validation.unsupported_token_symbol":"The token symbol you provided is invalid or not supported.","validation.gallery_title_required":"Gallery name is required.","validation.gallery_title_max_characters":"The gallery name should not exceed 50 characters.","validation.gallery_title_invalid":"The gallery name is invalid.","validation.nfts_required":"Please add at least one NFT.","validation.nfts_max_size":"Galleries can contain no more than {{limit}} NFTs","validation.invalid_nfts":"The NFT in position {{position}} is invalid, please select another one.","validation.invalid_cover":"You have selected an invalid cover image, please try another one."} +{"auth.welcome":"Welcome to Dashbrd","auth.logged_in":"You're logged in!","auth.log_out":"Log out","auth.failed":"These credentials do not match our records.","auth.session_timeout":"Your session has timed out. Please refresh the page and try connecting your account again.","auth.session_timeout_modal":"Seems like your session has timed out. Please connnect your wallet again.","auth.password":"The provided password is incorrect.","auth.throttle":"Too many login attempts. Please try again in {{seconds}} seconds.","auth.wallet.connecting":"Connecting …","auth.wallet.waiting_for_signature":"Waiting for Signature …","auth.wallet.switching_wallet":"Switching Wallet …","auth.wallet.connect":"Connect Wallet","auth.wallet.connect_long":"Connect Your Wallet to Get Started","auth.wallet.sign_subtitle":"Connect Your Wallet to Continue","auth.wallet.disconnect":"Disconnect Wallet","auth.wallet.install":"Install MetaMask","auth.wallet.install_long":"Install MetaMask to Get Started","auth.wallet.sign":"Sign Message","auth.wallet.sign_message":"Welcome to Dashbrd. In order to login, sign this message with your wallet. It doesn't cost you anything!\n\nSigning ID (you can ignore this): {{nonce}}","auth.wallet.connect_subtitle":"Click on the MetaMask icon in your browser to confirm the action and connect your wallet.","auth.wallet.requires_signature":"In order to prevent impersonation, we require a signature to perform this action. This signature is only a signed message and does not give any access to your wallet.","auth.errors.metamask.no_account":"No account found. Please connect your wallet and try again.","auth.errors.metamask.generic":"Connection attempt error. Please retry and follow the steps to connect your wallet.","auth.errors.metamask.invalid_network":"Please switch to Polygon or Ethereum Mainnet in your MetaMask plugin to connect to Dashbrd.","auth.errors.metamask.provider_missing":"You don't have MetaMask installed in your browser. Please install and try again.","auth.errors.metamask.user_rejected":"It looks like you cancelled signing of the authentication message. Please try again.","auth.errors.metamask.provider_not_set":"Ethereum provider is not set","auth.validation.wallet_login_failed":"There was a problem trying to verify your signature. Please try again.","auth.validation.invalid_address":"Your wallet address is invalid. Please try again.","auth.validation.invalid_signature":"Signature is invalid. Please try again.","auth.validation.invalid_network":"Please switch to Polygon or Ethereum Mainnet in your MetaMask plugin to connect to Dashbrd.","common.author":"Author","common.add":"Add","common.amount":"Amount","common.balance":"Balance","common.cancel":"Cancel","common.delete":"Delete","common.edit":"Edit","common.confirm":"Confirm","common.connect":"Connect","common.continue":"Continue","common.done":"Done","common.filter":"Filter","common.items":"Items","common.receive":"Receive","common.received":"Received","common.retry":"Retry","common.records":"Records","common.save":"Save","common.send":"Send","common.sent":"Sent","common.show":"Show","common.searching":"Searching...","common.other":"Other","common.owned":"Owned","common.token":"Token","common.tokens":"Tokens","common.wallet":"Wallet","common.pending":"Pending","common.publish":"Publish","common.published":"Published","common.empty":"Empty","common.your_address":"Your Address","common.warning":"Warning","common.my_address":"My Address","common.my_wallet":"My Wallet","common.my_collections":"My Collections","common.my_balance":"My Balance","common.na":"N/A","common.simple_plural_without_data":"One comment|Many comments","common.simple_plural_with_data":"{{count}} comment|{{count}} comments","common.advanced_plural_without_data":"{0} no comments yet|{1} 1 comment|[2,*] Many comments","common.advanced_plural_with_data":"{0} no comments yet|{1} 1 comment|[2,*] {{count}} comments","common.copy_clipboard":"Copy to Clipboard","common.copy":"Copy","common.download":"Download","common.zoom":"Zoom","common.my_collection":"My Collection","common.max":"Max","common.chain":"Chain","common.copied":"Copied!","common.coming_soon":"Coming Soon","common.more_details":"More Details","common.close":"Close","common.close_toast":"Close toast","common.loading":"Loading","common.price":"Price","common.articles":"Articles","common.most_popular":"Most Popular","common.market_cap":"Market Cap","common.volume":"Volume","common.volume_frequency":"Volume {{frequency}}","common.value":"Value","common.last_n_days":"Last {{count}} Days","common.details":"Details","common.view_all":"View All","common.view_more_on_polygonscan":"View More on Polygonscan","common.view_more_on_etherscan":"View More on Etherscan","common.view_nft_on_etherscan":"View NFT on Etherscan","common.view_nft_on_polygonscan":"View NFT on Polygonscan","common.view_nft_on_goerli_tesnet":"View NFT on Goerli Testnet Explorer","common.view_nft_on_mumbai_tesnet":"View NFT on Mumbai Testnet Explorer","common.polygonscan":"Polygonscan","common.etherscan":"Etherscan","common.featured":"Featured","common.floor_price":"Floor Price","common.floor":"Floor","common.supply":"Supply","common.owners":"Owners","common.created":"Created","common.nft":"NFT","common.collection":"Collection","common.collections":"Collections","common.gallery":"Gallery","common.basic_gallery":"Basic Gallery","common.gallery_name":"Gallery Name","common.create_gallery":"Create Gallery","common.external_link":"External Link","common.follow_link":"Follow Link","common.cover":"Cover","common.template":"Template","common.page":"Page","common.polygon":"Polygon","common.ethereum":"Ethereum","common.mumbai":"Mumbai","common.goerli":"Goerli","common.of":"of","common.pagination_input_placeholder":"Enter the page number","common.pagination_input_placeholder_mobile":"Page number","common.nft_count":"{0} {{count}} NFTs|{1} {{count}} NFT|[2,*] {{count}} NFTs","common.nft_gallery":"NFT Gallery","common.unable_to_retrieve_image":"Unable to retrieve your NFT image at this time","common.optional":"Optional","common.selected":"Selected","common.select":"Select","common.preview":"Preview","common.image_size_error":"Image size must not exceed 2MB","common.image_dimensions_error":"Image dimensions must exceed 287px x 190px","common.write_to_confirm":"Write {{word}} to confirm","common.n_hours":"{0} {{count}} hour|{1} {{count}} hour|[2,*] {{count}} hours","common.n_minutes":"{0} {{count}} minute|{1} {{count}} minute|[2,*] {{count}} minutes","common.report":"Report","common.nfts":"NFTs","common.n_nfts":"{0}NFTs|{1}NFT|[2,*]NFTs","common.n_collections":"{0}collections|{1}collection|[2,*]collections","common.back":"Back","common.back_to":"Back to","common.name":"Name","common.type":"Type","common.from":"From","common.to":"To","common.sale_price":"Sale Price","common.recent_activity":"Recent Activity","common.time":"Time","common.datetime.few_seconds_ago":"A few seconds ago","common.datetime.minutes_ago":"{0} Less than a minute ago|{1} A minute ago|[2,*] {{count}} minutes ago","common.datetime.hours_ago":"{0} Less than an hour ago|{1} An hour ago|[2,*] {{count}} hours ago","common.datetime.days_ago":"{0} Less than a day ago|{1} A day ago|[2,*] {{count}} days ago","common.datetime.weeks_ago":"{0} Less than a week ago|{1} A week ago|[2,*] {{count}} weeks ago","common.datetime.months_ago":"{0} Less than a month ago|{1} A month ago|[2,*] {{count}} months ago","common.datetime.years_ago":"{0} Less than a year ago|{1} A year ago|[2,*] {{count}} years ago","common.no_traits_found":"No traits found.","common.empty_transactions":"You don't have any transactions yet. Once transactions have been made, they will show up here.","common.error":"Error","common.refresh":"Refresh","common.refresh_metadata":"Refresh Metadata","common.refreshing_metadata":"Refreshing Metadata... Please check back later.","common.refreshing_activity":"Refreshing Activity... Please check back later.","common.pending_confirmation":"Pending Confirmation","common.confirmed_transaction":"Confirmed Transaction","common.transaction_error":"Transaction Error","common.transaction_error_description_first_part":"Your transaction encountered an error. View this transaction on","common.transaction_error_description_second_part":"for more details.","common.home":"Home","common.contact":"Contact","common.menu":"Menu","common.website":"Website","common.twitter":"Twitter","common.discord":"Discord","common.facebook":"Facebook","common.reddit":"Reddit","common.x":"X","common.sort":"Sort","common.drafts":"Drafts","common.draft":"Draft","common.delete_draft":"Delete Draft","common.share_on":"Share on {{platform}}","common.top":"Top","common.all_chains":"All chains","footer.copyright":"{{year}} © Dashbrd. All rights reserved.","footer.all_rights_reserved":"All rights reserved","footer.privacy_policy":"Privacy Policy","footer.terms_of_service":"Terms of Service","footer.powered_by":"Powered by","format.fiat":"{{ value, currency }}","format.number":"{{ value, number }}","metatags.home.title":"Dashbrd | Web3 Portfolio Management Made Simple","metatags.home.description":"Simplify your Web3 journey with Dashbrd. Manage your portfolio of tokens, NFTs, and other digital collectibles across the Ethereum and Polygon blockchains.","metatags.home.image":"/images/meta/home.png","metatags.error.title":"Error {{code}} | Dashbrd","metatags.wallet.title":"My Wallet | Dashbrd","metatags.galleries.title":"Top NFT Galleries | Dashbrd","metatags.galleries.image":"/images/meta/nft-galleries.png","metatags.galleries.description":"Explore user published NFT galleries to find custom curated PFPs, Digital Collectibles, & More.","metatags.galleries.most_popular.title":"Most Popular Galleries | Dashbrd","metatags.galleries.most_popular.image":"/images/meta/most-popular-nft-galleries.png","metatags.galleries.most_popular.description":"Explore and discover Most Popular NFT Galleries created by our users featuring custom curated PFPs, Digital Collectibles, & More.","metatags.galleries.newest.title":"Newest Galleries | Dashbrd","metatags.galleries.newest.image":"/images/meta/newest-nft-galleries.png","metatags.galleries.newest.description":"Explore and discover most recent NFT galleries created by our users featuring custom curated PFPs, Digital Collectibles, & More","metatags.galleries.most_valuable.title":"Most Valuable Galleries | Dashbrd","metatags.galleries.most_valuable.image":"/images/meta/most-valuable-nft-galleries.png","metatags.galleries.most_valuable.description":"Explore and discover Most Valuable NFT Galleries created by our users featuring custom curated PFPs, Digital Collectibles, & More.","metatags.galleries.view.title":"{{name}} | Dashbrd","metatags.galleries.view.description":"{{name}} | A Curated NFT Gallery at Dashbrd","metatags.galleries.view.image":"/images/meta/nft-gallery.png","metatags.my_galleries.title":"My Galleries | Dashbrd","metatags.my_galleries.title_draft":"My Draft Galleries | Dashbrd","metatags.my_galleries.create.title":"Create Gallery | Dashbrd","metatags.my_galleries.edit.title":"Edit {{name}} | Dashbrd","metatags.collections.title":"Collections | Dashbrd","metatags.collections.view.title":"{{name}} Collection | Dashbrd","metatags.collections.view.description":"Immerse yourself in the intricate details of {{name}} collection, featuring remarkable digital assets. Start your NFT journey today!","metatags.collections.view.image":"/images/meta/nft-collection.png","metatags.my-collections.title":"My Collections | Dashbrd","metatags.nfts.view.title":"{{nft}} NFT | Dashbrd","metatags.nfts.view.description":"Uncover the complete story of {{nft}} NFT from the {{collection}} collection, delving into its unique attributes and distinctive features.","metatags.nfts.view.image":"/images/meta/nft-details.png","metatags.settings.title":"Settings | Dashbrd","metatags.articles.title":"Articles | Dashbrd","metatags.articles.view.title":"{{title}} | Dashbrd","metatags.login.title":"Login | Dashbrd","metatags.privacy_policy.title":"Privacy Policy | Dashbrd","metatags.privacy_policy.description":"Dashbrd’s privacy policy outlines the information we collect and explains your choices surrounding how we use information about you.","metatags.terms_of_service.title":"Terms of Service | Dashbrd","metatags.terms_of_service.description":"These Terms of Service cover your use and access to services, products or websites of Dashbrd.","metatags.cookie_policy.title":"Cookie Policy | Dashbrd","metatags.cookie_policy.description":"Dashbrd uses cookies to make the website more user-friendly. Find out about the main types of cookies we use, and what we use them for.","metatags.welcome.title":"Welcome to Dashbrd | Web3 Simplified","pages.onboarding.title":"Get Started","pages.onboarding.heading":"Your monkeys were bored and ran off, we are trying to round them up.","pages.onboarding.message":"We are setting up your account. This process usually takes just a few minutes, but can take up to 15 minutes.","pages.error.heading":"Oops, something went wrong ...","pages.error.message":"Please try again or get in touch if the issue persists.","pages.maintenance.title":"Dashbrd is currently down for scheduled maintenance.","pages.maintenance.description":"We expect to be back soon. Thanks for your patience.","pages.dashboard.title":"My Wallet","pages.dashboard.breakdown.title":"Portfolio Breakdown","pages.dashboard.line_chart.data_error":"Could not load chart data","pages.articles.title":"Articles","pages.articles.featured_collections":"Featured Collections","pages.articles.placeholder_more_soon":"More Soon","pages.articles.no_articles":"No articles have been published yet. Please check back later!","pages.articles.header_title":"Explore our collection of","pages.articles.header_suffix_one":"published article","pages.articles.header_suffix_other":"published articles","pages.articles.audio_version":"Audio version","pages.articles.consists_of_collections":"{0} This article highlights {{count}} collections|{1} This article highlights {{count}} collection|[2,*] This article highlights {{count}} collections","pages.collections.title":"Collections","pages.collections.collections":"Collections","pages.collections.popular_collections":"Popular Collections","pages.collections.collection_value":"Collection Value","pages.collections.nfts_owned":"NFTs Owned","pages.collections.header_title":"You own <0>{{nftsCount}} {{nfts}} across <0>{{collectionsCount}} {{collections}}, worth about <0><1>{{worth}}","pages.collections.search_placeholder":"Search by Collection","pages.collections.properties":"Properties","pages.collections.collections_network":"Collections Network","pages.collections.property_search_placeholder":"Feature Search","pages.collections.floor_price":"Floor Price","pages.collections.value":"Value","pages.collections.rarity":"Rarity","pages.collections.report":"Report","pages.collections.hide_collection":"Hide Collection","pages.collections.unhide_collection":"Unhide Collection","pages.collections.no_collections":"You do not own any NFTs yet. Once you do they will be shown here.","pages.collections.all_collections_hidden":"You have hidden all your collections. Unhide and they will appear here.","pages.collections.about_collection":"About Collection","pages.collections.show_hidden":"Show Hidden","pages.collections.show_my_collection":"Show My Collection","pages.collections.owned":"Owned","pages.collections.activities.loading_activities":"We're fetching Activity for this NFT, please hang tight, this can take a while.","pages.collections.activities.loading_activities_collection":"We're fetching Activity for this collection, please hang tight, this can take a while.","pages.collections.activities.ignores_activities":"We don't support activity history for this collection yet.","pages.collections.activities.no_activity":"This collection does not have any activity yet.","pages.collections.activities.types.LABEL_MINT":"Mint","pages.collections.activities.types.LABEL_TRANSFER":"Transfer","pages.collections.activities.types.LABEL_SALE":"Sale","pages.collections.articles.no_articles":"No articles have been linked to this collection as of now.","pages.collections.articles.no_articles_with_filters":"We could not find any articles matching your search criteria, please try again!","pages.collections.articles.search_placeholder":"Search in Articles","pages.collections.articles.sort_latest":"Latest","pages.collections.articles.sort_popularity":"Most Popular","pages.collections.search.loading_results":"Loading results...","pages.collections.search.no_results":"We could not find anything matching your search criteria, please try again!","pages.collections.search.no_results_with_filters":"We could not find anything matching your filters, please try again!","pages.collections.search.no_results_ownership":"You do not own any NFTs in this collection","pages.collections.search.error":"Could not load search results. Please try again later.","pages.collections.sorting.token_number":"Token Number","pages.collections.sorting.recently_received":"Recently Received","pages.collections.sorting.recently_created":"Recently Created","pages.collections.sorting.oldest_collection":"Oldest Collection","pages.collections.traits.description":"List of NFT traits by % of occurrence in the collection","pages.collections.traits.no_traits":"No Properties can be found for this NFT","pages.collections.menu.collection":"Collection","pages.collections.menu.articles":"Articles","pages.collections.menu.activity":"Activity","pages.collections.hidden_modal.collection_hidden":"Collection Hidden","pages.collections.hidden_modal.description":"This collection is currently set to Hidden. Are you sure you want to unhide this collection? You can\n reset the collection to hidden from the collection menu.","pages.collections.hidden_modal.unhide":"Unhide","pages.collections.hidden_modal.error":"Something went wrong. Please try again.","pages.collections.external_modal.you_wish_continue":"You are about to leave Dashbrd to an external website. Dashbrd has no control over the content of\n this site. Are you sure you wish to continue?","pages.collections.external_modal.not_show":"Do not show this message again.","pages.collections.refresh.title":"Refresh your collection","pages.collections.refresh.notice":"You can refresh data every 15 minutes.","pages.collections.refresh.notice_wait":"Please wait. You can refresh data every 15 minutes.","pages.collections.refresh.toast":"We're updating information for your collection.","pages.collections.featured.title":"Featured Collections","pages.collections.featured.button":"Explore Collection","pages.nfts.nft":"nft","pages.nfts.about_nft":"About NFT","pages.nfts.owned_by":"Owned by","pages.nfts.collection_image":"collection image","pages.nfts.menu.properties":"Properties","pages.nfts.menu.activity":"Activity","pages.reports.title":"Submit a Report","pages.reports.description":"Thanks for looking out by reporting things that break the rules. Let us know what's happening and we'll receive the report.","pages.reports.success":"Thank you for your report. We'll review it and see if it breaks our ToS.","pages.reports.failed":"Something went wrong. Please try again.","pages.reports.throttle":"You have made too many requests. Please wait {{time}} before reporting again.","pages.reports.reported":"You have already reported this {{model}}.","pages.reports.reasons.spam":"Spam","pages.reports.reasons.violence":"Promoting Violence","pages.reports.reasons.hate":"Hate","pages.reports.reasons.inappropriate_content":"Inappropriate Content","pages.reports.reasons.impersonation":"Impersonation","pages.reports.reasons.trademark":"Trademark or Copyright","pages.reports.reasons.selfharm":"Self-Harm","pages.reports.reasons.harassment":"Harassment","pages.galleries.title":"Galleries","pages.galleries.empty_title":"No galleries have been published yet. Once they do they will appear here.","pages.galleries.search.loading_results":"Loading results...","pages.galleries.search.no_results":"We could not find anything matching your search criteria, please try again!","pages.galleries.search.placeholder":"Search by name or curator address","pages.galleries.search.placeholder_nfts":"Search by NFTs","pages.galleries.search.error":"Could not load search results. Please try again later.","pages.galleries.my_galleries.title":"My Galleries","pages.galleries.my_galleries.subtitle":"Manage your galleries","pages.galleries.my_galleries.new_gallery":"New Gallery","pages.galleries.my_galleries.no_galleries":"You have not created any galleries yet. To create a gallery, click on the \"Create Gallery\" button.","pages.galleries.my_galleries.no_draft_galleries":"You have no draft galleries yet. To create a gallery, click on the \"Create Gallery\" button.","pages.galleries.my_galleries.succesfully_deleted":"Gallery has been successfully removed","pages.galleries.my_galleries.draft_succesfully_deleted":"Draft has been successfully removed","pages.galleries.my_galleries.successfully_created":"Gallery has been successfully created","pages.galleries.my_galleries.successfully_updated":"Gallery has been successfully updated","pages.galleries.my_galleries.new_gallery_no_nfts":"Creating a Gallery requires you to own an NFT.","pages.galleries.my_galleries.delete_modal.title":"Delete Draft","pages.galleries.my_galleries.delete_modal.text":"Are you sure you want to delete the draft? Everything you've done will be deleted and you won't be able to get it back.","pages.galleries.my_galleries.nfts_no_longer_owned":"NFTs no longer owned by this wallet have been removed from the draft”","pages.galleries.copy_gallery_link":"Copy Gallery Link","pages.galleries.my_nfts":"My NFTs","pages.galleries.value":"Value","pages.galleries.floor_price":"Floor Price","pages.galleries.nfts":"NFTs","pages.galleries.collections":"Collections","pages.galleries.galleries_count_simple":"{0} galleries|{1} gallery|[2,*] galleries","pages.galleries.galleries_count":"{0} {{count}} Galleries|{1} {{count}} Gallery|[2,*] {{count}} Galleries","pages.galleries.collections_count_simple":"{0} collections|{1} collection|[2,*] collections","pages.galleries.collections_count":"{0} {{count}} Collections|{1} {{count}} Collection|[2,*] {{count}} Collections","pages.galleries.nfts_count_simple":"{0} NFTs|{1} NFT|[2,*] NFTs","pages.galleries.nfts_count":"{0} {{count}} NFTs|{1} {{count}} NFT|[2,*] {{count}} NFTs","pages.galleries.users_count_simple":"{0} users|{1} user|[2,*] users","pages.galleries.users_count":"{0} {{count}} Users|{1} {{count}} User|[2,*] {{count}} Users","pages.galleries.featuring":"Featuring","pages.galleries.curated_by":"Curated by","pages.galleries.worth_about":"Worth About","pages.galleries.valued_at":"valued at","pages.galleries.from":"From","pages.galleries.most_popular_galleries":"Most Popular Galleries","pages.galleries.newest_galleries":"Newest Galleries","pages.galleries.most_valuable_galleries":"Most Valuable Galleries","pages.galleries.most_popular":"Most Popular","pages.galleries.newest":"Newest","pages.galleries.most_valuable":"Most Valuable","pages.galleries.create.search_by_nfts":"Search by NFTs","pages.galleries.create.input_placeholder":"Enter gallery name","pages.galleries.create.title_too_long":"Gallery name must not exceed {{max}} characters.","pages.galleries.create.already_selected_nft":"NFT already exists in this gallery","pages.galleries.create.nft_missing_image":"Only NFTs with images can be added to galleries","pages.galleries.create.nft_gallery_limit":"You can only add 16 NFTs per gallery","pages.galleries.create.gallery_cover":"Gallery Cover","pages.galleries.create.gallery_cover_description":"The cover is used for the card on the gallery list page. While the cover is not a requirement it will allow you to add personality and stand out from the crowd.","pages.galleries.create.gallery_cover_information":"Image dimensions must be at least 287px x 190px, with a max size of 2 MB (JPG, PNG or GIF)","pages.galleries.create.no_results":"We could not find anything matching your search criteria, please try again!","pages.galleries.create.templates.cover":"Cover","pages.galleries.create.templates.template":"Template","pages.galleries.create.templates.select":"Select Gallery Template","pages.galleries.create.templates.basic":"Basic Gallery","pages.galleries.create.templates.coming_soon":"More Coming Soon","pages.galleries.create.load_more_collections_one":"Load {{count}} More Collection","pages.galleries.create.load_more_collections_other":"Load {{count}} More Collections","pages.galleries.create.load_more_nfts":"Load More NFTs","pages.galleries.create.can_purchase":"You can purchase NFTs with these top NFT Marketplaces:","pages.galleries.create.must_own_one_nft":"You must own at least one (1) NFT in order to create a gallery.","pages.galleries.create.back_to_galleries":"Back to Galleries","pages.galleries.create.draft_saved":"Draft Saved","pages.galleries.create.saving_to_draft":"Saving to draft","pages.galleries.create.drafts_limit_modal_title":"Draft Gallery Limit","pages.galleries.create.drafts_limit_modal_message":"You’ve hit your limit for draft galleries. While you can still make new galleries and publish them, they won’t be saved as drafts. To Free up space, you can either delete existing drafts or publish them.","pages.galleries.create.drafts_limit_modal_cancel":"Go to Drafts","pages.galleries.delete_modal.title":"Delete Gallery","pages.galleries.delete_modal.confirmation_text":"Are you sure you want to delete the gallery? Deleting a Gallery is permanent, all associated views and likes will be lost.","pages.galleries.consists_of_collections":"{0} This gallery consists of {{count}} collections|{1} This gallery consists of {{count}} collection|[2,*] This gallery consists of {{count}} collections","pages.galleries.guest_banner.title":"Craft the ultimate","pages.galleries.guest_banner.subtitle":"Pick your favorites, curate your gallery, & share it with the world.","pages.profile.title":"Profile","pages.token_panel.balance_tooltip":"Total percentage of the portfolio held in this token","pages.token_panel.insufficient_funds":"Insufficient Balance","pages.token_panel.error":"Dashbrd has failed to load token information. Please try again later.","pages.token_panel.failed_to_retrieve_transactions":"We were unable to fetch your transactions.","pages.token_panel.tabs.transaction_history":"Transaction History","pages.token_panel.tabs.history":"History","pages.token_panel.tabs.market_data":"Market Data","pages.token_panel.details.current_price":"Current Price","pages.token_panel.details.title":"Token Details","pages.token_panel.details.market_cap":"Market Cap","pages.token_panel.details.volume":"Daily Volume","pages.token_panel.details.supply":"Minted Supply","pages.token_panel.details.ath":"All-Time High","pages.token_panel.details.atl":"All-Time Low","pages.token_panel.chart.failed":"Dashbrd has failed to load chart information. Please try again later.","pages.transaction_details_panel.title":"Transaction Details","pages.transaction_details_panel.details.blockchain":"Blockchain","pages.transaction_details_panel.details.timestamp":"Timestamp","pages.transaction_details_panel.details.transaction_hash":"Transaction Hash","pages.transaction_details_panel.details.transaction_fee":"Transaction Fee","pages.transaction_details_panel.details.gas_price":"Gas Price","pages.transaction_details_panel.details.gas_used":"Gas Used","pages.transaction_details_panel.details.nonce":"Nonce","pages.send_receive_panel.send.labels.token_and_amount":"Token and Amount","pages.send_receive_panel.send.labels.destination_address":"Destination Address","pages.send_receive_panel.send.labels.projected_fee":"Projected Fee","pages.send_receive_panel.send.placeholders.enter_amount":"Enter Amount","pages.send_receive_panel.send.placeholders.insert_recipient_address":"Insert Recipient Address","pages.send_receive_panel.send.placeholders.projected_fee":"Projected Fee","pages.send_receive_panel.send.errors.amount":"Insufficient Funds: You do not have enough to cover the amount + fee.","pages.send_receive_panel.send.errors.destination":"Destination address is not correct. Check and input again.","pages.send_receive_panel.send.hints.token_price":"Token Price","pages.send_receive_panel.send.fees.Fast":"Fast","pages.send_receive_panel.send.fees.Avg":"Avg","pages.send_receive_panel.send.fees.Slow":"Slow","pages.send_receive_panel.send.search_dropdown.placeholder":"Search token","pages.send_receive_panel.send.search_dropdown.no_results":"No Results","pages.send_receive_panel.send.search_dropdown.error":"Error occurred while searching tokens.","pages.send_receive_panel.send.transaction_time":"Transaction Time: ~{{ time }} minutes","pages.send_receive_panel.send.from":"From","pages.send_receive_panel.send.to":"To","pages.send_receive_panel.send.amount":"Amount","pages.send_receive_panel.send.fee":"Fee","pages.send_receive_panel.send.total_amount":"Total Amount","pages.send_receive_panel.send.waiting_message":"Review and verify the information on your MetaMask. Sign to send the transaction.","pages.send_receive_panel.send.waiting_spinner_text":"Waiting for confirmation...","pages.send_receive_panel.send.failed_message":"It looks like something went wrong while sending your transaction. Press 'Retry' to make another attempt.","pages.send_receive_panel.receive.alert":"Send only Polygon or Ethereum Network compatible tokens to this address or you could permanently lose your funds!","pages.settings.title":"Settings","pages.settings.sidebar.general":"General","pages.settings.sidebar.notifications":"Notifications","pages.settings.sidebar.session_history":"Sessions History","pages.settings.general.title":"Settings","pages.settings.general.subtitle":"Customize your App Experience","pages.settings.general.currency":"Currency","pages.settings.general.currency_subtitle":"Select your default currency which will be used throughout the app.","pages.settings.general.time_date":"Time & Date","pages.settings.general.time_date_subtitle":"Select how you want time and date be shown inside app.","pages.settings.general.date_format":"Date Format","pages.settings.general.time_format":"Time Format","pages.settings.general.timezone":"Timezone","pages.settings.general.set_defaults":"Set Defaults","pages.settings.general.set_defaults_content":"Reverting to the default settings will remove any customizations previously made. Are you sure?","pages.settings.general.save":"Save Settings","pages.settings.general.saved":"Your settings have been successfully saved","pages.wallet.title":"Wallet","pages.privacy_policy.title":"Privacy Policy","pages.terms_of_service.title":"Terms of Service","pagination.previous":"« Previous","pagination.next":"Next »","passwords.reset":"Your password has been reset!","passwords.sent":"We have emailed your password reset link!","passwords.throttled":"Please wait before retrying.","passwords.token":"This password reset token is invalid.","passwords.user":"We can't find a user with that email address.","urls.landing":"https://dashbrd.com","urls.cookie_policy":"https://dashbrd.com/cookie-policy","urls.privacy_policy":"https://dashbrd.com/privacy-policy","urls.terms_of_service":"https://dashbrd.com/terms-of-service","urls.twitter":"https://x.com/DashbrdApp","urls.discord":"https://discord.gg/MJyWKkCJ5k","urls.github":"https://github.com/ArdentHQ/dashbrd","urls.coingecko":"https://www.coingecko.com","urls.etherscan":"https://etherscan.io","urls.polygonscan":"https://polygonscan.com","urls.alchemy":"https://www.alchemy.com","urls.moralis":"https://moralis.io","urls.mnemonic":"https://www.mnemonichq.com","urls.opensea":"https://opensea.io/","urls.explorers.etherscan.token_transactions":"https://etherscan.io/token/{{token}}?a={{address}}","urls.explorers.etherscan.addresses":"https://etherscan.io/address/{{address}}","urls.explorers.etherscan.transactions":"https://etherscan.io/tx/{{id}}","urls.explorers.etherscan.nft":"https://etherscan.io/nft/{{address}}/{{nftId}}","urls.explorers.polygonscan.token_transactions":"https://polygonscan.com/token/{{token}}?a={{address}}","urls.explorers.polygonscan.addresses":"https://polygonscan.com/address/{{address}}","urls.explorers.polygonscan.transactions":"https://polygonscan.com/tx/{{id}}","urls.explorers.polygonscan.nft":"https://polygonscan.com/nft/{{address}}/{{nftId}}","urls.explorers.mumbai.token_transactions":"https://mumbai.polygonscan.com/token/{{token}}?a={{address}}","urls.explorers.mumbai.addresses":"https://mumbai.polygonscan.com/address/{{address}}","urls.explorers.mumbai.transactions":"https://mumbai.polygonscan.com/tx/{{id}}","urls.explorers.mumbai.nft":"https://mumbai.polygonscan.com/nft/{{address}}/{{nftId}}","urls.explorers.goerli.token_transactions":"https://goerli.etherscan.io/token/{{token}}?a={{address}}","urls.explorers.goerli.addresses":"https://goerli.etherscan.io/address/{{address}}","urls.explorers.goerli.transactions":"https://goerli.etherscan.io/tx/{{id}}","urls.explorers.goerli.nft":"https://goerli.etherscan.io/nft/{{address}}/{{nftId}}","urls.marketplaces.opensea.collection":"https://opensea.io/assets/{{network}}/{{address}}","urls.marketplaces.opensea.nft":"https://opensea.io/assets/{{network}}/{{address}}/{{nftId}}","urls.marketplaces.rarible.collection":"https://rarible.com/collection/{{address}}/items","urls.marketplaces.rarible.nft":"https://rarible.com/token/{{address}}:{{nftId}}","urls.marketplaces.blur.collection":"https://blur.io/collection/{{address}}","urls.marketplaces.blur.nft":"https://blur.io/asset/{{address}}/{{nftId}}","urls.marketplaces.looksrare.collection":"https://looksrare.org/collections/{{address}}","urls.marketplaces.looksrare.nft":"https://looksrare.org/collections/{{address}}/{{nftId}}","validation.accepted":"The {{attribute}} must be accepted.","validation.accepted_if":"The {{attribute}} must be accepted when {{other}} is {{value}}.","validation.active_url":"The {{attribute}} is not a valid URL.","validation.after":"The {{attribute}} must be a date after {{date}}.","validation.after_or_equal":"The {{attribute}} must be a date after or equal to {{date}}.","validation.alpha":"The {{attribute}} must only contain letters.","validation.alpha_dash":"The {{attribute}} must only contain letters, numbers, dashes and underscores.","validation.alpha_num":"The {{attribute}} must only contain letters and numbers.","validation.array":"The {{attribute}} must be an array.","validation.ascii":"The {{attribute}} must only contain single-byte alphanumeric characters and symbols.","validation.before":"The {{attribute}} must be a date before {{date}}.","validation.before_or_equal":"The {{attribute}} must be a date before or equal to {{date}}.","validation.between.array":"The {{attribute}} must have between {{min}} and {{max}} items.","validation.between.file":"The {{attribute}} must be between {{min}} and {{max}} kilobytes.","validation.between.numeric":"The {{attribute}} must be between {{min}} and {{max}}.","validation.between.string":"The {{attribute}} must be between {{min}} and {{max}} characters.","validation.boolean":"The {{attribute}} field must be true or false.","validation.confirmed":"The {{attribute}} confirmation does not match.","validation.current_password":"The password is incorrect.","validation.date":"The {{attribute}} is not a valid date.","validation.date_equals":"The {{attribute}} must be a date equal to {{date}}.","validation.date_format":"The {{attribute}} does not match the format {{format}}.","validation.decimal":"The {{attribute}} must have {{decimal}} decimal places.","validation.declined":"The {{attribute}} must be declined.","validation.declined_if":"The {{attribute}} must be declined when {{other}} is {{value}}.","validation.different":"The {{attribute}} and {{other}} must be different.","validation.digits":"The {{attribute}} must be {{digits}} digits.","validation.digits_between":"The {{attribute}} must be between {{min}} and {{max}} digits.","validation.dimensions":"The {{attribute}} has invalid image dimensions.","validation.distinct":"The {{attribute}} field has a duplicate value.","validation.doesnt_end_with":"The {{attribute}} may not end with one of the following: {{values}}.","validation.doesnt_start_with":"The {{attribute}} may not start with one of the following: {{values}}.","validation.email":"The {{attribute}} must be a valid email address.","validation.ends_with":"The {{attribute}} must end with one of the following: {{values}}.","validation.enum":"The selected {{attribute}} is invalid.","validation.exists":"The selected {{attribute}} is invalid.","validation.file":"The {{attribute}} must be a file.","validation.filled":"The {{attribute}} field must have a value.","validation.gt.array":"The {{attribute}} must have more than {{value}} items.","validation.gt.file":"The {{attribute}} must be greater than {{value}} kilobytes.","validation.gt.numeric":"The {{attribute}} must be greater than {{value}}.","validation.gt.string":"The {{attribute}} must be greater than {{value}} characters.","validation.gte.array":"The {{attribute}} must have {{value}} items or more.","validation.gte.file":"The {{attribute}} must be greater than or equal to {{value}} kilobytes.","validation.gte.numeric":"The {{attribute}} must be greater than or equal to {{value}}.","validation.gte.string":"The {{attribute}} must be greater than or equal to {{value}} characters.","validation.image":"The {{attribute}} must be an image.","validation.in":"The selected {{attribute}} is invalid.","validation.in_array":"The {{attribute}} field does not exist in {{other}}.","validation.integer":"The {{attribute}} must be an integer.","validation.ip":"The {{attribute}} must be a valid IP address.","validation.ipv4":"The {{attribute}} must be a valid IPv4 address.","validation.ipv6":"The {{attribute}} must be a valid IPv6 address.","validation.json":"The {{attribute}} must be a valid JSON string.","validation.lowercase":"The {{attribute}} must be lowercase.","validation.lt.array":"The {{attribute}} must have less than {{value}} items.","validation.lt.file":"The {{attribute}} must be less than {{value}} kilobytes.","validation.lt.numeric":"The {{attribute}} must be less than {{value}}.","validation.lt.string":"The {{attribute}} must be less than {{value}} characters.","validation.lte.array":"The {{attribute}} must not have more than {{value}} items.","validation.lte.file":"The {{attribute}} must be less than or equal to {{value}} kilobytes.","validation.lte.numeric":"The {{attribute}} must be less than or equal to {{value}}.","validation.lte.string":"The {{attribute}} must be less than or equal to {{value}} characters.","validation.mac_address":"The {{attribute}} must be a valid MAC address.","validation.max.array":"The {{attribute}} must not have more than {{max}} items.","validation.max.file":"The {{attribute}} must not be greater than {{max}} kilobytes.","validation.max.numeric":"The {{attribute}} must not be greater than {{max}}.","validation.max.string":"The {{attribute}} must not be greater than {{max}} characters.","validation.max_digits":"The {{attribute}} must not have more than {{max}} digits.","validation.mimes":"The {{attribute}} must be a file of type: {{values}}.","validation.mimetypes":"The {{attribute}} must be a file of type: {{values}}.","validation.min.array":"The {{attribute}} must have at least {{min}} items.","validation.min.file":"The {{attribute}} must be at least {{min}} kilobytes.","validation.min.numeric":"The {{attribute}} must be at least {{min}}.","validation.min.string":"The {{attribute}} must be at least {{min}} characters.","validation.min_digits":"The {{attribute}} must have at least {{min}} digits.","validation.missing":"The {{attribute}} field must be missing.","validation.missing_if":"The {{attribute}} field must be missing when {{other}} is {{value}}.","validation.missing_unless":"The {{attribute}} field must be missing unless {{other}} is {{value}}.","validation.missing_with":"The {{attribute}} field must be missing when {{values}} is present.","validation.missing_with_all":"The {{attribute}} field must be missing when {{values}} are present.","validation.multiple_of":"The {{attribute}} must be a multiple of {{value}}.","validation.not_in":"The selected {{attribute}} is invalid.","validation.not_regex":"The {{attribute}} format is invalid.","validation.numeric":"The {{attribute}} must be a number.","validation.password.letters":"The {{attribute}} must contain at least one letter.","validation.password.mixed":"The {{attribute}} must contain at least one uppercase and one lowercase letter.","validation.password.numbers":"The {{attribute}} must contain at least one number.","validation.password.symbols":"The {{attribute}} must contain at least one symbol.","validation.password.uncompromised":"The given {{attribute}} has appeared in a data leak. Please choose a different {{attribute}}.","validation.present":"The {{attribute}} field must be present.","validation.prohibited":"The {{attribute}} field is prohibited.","validation.prohibited_if":"The {{attribute}} field is prohibited when {{other}} is {{value}}.","validation.prohibited_unless":"The {{attribute}} field is prohibited unless {{other}} is in {{values}}.","validation.prohibits":"The {{attribute}} field prohibits {{other}} from being present.","validation.regex":"The {{attribute}} format is invalid.","validation.required":"The {{attribute}} field is required.","validation.required_array_keys":"The {{attribute}} field must contain entries for: {{values}}.","validation.required_if":"The {{attribute}} field is required when {{other}} is {{value}}.","validation.required_if_accepted":"The {{attribute}} field is required when {{other}} is accepted.","validation.required_unless":"The {{attribute}} field is required unless {{other}} is in {{values}}.","validation.required_with":"The {{attribute}} field is required when {{values}} is present.","validation.required_with_all":"The {{attribute}} field is required when {{values}} are present.","validation.required_without":"The {{attribute}} field is required when {{values}} is not present.","validation.required_without_all":"The {{attribute}} field is required when none of {{values}} are present.","validation.same":"The {{attribute}} and {{other}} must match.","validation.size.array":"The {{attribute}} must contain {{size}} items.","validation.size.file":"The {{attribute}} must be {{size}} kilobytes.","validation.size.numeric":"The {{attribute}} must be {{size}}.","validation.size.string":"The {{attribute}} must be {{size}} characters.","validation.starts_with":"The {{attribute}} must start with one of the following: {{values}}.","validation.string":"The {{attribute}} must be a string.","validation.timezone":"The {{attribute}} must be a valid timezone.","validation.unique":"The {{attribute}} has already been taken.","validation.uploaded":"The {{attribute}} failed to upload.","validation.uppercase":"The {{attribute}} must be uppercase.","validation.url":"The {{attribute}} must be a valid URL.","validation.ulid":"The {{attribute}} must be a valid ULID.","validation.uuid":"The {{attribute}} must be a valid UUID.","validation.custom.attribute-name.rule-name":"custom-message","validation.unsupported_currency_code":"The currency code you provided is invalid or not supported.","validation.unsupported_period":"The period you provided is invalid or not supported.","validation.unsupported_token_symbol":"The token symbol you provided is invalid or not supported.","validation.gallery_title_required":"Gallery name is required.","validation.gallery_title_max_characters":"The gallery name should not exceed 50 characters.","validation.gallery_title_invalid":"The gallery name is invalid.","validation.nfts_required":"Please add at least one NFT.","validation.nfts_max_size":"Galleries can contain no more than {{limit}} NFTs","validation.invalid_nfts":"The NFT in position {{position}} is invalid, please select another one.","validation.invalid_cover":"You have selected an invalid cover image, please try another one."} \ No newline at end of file diff --git a/resources/js/Pages/Collections/Index.tsx b/resources/js/Pages/Collections/Index.tsx index 30239ec70..8b0ca3c9e 100644 --- a/resources/js/Pages/Collections/Index.tsx +++ b/resources/js/Pages/Collections/Index.tsx @@ -54,9 +54,8 @@ const CollectionsIndex = ({ return ( - {t("pages.collections.popular_collections")} +
-
{t("pages.collections.popular_collections")} From ae26fb08a57c5cd7d58d24ce07449e728267dd85 Mon Sep 17 00:00:00 2001 From: Juan Patricio Marroquin Date: Fri, 24 Nov 2023 07:04:15 -0500 Subject: [PATCH 57/61] feat: CollectionImageWithIcon --- .../PopularCollectionsTable.blocks.tsx | 21 ++++------- .../CollectionImageWithIcon.tsx | 36 +++++++++++++++++++ .../Components/CollectionImage/index.tsx | 1 + .../FeaturedCollectionsItem.tsx | 21 +++++------ 4 files changed, 52 insertions(+), 27 deletions(-) create mode 100644 resources/js/Pages/Collections/Components/CollectionImage/CollectionImageWithIcon.tsx create mode 100644 resources/js/Pages/Collections/Components/CollectionImage/index.tsx diff --git a/resources/js/Components/Collections/PopularCollectionsTable/PopularCollectionsTable.blocks.tsx b/resources/js/Components/Collections/PopularCollectionsTable/PopularCollectionsTable.blocks.tsx index 77986da23..870a3c258 100644 --- a/resources/js/Components/Collections/PopularCollectionsTable/PopularCollectionsTable.blocks.tsx +++ b/resources/js/Components/Collections/PopularCollectionsTable/PopularCollectionsTable.blocks.tsx @@ -1,10 +1,9 @@ import { useRef } from "react"; import { useTranslation } from "react-i18next"; -import { Img } from "@/Components/Image"; -import { NetworkIcon } from "@/Components/Networks/NetworkIcon"; import { PriceChange } from "@/Components/PriceChange/PriceChange"; import { Tooltip } from "@/Components/Tooltip"; import { useIsTruncated } from "@/Hooks/useIsTruncated"; +import { CollectionImageWithIcon } from "@/Pages/Collections/Components/CollectionImage"; import { FormatCrypto, FormatFiat } from "@/Utils/Currency"; import { isTruthy } from "@/Utils/is-truthy"; @@ -23,18 +22,12 @@ export const PopularCollectionName = ({ className="group relative h-11 w-full cursor-pointer md:h-12" >
-
- - -
- -
-
+
( +
+ + +
+ +
+
+); diff --git a/resources/js/Pages/Collections/Components/CollectionImage/index.tsx b/resources/js/Pages/Collections/Components/CollectionImage/index.tsx new file mode 100644 index 000000000..d05e5ee65 --- /dev/null +++ b/resources/js/Pages/Collections/Components/CollectionImage/index.tsx @@ -0,0 +1 @@ +export * from "./CollectionImageWithIcon"; diff --git a/resources/js/Pages/Collections/Components/FeaturedCollections/FeaturedCollectionsItem.tsx b/resources/js/Pages/Collections/Components/FeaturedCollections/FeaturedCollectionsItem.tsx index 4f779aa7c..58fd23047 100644 --- a/resources/js/Pages/Collections/Components/FeaturedCollections/FeaturedCollectionsItem.tsx +++ b/resources/js/Pages/Collections/Components/FeaturedCollections/FeaturedCollectionsItem.tsx @@ -5,7 +5,7 @@ import { FeaturedCollectionStats } from "./FeaturedCollectionStats"; import { ButtonLink } from "@/Components/Buttons/ButtonLink"; import { Heading } from "@/Components/Heading"; import { Img } from "@/Components/Image"; -import { NetworkIcon } from "@/Components/Networks/NetworkIcon"; +import { CollectionImageWithIcon } from "@/Pages/Collections/Components/CollectionImage"; const truncateDescription = ( description: App.Data.Collections.CollectionFeaturedData["description"], @@ -25,18 +25,13 @@ const FeaturedCollectionInfo = ({ data }: { data: App.Data.Collections.Collectio
-
- - -
- -
-
+
From 58b89d648305e0d0c91ff857cc10438ed6871161 Mon Sep 17 00:00:00 2001 From: Juan Patricio Marroquin Date: Fri, 24 Nov 2023 10:00:18 -0500 Subject: [PATCH 58/61] fix: set fixed width for cards and carousel item in mobile views --- .../PopularCollectionsTable.blocks.tsx | 1 + .../CollectionImage/CollectionImageWithIcon.tsx | 2 +- .../FeaturedCollections/FeaturedCollectionNfts.tsx | 6 +++--- .../FeaturedCollections/FeaturedCollectionsItem.tsx | 12 ++++++------ 4 files changed, 11 insertions(+), 10 deletions(-) diff --git a/resources/js/Components/Collections/PopularCollectionsTable/PopularCollectionsTable.blocks.tsx b/resources/js/Components/Collections/PopularCollectionsTable/PopularCollectionsTable.blocks.tsx index 870a3c258..7b25a7929 100644 --- a/resources/js/Components/Collections/PopularCollectionsTable/PopularCollectionsTable.blocks.tsx +++ b/resources/js/Components/Collections/PopularCollectionsTable/PopularCollectionsTable.blocks.tsx @@ -27,6 +27,7 @@ export const PopularCollectionName = ({ chainId={collection.chainId} className="relative h-8 w-8 shrink-0 md:h-12 md:w-12" wrapperClassName="aspect-square" + networkClassName="left-5 top-5 " />
diff --git a/resources/js/Pages/Collections/Components/CollectionImage/CollectionImageWithIcon.tsx b/resources/js/Pages/Collections/Components/CollectionImage/CollectionImageWithIcon.tsx index e8cee68c0..7fe3c7308 100644 --- a/resources/js/Pages/Collections/Components/CollectionImage/CollectionImageWithIcon.tsx +++ b/resources/js/Pages/Collections/Components/CollectionImage/CollectionImageWithIcon.tsx @@ -26,7 +26,7 @@ export const CollectionImageWithIcon = ({
diff --git a/resources/js/Pages/Collections/Components/FeaturedCollections/FeaturedCollectionNfts.tsx b/resources/js/Pages/Collections/Components/FeaturedCollections/FeaturedCollectionNfts.tsx index 5445e3fb9..48096aded 100644 --- a/resources/js/Pages/Collections/Components/FeaturedCollections/FeaturedCollectionNfts.tsx +++ b/resources/js/Pages/Collections/Components/FeaturedCollections/FeaturedCollectionNfts.tsx @@ -4,13 +4,13 @@ import { CollectionNft } from "@/Pages/Collections/Components/CollectionNft"; export const FeaturedCollectionNfts = ({ nfts }: { nfts: App.Data.Gallery.GalleryNftData[] }): JSX.Element => { const defaultNftCardStyles = - "bg-white dark:bg-theme-dark-900 grid w-full h-full min-w-full lg:min-w-fit lg:w-52 lg:h-fit"; + "bg-white dark:bg-theme-dark-900 grid sm:w-full sm:h-full min-w-full lg:min-w-fit lg:w-52 lg:h-fit"; return ( -
+
{nfts.length > 1 && ( -
-
+
+
+
@@ -46,7 +46,7 @@ const FeaturedCollectionInfo = ({ data }: { data: App.Data.Collections.Collectio
-
+
{truncateDescription(data.description)}
@@ -82,7 +82,7 @@ export const FeaturedCollectionsItem = ({ data: App.Data.Collections.CollectionFeaturedData; }): JSX.Element => (
-
+
Date: Fri, 24 Nov 2023 10:18:18 -0500 Subject: [PATCH 59/61] fix: add border for rounded carousel item --- .../FeaturedCollections/FeaturedCollectionsCarousel.tsx | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/resources/js/Pages/Collections/Components/FeaturedCollections/FeaturedCollectionsCarousel.tsx b/resources/js/Pages/Collections/Components/FeaturedCollections/FeaturedCollectionsCarousel.tsx index 5e81cb94a..0182094f6 100644 --- a/resources/js/Pages/Collections/Components/FeaturedCollections/FeaturedCollectionsCarousel.tsx +++ b/resources/js/Pages/Collections/Components/FeaturedCollections/FeaturedCollectionsCarousel.tsx @@ -11,7 +11,7 @@ export const FeaturedCollectionsCarousel = ({ Date: Fri, 24 Nov 2023 10:23:58 -0500 Subject: [PATCH 60/61] fix: width for collection with just 1 nft --- .../FeaturedCollections/FeaturedCollectionNfts.tsx | 6 +++++- 1 file changed, 5 insertions(+), 1 deletion(-) diff --git a/resources/js/Pages/Collections/Components/FeaturedCollections/FeaturedCollectionNfts.tsx b/resources/js/Pages/Collections/Components/FeaturedCollections/FeaturedCollectionNfts.tsx index 48096aded..ef15f3dc2 100644 --- a/resources/js/Pages/Collections/Components/FeaturedCollections/FeaturedCollectionNfts.tsx +++ b/resources/js/Pages/Collections/Components/FeaturedCollections/FeaturedCollectionNfts.tsx @@ -7,7 +7,11 @@ export const FeaturedCollectionNfts = ({ nfts }: { nfts: App.Data.Gallery.Galler "bg-white dark:bg-theme-dark-900 grid sm:w-full sm:h-full min-w-full lg:min-w-fit lg:w-52 lg:h-fit"; return ( -
+
Date: Fri, 24 Nov 2023 10:49:34 -0500 Subject: [PATCH 61/61] fix: width for collections with just 1 nft --- .../FeaturedCollections/FeaturedCollectionNfts.tsx | 5 +++-- .../FeaturedCollections/FeaturedCollectionsItem.tsx | 6 +++--- 2 files changed, 6 insertions(+), 5 deletions(-) diff --git a/resources/js/Pages/Collections/Components/FeaturedCollections/FeaturedCollectionNfts.tsx b/resources/js/Pages/Collections/Components/FeaturedCollections/FeaturedCollectionNfts.tsx index ef15f3dc2..ae0e6f5e7 100644 --- a/resources/js/Pages/Collections/Components/FeaturedCollections/FeaturedCollectionNfts.tsx +++ b/resources/js/Pages/Collections/Components/FeaturedCollections/FeaturedCollectionNfts.tsx @@ -8,8 +8,9 @@ export const FeaturedCollectionNfts = ({ nfts }: { nfts: App.Data.Gallery.Galler return (
1, })} > +
@@ -46,7 +46,7 @@ const FeaturedCollectionInfo = ({ data }: { data: App.Data.Collections.Collectio
-
+
{truncateDescription(data.description)}
@@ -82,7 +82,7 @@ export const FeaturedCollectionsItem = ({ data: App.Data.Collections.CollectionFeaturedData; }): JSX.Element => (
-
+