70 lines
1.9 KiB
TypeScript
70 lines
1.9 KiB
TypeScript
|
import clsx from 'clsx'
|
||
|
import { formatMoney } from 'common/util/format'
|
||
|
import { fromNow } from 'web/lib/util/time'
|
||
|
import { Col } from 'web/components/layout/col'
|
||
|
import { Row } from 'web/components/layout/row'
|
||
|
|
||
|
export type ManalinkInfo = {
|
||
|
expiresTime: number | null
|
||
|
maxUses: number | null
|
||
|
uses: number
|
||
|
amount: number
|
||
|
message: string
|
||
|
}
|
||
|
|
||
|
export function ManalinkCard(props: {
|
||
|
className?: string
|
||
|
info: ManalinkInfo
|
||
|
defaultMessage: string
|
||
|
isClaiming: boolean
|
||
|
onClaim?: () => void
|
||
|
}) {
|
||
|
const { className, defaultMessage, isClaiming, info, onClaim } = props
|
||
|
const { expiresTime, maxUses, uses, amount, message } = info
|
||
|
return (
|
||
|
<div
|
||
|
className={clsx(
|
||
|
className,
|
||
|
'min-h-20 group flex flex-col rounded-xl bg-gradient-to-br from-indigo-200 via-indigo-400 to-indigo-800 shadow-lg transition-all'
|
||
|
)}
|
||
|
>
|
||
|
<Col className="mx-4 mt-2 -mb-4 text-right text-sm text-gray-100">
|
||
|
<div>
|
||
|
{maxUses != null
|
||
|
? `${maxUses - uses}/${maxUses} uses left`
|
||
|
: `Unlimited use`}
|
||
|
</div>
|
||
|
<div>
|
||
|
{expiresTime != null
|
||
|
? `Expires ${fromNow(expiresTime)}`
|
||
|
: 'Never expires'}
|
||
|
</div>
|
||
|
</Col>
|
||
|
|
||
|
<img
|
||
|
className="mb-6 block self-center transition-all group-hover:rotate-12"
|
||
|
src="/logo-white.svg"
|
||
|
width={200}
|
||
|
height={200}
|
||
|
/>
|
||
|
<Row className="justify-end rounded-b-xl bg-white p-4">
|
||
|
<Col>
|
||
|
<div className="mb-1 text-xl text-indigo-500">
|
||
|
{formatMoney(amount)}
|
||
|
</div>
|
||
|
<div>{message || defaultMessage}</div>
|
||
|
</Col>
|
||
|
|
||
|
<div className="ml-auto">
|
||
|
<button
|
||
|
className={clsx('btn', isClaiming ? 'loading disabled' : '')}
|
||
|
onClick={onClaim}
|
||
|
>
|
||
|
{isClaiming ? '' : 'Claim'}
|
||
|
</button>
|
||
|
</div>
|
||
|
</Row>
|
||
|
</div>
|
||
|
)
|
||
|
}
|