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' import { User } from 'web/lib/firebase/users' import { Button } from './button' import { Claim, Manalink } from 'common/manalink' import { useState } from 'react' import { ShareIconButton } from './share-icon-button' import { DotsHorizontalIcon, XCircleIcon } from '@heroicons/react/solid' import { contractDetailsButtonClassName } from './contract/contract-info-dialog' import { useUserById } from 'web/hooks/use-user' export type ManalinkInfo = { expiresTime: number | null maxUses: number | null uses: number amount: number message: string } export function ManalinkCard(props: { user?: User | null | undefined className?: string info: ManalinkInfo isClaiming?: boolean onClaim?: () => void preview?: boolean }) { const { user, className, isClaiming, info, onClaim, preview = false } = props const { expiresTime, maxUses, uses, amount, message } = info return (
{maxUses != null ? `${maxUses - uses}/${maxUses} uses left` : `Unlimited use`}
{expiresTime != null ? `Expires ${fromNow(expiresTime)}` : 'Never expires'}
{formatMoney(amount)}
{message}
{!preview && (
)}
) } export function ManalinkCardFromView(props: { className?: string link: Manalink highlightedSlug: string }) { const { className, link, highlightedSlug } = props const { message, amount, expiresTime, maxUses, claims } = link const [details, setDetails] = useState(false) return ( <>
{details && ( )}
{maxUses != null ? `${maxUses - claims.length}/${maxUses} uses left` : `Unlimited use`}
{expiresTime != null ? `Expires ${fromNow(expiresTime)}` : 'Never expires'}
{formatMoney(amount)}
{message || '\n\n'}
) } function ClaimsList(props: { link: Manalink; className: string }) { const { link, className } = props return ( <>
Claimed by...
{link.claims.length > 0 ? ( <> {link.claims.map((claim) => ( ))} ) : (
No one has claimed this manalink yet! Share your manalink to start spreading the wealth.
)}
) } function Claim(props: { claim: Claim }) { const { claim } = props const who = useUserById(claim.toId) return (
{who?.name || 'Loading...'}
{fromNow(claim.claimedTime)}
) } function getManalinkGradient(amount: number) { if (amount < 20) { return 'from-slate-300 via-slate-500 to-slate-800' } else if (amount >= 20 && amount < 50) { return 'from-indigo-300 via-indigo-500 to-indigo-800' } else if (amount >= 50 && amount < 100) { return 'from-violet-300 via-violet-500 to-violet-800' } else if (amount >= 100) { return 'from-indigo-300 via-violet-500 to-rose-400' } }