81 lines
2.1 KiB
TypeScript
81 lines
2.1 KiB
TypeScript
import clsx from 'clsx'
|
|
import { useState } from 'react'
|
|
|
|
import { CurrencyDollarIcon } from '@heroicons/react/outline'
|
|
import { Contract } from 'common/contract'
|
|
import { COMMENT_BOUNTY_AMOUNT } from 'common/economy'
|
|
import { formatMoney } from 'common/util/format'
|
|
import { Tooltip } from 'web/components/tooltip'
|
|
import { CommentBountyDialog } from './comment-bounty-dialog'
|
|
|
|
export function BountiedContractBadge() {
|
|
return (
|
|
<span className="inline-flex items-center gap-1 rounded-full bg-indigo-300 px-3 py-0.5 text-sm font-medium text-white">
|
|
<CurrencyDollarIcon className={'h4 w-4'} /> Bounty
|
|
</span>
|
|
)
|
|
}
|
|
|
|
export function BountiedContractSmallBadge(props: {
|
|
contract: Contract
|
|
showAmount?: boolean
|
|
}) {
|
|
const { contract, showAmount } = props
|
|
const { openCommentBounties } = contract
|
|
|
|
const [open, setOpen] = useState(false)
|
|
|
|
if (!openCommentBounties && !showAmount) return <></>
|
|
|
|
const modal = (
|
|
<CommentBountyDialog open={open} setOpen={setOpen} contract={contract} />
|
|
)
|
|
|
|
const bountiesClosed =
|
|
contract.isResolved || (contract.closeTime ?? Infinity) < Date.now()
|
|
|
|
if (!openCommentBounties) {
|
|
if (bountiesClosed) return <></>
|
|
|
|
return (
|
|
<>
|
|
{modal}
|
|
<SmallBadge text="Add bounty" onClick={() => setOpen(true)} />
|
|
</>
|
|
)
|
|
}
|
|
|
|
const tooltip = `${contract.creatorName} may award ${formatMoney(
|
|
COMMENT_BOUNTY_AMOUNT
|
|
)} for good comments. ${formatMoney(
|
|
openCommentBounties
|
|
)} currently available.`
|
|
|
|
return (
|
|
<Tooltip text={tooltip} placement="bottom">
|
|
{modal}
|
|
<SmallBadge
|
|
text={`${formatMoney(openCommentBounties)} bounty`}
|
|
onClick={bountiesClosed ? undefined : () => setOpen(true)}
|
|
/>
|
|
</Tooltip>
|
|
)
|
|
}
|
|
|
|
function SmallBadge(props: { text: string; onClick?: () => void }) {
|
|
const { text, onClick } = props
|
|
|
|
return (
|
|
<button
|
|
onClick={onClick}
|
|
className={clsx(
|
|
'inline-flex items-center gap-1 whitespace-nowrap rounded-full bg-indigo-300 px-2 py-0.5 text-xs font-medium text-white',
|
|
!onClick && 'cursor-default'
|
|
)}
|
|
>
|
|
<CurrencyDollarIcon className={'h4 w-4'} />
|
|
{text}
|
|
</button>
|
|
)
|
|
}
|