Show badges on profile, soon on market page
This commit is contained in:
parent
f24600755b
commit
24e259bca1
|
@ -106,12 +106,13 @@ export const calculateBadgeRarity = (badge: Badge) => {
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
export const getBadgesByRarity = (user: User) => {
|
export const getBadgesByRarity = (user: User | null | undefined) => {
|
||||||
const rarities: { [key in rarities]: number } = {
|
const rarities: { [key in rarities]: number } = {
|
||||||
bronze: 0,
|
bronze: 0,
|
||||||
silver: 0,
|
silver: 0,
|
||||||
gold: 0,
|
gold: 0,
|
||||||
}
|
}
|
||||||
|
if (!user) return rarities
|
||||||
Object.values(user.achievements).map((value) => {
|
Object.values(user.achievements).map((value) => {
|
||||||
value.badges.map((badge) => {
|
value.badges.map((badge) => {
|
||||||
rarities[calculateBadgeRarity(badge)] =
|
rarities[calculateBadgeRarity(badge)] =
|
||||||
|
@ -120,7 +121,3 @@ export const getBadgesByRarity = (user: User) => {
|
||||||
})
|
})
|
||||||
return rarities
|
return rarities
|
||||||
}
|
}
|
||||||
|
|
||||||
export const goldClassName = 'text-amber-400'
|
|
||||||
export const silverClassName = 'text-gray-500'
|
|
||||||
export const bronzeClassName = 'text-amber-900'
|
|
||||||
|
|
62
web/components/badge-display.tsx
Normal file
62
web/components/badge-display.tsx
Normal file
|
@ -0,0 +1,62 @@
|
||||||
|
import { User } from 'common/user'
|
||||||
|
import { NextRouter } from 'next/router'
|
||||||
|
import { useEffect, useState } from 'react'
|
||||||
|
import { getBadgesByRarity } from 'common/badge'
|
||||||
|
import { Row } from 'web/components/layout/row'
|
||||||
|
import clsx from 'clsx'
|
||||||
|
import { BadgesModal } from 'web/components/profile/badges-modal'
|
||||||
|
|
||||||
|
export const goldClassName = 'text-amber-400'
|
||||||
|
export const silverClassName = 'text-gray-500'
|
||||||
|
export const bronzeClassName = 'text-amber-900'
|
||||||
|
|
||||||
|
export function BadgeDisplay(props: {
|
||||||
|
user: User | undefined | null
|
||||||
|
router?: NextRouter
|
||||||
|
}) {
|
||||||
|
const { user, router } = props
|
||||||
|
const [showBadgesModal, setShowBadgesModal] = useState(false)
|
||||||
|
|
||||||
|
useEffect(() => {
|
||||||
|
if (!router) return
|
||||||
|
const showBadgesModal = router.query['show'] === 'badges'
|
||||||
|
setShowBadgesModal(showBadgesModal)
|
||||||
|
}, [router])
|
||||||
|
// get number of badges of each rarity type
|
||||||
|
const badgesByRarity = getBadgesByRarity(user)
|
||||||
|
const badgesByRarityItems = Object.entries(badgesByRarity).map(
|
||||||
|
([rarity, numBadges]) => {
|
||||||
|
return (
|
||||||
|
<Row
|
||||||
|
key={rarity}
|
||||||
|
className={clsx(
|
||||||
|
'items-center gap-2',
|
||||||
|
rarity === 'bronze'
|
||||||
|
? bronzeClassName
|
||||||
|
: rarity === 'silver'
|
||||||
|
? silverClassName
|
||||||
|
: goldClassName
|
||||||
|
)}
|
||||||
|
>
|
||||||
|
<span className={clsx('-m-0.5 text-lg')}>•</span>
|
||||||
|
<span className="text-xs">{numBadges}</span>
|
||||||
|
</Row>
|
||||||
|
)
|
||||||
|
}
|
||||||
|
)
|
||||||
|
return (
|
||||||
|
<Row
|
||||||
|
className={'cursor-pointer gap-2'}
|
||||||
|
onClick={() => setShowBadgesModal(true)}
|
||||||
|
>
|
||||||
|
{badgesByRarityItems}
|
||||||
|
{user && (
|
||||||
|
<BadgesModal
|
||||||
|
isOpen={showBadgesModal}
|
||||||
|
setOpen={setShowBadgesModal}
|
||||||
|
user={user}
|
||||||
|
/>
|
||||||
|
)}
|
||||||
|
</Row>
|
||||||
|
)
|
||||||
|
}
|
|
@ -154,8 +154,8 @@ export function MarketSubheader(props: {
|
||||||
const { creatorName, creatorUsername, creatorId, creatorAvatarUrl } = contract
|
const { creatorName, creatorUsername, creatorId, creatorAvatarUrl } = contract
|
||||||
const { resolvedDate } = contractMetrics(contract)
|
const { resolvedDate } = contractMetrics(contract)
|
||||||
const user = useUser()
|
const user = useUser()
|
||||||
const correctResolutionPercentage =
|
const creator = useUserById(creatorId)
|
||||||
useUserById(creatorId)?.fractionResolvedCorrectly
|
const correctResolutionPercentage = creator?.fractionResolvedCorrectly
|
||||||
const isCreator = user?.id === creatorId
|
const isCreator = user?.id === creatorId
|
||||||
const isMobile = useIsMobile()
|
const isMobile = useIsMobile()
|
||||||
return (
|
return (
|
||||||
|
@ -178,12 +178,15 @@ export function MarketSubheader(props: {
|
||||||
{disabled ? (
|
{disabled ? (
|
||||||
creatorName
|
creatorName
|
||||||
) : (
|
) : (
|
||||||
<UserLink
|
<Row className={'gap-2'}>
|
||||||
className="my-auto whitespace-nowrap"
|
<UserLink
|
||||||
name={creatorName}
|
className="my-auto whitespace-nowrap"
|
||||||
username={creatorUsername}
|
name={creatorName}
|
||||||
short={isMobile}
|
username={creatorUsername}
|
||||||
/>
|
short={isMobile}
|
||||||
|
/>
|
||||||
|
{/*<BadgeDisplay user={creator} />*/}
|
||||||
|
</Row>
|
||||||
)}
|
)}
|
||||||
{correctResolutionPercentage != null &&
|
{correctResolutionPercentage != null &&
|
||||||
correctResolutionPercentage < BAD_CREATOR_THRESHOLD && (
|
correctResolutionPercentage < BAD_CREATOR_THRESHOLD && (
|
||||||
|
|
|
@ -4,13 +4,10 @@ import { PAST_BETS, User } from 'common/user'
|
||||||
import clsx from 'clsx'
|
import clsx from 'clsx'
|
||||||
import {
|
import {
|
||||||
Badge,
|
Badge,
|
||||||
bronzeClassName,
|
|
||||||
calculateBadgeRarity,
|
calculateBadgeRarity,
|
||||||
goldClassName,
|
|
||||||
MarketCreatorBadge,
|
MarketCreatorBadge,
|
||||||
ProvenCorrectBadge,
|
ProvenCorrectBadge,
|
||||||
rarities,
|
rarities,
|
||||||
silverClassName,
|
|
||||||
StreakerBadge,
|
StreakerBadge,
|
||||||
} from 'common/badge'
|
} from 'common/badge'
|
||||||
import { groupBy } from 'lodash'
|
import { groupBy } from 'lodash'
|
||||||
|
@ -18,6 +15,11 @@ import { Row } from 'web/components/layout/row'
|
||||||
import { SiteLink } from 'web/components/site-link'
|
import { SiteLink } from 'web/components/site-link'
|
||||||
import { contractPathWithoutContract } from 'web/lib/firebase/contracts'
|
import { contractPathWithoutContract } from 'web/lib/firebase/contracts'
|
||||||
import { Tooltip } from 'web/components/tooltip'
|
import { Tooltip } from 'web/components/tooltip'
|
||||||
|
import {
|
||||||
|
bronzeClassName,
|
||||||
|
goldClassName,
|
||||||
|
silverClassName,
|
||||||
|
} from 'web/components/badge-display'
|
||||||
|
|
||||||
export function BadgesModal(props: {
|
export function BadgesModal(props: {
|
||||||
isOpen: boolean
|
isOpen: boolean
|
||||||
|
|
|
@ -33,16 +33,10 @@ import { PortfolioValueSection } from './portfolio/portfolio-value-section'
|
||||||
import { formatMoney } from 'common/util/format'
|
import { formatMoney } from 'common/util/format'
|
||||||
|
|
||||||
import { LoansModal } from './profile/loans-modal'
|
import { LoansModal } from './profile/loans-modal'
|
||||||
import { BadgesModal } from 'web/components/profile/badges-modal'
|
|
||||||
import { copyToClipboard } from 'web/lib/util/copy'
|
import { copyToClipboard } from 'web/lib/util/copy'
|
||||||
import { track } from 'web/lib/service/analytics'
|
import { track } from 'web/lib/service/analytics'
|
||||||
import { DOMAIN } from 'common/envs/constants'
|
import { DOMAIN } from 'common/envs/constants'
|
||||||
import {
|
import { BadgeDisplay } from 'web/components/badge-display'
|
||||||
bronzeClassName,
|
|
||||||
getBadgesByRarity,
|
|
||||||
goldClassName,
|
|
||||||
silverClassName,
|
|
||||||
} from 'common/badge'
|
|
||||||
|
|
||||||
export function UserPage(props: { user: User }) {
|
export function UserPage(props: { user: User }) {
|
||||||
const { user } = props
|
const { user } = props
|
||||||
|
@ -334,49 +328,3 @@ export function ProfilePublicStats(props: { user: User; className?: string }) {
|
||||||
</Row>
|
</Row>
|
||||||
)
|
)
|
||||||
}
|
}
|
||||||
|
|
||||||
function BadgeDisplay(props: { user: User; router: NextRouter }) {
|
|
||||||
const { user, router } = props
|
|
||||||
const [showBadgesModal, setShowBadgesModal] = useState(false)
|
|
||||||
|
|
||||||
useEffect(() => {
|
|
||||||
const showBadgesModal = router.query['show'] === 'badges'
|
|
||||||
setShowBadgesModal(showBadgesModal)
|
|
||||||
// eslint-disable-next-line react-hooks/exhaustive-deps
|
|
||||||
}, [])
|
|
||||||
// get number of badges of each rarity type
|
|
||||||
const badgesByRarity = getBadgesByRarity(user)
|
|
||||||
const badgesByRarityItems = Object.entries(badgesByRarity).map(
|
|
||||||
([rarity, numBadges]) => {
|
|
||||||
return (
|
|
||||||
<Row
|
|
||||||
key={rarity}
|
|
||||||
className={clsx(
|
|
||||||
'items-center gap-2',
|
|
||||||
rarity === 'bronze'
|
|
||||||
? bronzeClassName
|
|
||||||
: rarity === 'silver'
|
|
||||||
? silverClassName
|
|
||||||
: goldClassName
|
|
||||||
)}
|
|
||||||
>
|
|
||||||
<span className={clsx('-m-0.5 text-lg')}>•</span>
|
|
||||||
<span className="text-xs">{numBadges}</span>
|
|
||||||
</Row>
|
|
||||||
)
|
|
||||||
}
|
|
||||||
)
|
|
||||||
return (
|
|
||||||
<Row
|
|
||||||
className={'cursor-pointer gap-2'}
|
|
||||||
onClick={() => setShowBadgesModal(true)}
|
|
||||||
>
|
|
||||||
{badgesByRarityItems}
|
|
||||||
<BadgesModal
|
|
||||||
isOpen={showBadgesModal}
|
|
||||||
setOpen={setShowBadgesModal}
|
|
||||||
user={user}
|
|
||||||
/>
|
|
||||||
</Row>
|
|
||||||
)
|
|
||||||
}
|
|
||||||
|
|
Loading…
Reference in New Issue
Block a user