Skip to content

Commit

Permalink
feat: Add Asset Utility (#2243)
Browse files Browse the repository at this point in the history
* feat: Add Wearable Utility

* fix: Rename WearableUtility to AssetUtility

* fix: CategoryBadge types
  • Loading branch information
LautaroPetaccio committed May 6, 2024
1 parent b6628f1 commit 654b3f5
Show file tree
Hide file tree
Showing 31 changed files with 222 additions and 231 deletions.
27 changes: 8 additions & 19 deletions webapp/package-lock.json

Some generated files are not rendered by default. Learn more about how customized files appear on GitHub.

4 changes: 2 additions & 2 deletions webapp/package.json
Original file line number Diff line number Diff line change
Expand Up @@ -7,7 +7,7 @@
"@0xsquid/squid-types": "^0.1.29",
"@covalenthq/client-sdk": "^0.6.4",
"@dcl/crypto": "^3.0.0",
"@dcl/schemas": "^11.4.0",
"@dcl/schemas": "^11.7.0",
"@dcl/single-sign-on-client": "^0.1.0",
"@dcl/ui-env": "^1.5.0",
"@ethersproject/providers": "^5.6.2",
Expand All @@ -24,7 +24,7 @@
"decentraland-crypto-fetch": "^1.0.3",
"decentraland-dapps": "^19.5.3",
"decentraland-transactions": "^2.6.0",
"decentraland-ui": "^5.17.1",
"decentraland-ui": "^5.21.0",
"ethers": "^5.6.8",
"graphql": "^14.7.0",
"history": "^4.10.1",
Expand Down
Original file line number Diff line number Diff line change
@@ -0,0 +1,9 @@
.main :global(.ui.sub.header) {
font-weight: 600;
}

.main .content {
font-size: 14px;
line-height: 26px;
letter-spacing: 0.2px;
}
22 changes: 22 additions & 0 deletions webapp/src/components/AssetPage/AssetUtility/AssetUtility.spec.tsx
Original file line number Diff line number Diff line change
@@ -0,0 +1,22 @@
import { t } from 'decentraland-dapps/dist/modules/translation'
import { renderWithProviders } from '../../../utils/test'
import { ASSET_UTILITY_CONTENT_DATA_TEST_ID, ASSET_UTILITY_HEADER_DATA_TEST_ID, AssetUtility } from './AssetUtility'
import { Props } from './AssetUtility.types'

const renderWearableUtility = (props: Partial<Props>) => renderWithProviders(<AssetUtility utility="someUtility" {...props} />)

describe('when rendering the wearable utility component', () => {
let renderedComponent: ReturnType<typeof renderWearableUtility>
let utility: string

beforeEach(() => {
utility = 'This is some utility!'
renderedComponent = renderWearableUtility({ utility })
})

it('should render the utility header and the wearable utility', () => {
const { getByTestId } = renderedComponent
expect(getByTestId(ASSET_UTILITY_HEADER_DATA_TEST_ID).textContent).toEqual(t('global.utility'))
expect(getByTestId(ASSET_UTILITY_CONTENT_DATA_TEST_ID).textContent).toEqual(utility)
})
})
20 changes: 20 additions & 0 deletions webapp/src/components/AssetPage/AssetUtility/AssetUtility.tsx
Original file line number Diff line number Diff line change
@@ -0,0 +1,20 @@
import { t } from 'decentraland-dapps/dist/modules/translation'
import { Header } from 'decentraland-ui/dist/components/Header/Header'
import { Props } from './AssetUtility.types'
import styles from './AssetUtility.module.css'

export const ASSET_UTILITY_HEADER_DATA_TEST_ID = 'asset-utility-header'
export const ASSET_UTILITY_CONTENT_DATA_TEST_ID = 'asset-utility-content'

export const AssetUtility = ({ utility }: Props) => {
return (
<div className={styles.main}>
<Header sub data-testid={ASSET_UTILITY_HEADER_DATA_TEST_ID}>
{t('global.utility')}
</Header>
<span data-testid={ASSET_UTILITY_CONTENT_DATA_TEST_ID} className={styles.content}>
{utility}
</span>
</div>
)
}
Original file line number Diff line number Diff line change
@@ -0,0 +1,3 @@
export type Props = {
utility: string
}
2 changes: 2 additions & 0 deletions webapp/src/components/AssetPage/AssetUtility/index.ts
Original file line number Diff line number Diff line change
@@ -0,0 +1,2 @@
export * from './AssetUtility'
export * from './AssetUtility.types'
12 changes: 9 additions & 3 deletions webapp/src/components/AssetPage/CategoryBadge/CategoryBadge.tsx
Original file line number Diff line number Diff line change
@@ -1,10 +1,10 @@
import React, { useMemo, useEffect } from 'react'
import { EmoteCategory } from '@dcl/schemas'
import { EmoteCategory, WearableCategory } from '@dcl/schemas'
import { t } from 'decentraland-dapps/dist/modules/translation/utils'
import { locations } from '../../../modules/routing/locations'
import { getSearchSection } from '../../../modules/routing/search'
import { BrowseOptions } from '../../../modules/routing/types'
import IconBadge from '../IconBadge'
import IconBadge from '../LinkedIconBadge'
import { Props } from './CategoryBadge.types'

const CategoryBadge = ({ category, assetType }: Props) => {
Expand All @@ -27,7 +27,13 @@ const CategoryBadge = ({ category, assetType }: Props) => {
}
}, [section, category, isEmote])

return <IconBadge icon={isEmote ? undefined : category} text={t(`${isEmote ? 'emote' : 'wearable'}.category.${category}`)} href={href} />
return (
<IconBadge
icon={isEmote ? undefined : (category as WearableCategory)}
text={t(`${isEmote ? 'emote' : 'wearable'}.category.${category}`)}
href={href}
/>
)
}

export default React.memo(CategoryBadge)
16 changes: 16 additions & 0 deletions webapp/src/components/AssetPage/EmoteDetail/EmoteDetail.module.css
Original file line number Diff line number Diff line change
Expand Up @@ -48,7 +48,23 @@
color: var(--secondary-text);
}

.EmoteDetail .attributesRow {
display: flex;
flex-direction: row;
gap: 10px;
word-wrap: break-word;
word-break: break-all;
}

.EmoteDetail .attributesColumn {
flex-basis: 100%;
}

@media (max-width: 768px) {
.EmoteDetail .attributesRow {
flex-direction: column;
}

.EmoteDetail .wearableInformationContainer {
flex-direction: column;
}
Expand Down
16 changes: 14 additions & 2 deletions webapp/src/components/AssetPage/EmoteDetail/EmoteDetail.tsx
Original file line number Diff line number Diff line change
Expand Up @@ -8,16 +8,18 @@ import { Section } from '../../../modules/vendor/decentraland'
import { AssetImage } from '../../AssetImage'
import CampaignBadge from '../../Campaign/CampaignBadge'
import TableContainer from '../../Table/TableContainer'
import { AssetUtility } from '../AssetUtility'
import { BidsTable } from '../BidsTable'
import { BuyNFTBox } from '../BuyNFTBox'
import Collection from '../Collection'
import { Description } from '../Description'
import IconBadge from '../IconBadge'
import IconBadge from '../LinkedIconBadge'
import { ListingsTable } from '../ListingsTable'
import OnBack from '../OnBack'
import { Owner } from '../Owner'
import Title from '../Title'
import { TransactionHistory } from '../TransactionHistory'
import { UtilityBadge } from '../UtilityBadge'
import { YourOffer } from '../YourOffer'
import { Props } from './EmoteDetail.types'
import styles from './EmoteDetail.module.css'
Expand Down Expand Up @@ -96,12 +98,22 @@ const EmoteDetail = ({ nft }: Props) => {
text={t(`emote.play_mode.${loop ? 'loop' : 'simple'}`)}
href={emoteBadgeHref}
/>
{nft.utility ? <UtilityBadge /> : null}
<CampaignBadge contract={nft.contractAddress} />
{emote.hasSound && <IconBadge icon="sound" text={t('emote.sound')} href={emoteSoundHref} />}
{emote.hasGeometry && <IconBadge icon="props" text={t('emote.props')} href={emoteGeometryHref} />}
</div>
</div>
<Description text={emote.description} />
<div className={styles.attributesRow}>
<div className={styles.attributesColumn}>
<Description text={emote.description} />
</div>
{nft.utility ? (
<div className={styles.attributesColumn}>
<AssetUtility utility={nft.utility} />
</div>
) : null}
</div>
<div className={styles.emoteOwnerAndCollectionContainer}>
<Owner asset={nft} />
<Collection asset={nft} />
Expand Down
142 changes: 0 additions & 142 deletions webapp/src/components/AssetPage/IconBadge/IconBadge.css

This file was deleted.

0 comments on commit 654b3f5

Please sign in to comment.