Redo add funds modal without daisy and actually use it (#963)
This commit is contained in:
parent
074a1fdde2
commit
59b128dbe7
|
@ -1,84 +0,0 @@
|
||||||
import clsx from 'clsx'
|
|
||||||
import { useEffect, useState } from 'react'
|
|
||||||
|
|
||||||
import { useUser } from 'web/hooks/use-user'
|
|
||||||
import { checkoutURL } from 'web/lib/service/stripe'
|
|
||||||
import { FundsSelector } from './yes-no-selector'
|
|
||||||
|
|
||||||
export function AddFundsButton(props: { className?: string }) {
|
|
||||||
const { className } = props
|
|
||||||
const user = useUser()
|
|
||||||
|
|
||||||
const [amountSelected, setAmountSelected] = useState<1000 | 2500 | 10000>(
|
|
||||||
2500
|
|
||||||
)
|
|
||||||
|
|
||||||
const location = useLocation()
|
|
||||||
|
|
||||||
return (
|
|
||||||
<>
|
|
||||||
<label
|
|
||||||
htmlFor="add-funds"
|
|
||||||
className={clsx(
|
|
||||||
'btn btn-xs btn-outline modal-button font-normal normal-case',
|
|
||||||
className
|
|
||||||
)}
|
|
||||||
>
|
|
||||||
Get M$
|
|
||||||
</label>
|
|
||||||
<input type="checkbox" id="add-funds" className="modal-toggle" />
|
|
||||||
|
|
||||||
<div className="modal">
|
|
||||||
<div className="modal-box">
|
|
||||||
<div className="mb-6 text-xl">Get Mana</div>
|
|
||||||
|
|
||||||
<div className="mb-6 text-gray-500">
|
|
||||||
Buy mana (M$) to trade in your favorite markets. <br /> (Not
|
|
||||||
redeemable for cash.)
|
|
||||||
</div>
|
|
||||||
|
|
||||||
<div className="mb-2 text-sm text-gray-500">Amount</div>
|
|
||||||
<FundsSelector
|
|
||||||
selected={amountSelected}
|
|
||||||
onSelect={setAmountSelected}
|
|
||||||
/>
|
|
||||||
|
|
||||||
<div className="mt-6">
|
|
||||||
<div className="mb-1 text-sm text-gray-500">Price USD</div>
|
|
||||||
<div className="text-xl">
|
|
||||||
${Math.round(amountSelected / 100)}.00
|
|
||||||
</div>
|
|
||||||
</div>
|
|
||||||
|
|
||||||
<div className="modal-action">
|
|
||||||
<label htmlFor="add-funds" className={clsx('btn btn-ghost')}>
|
|
||||||
Back
|
|
||||||
</label>
|
|
||||||
|
|
||||||
<form
|
|
||||||
action={checkoutURL(user?.id || '', amountSelected, location)}
|
|
||||||
method="POST"
|
|
||||||
>
|
|
||||||
<button
|
|
||||||
type="submit"
|
|
||||||
className="btn btn-primary bg-gradient-to-r from-indigo-500 to-blue-500 px-10 font-medium hover:from-indigo-600 hover:to-blue-600"
|
|
||||||
>
|
|
||||||
Checkout
|
|
||||||
</button>
|
|
||||||
</form>
|
|
||||||
</div>
|
|
||||||
</div>
|
|
||||||
</div>
|
|
||||||
</>
|
|
||||||
)
|
|
||||||
}
|
|
||||||
|
|
||||||
// needed in next js
|
|
||||||
// window not loaded at runtime
|
|
||||||
const useLocation = () => {
|
|
||||||
const [href, setHref] = useState('')
|
|
||||||
useEffect(() => {
|
|
||||||
setHref(window.location.href)
|
|
||||||
}, [])
|
|
||||||
return href
|
|
||||||
}
|
|
58
web/components/add-funds-modal.tsx
Normal file
58
web/components/add-funds-modal.tsx
Normal file
|
@ -0,0 +1,58 @@
|
||||||
|
import { manaToUSD } from 'common/util/format'
|
||||||
|
import { useState } from 'react'
|
||||||
|
import { useUser } from 'web/hooks/use-user'
|
||||||
|
import { checkoutURL } from 'web/lib/service/stripe'
|
||||||
|
import { Button } from './button'
|
||||||
|
import { Modal } from './layout/modal'
|
||||||
|
import { FundsSelector } from './yes-no-selector'
|
||||||
|
|
||||||
|
export function AddFundsModal(props: {
|
||||||
|
open: boolean
|
||||||
|
setOpen(open: boolean): void
|
||||||
|
}) {
|
||||||
|
const { open, setOpen } = props
|
||||||
|
|
||||||
|
const user = useUser()
|
||||||
|
|
||||||
|
const [amountSelected, setAmountSelected] = useState<1000 | 2500 | 10000>(
|
||||||
|
2500
|
||||||
|
)
|
||||||
|
|
||||||
|
return (
|
||||||
|
<Modal open={open} setOpen={setOpen} className="rounded-md bg-white p-8">
|
||||||
|
<div className="mb-6 text-xl text-indigo-700">Get Mana</div>
|
||||||
|
|
||||||
|
<div className="mb-6 text-gray-700">
|
||||||
|
Buy mana (M$) to trade in your favorite markets. <br /> (Not redeemable
|
||||||
|
for cash.)
|
||||||
|
</div>
|
||||||
|
|
||||||
|
<div className="mb-2 text-sm text-gray-500">Amount</div>
|
||||||
|
<FundsSelector selected={amountSelected} onSelect={setAmountSelected} />
|
||||||
|
|
||||||
|
<div className="mt-6">
|
||||||
|
<div className="mb-1 text-sm text-gray-500">Price USD</div>
|
||||||
|
<div className="text-xl">{manaToUSD(amountSelected)}</div>
|
||||||
|
</div>
|
||||||
|
|
||||||
|
<div className="modal-action">
|
||||||
|
<Button color="gray-white" onClick={() => setOpen(false)}>
|
||||||
|
Back
|
||||||
|
</Button>
|
||||||
|
|
||||||
|
<form
|
||||||
|
action={checkoutURL(
|
||||||
|
user?.id || '',
|
||||||
|
amountSelected,
|
||||||
|
window.location.href
|
||||||
|
)}
|
||||||
|
method="POST"
|
||||||
|
>
|
||||||
|
<Button type="submit" color="gradient">
|
||||||
|
Checkout
|
||||||
|
</Button>
|
||||||
|
</form>
|
||||||
|
</div>
|
||||||
|
</Modal>
|
||||||
|
)
|
||||||
|
}
|
|
@ -1,11 +1,11 @@
|
||||||
import clsx from 'clsx'
|
import clsx from 'clsx'
|
||||||
import React from 'react'
|
import React, { useState } from 'react'
|
||||||
import { useUser } from 'web/hooks/use-user'
|
import { useUser } from 'web/hooks/use-user'
|
||||||
import { formatMoney } from 'common/util/format'
|
import { formatMoney } from 'common/util/format'
|
||||||
import { Col } from './layout/col'
|
import { Col } from './layout/col'
|
||||||
import { SiteLink } from './site-link'
|
|
||||||
import { ENV_CONFIG } from 'common/envs/constants'
|
import { ENV_CONFIG } from 'common/envs/constants'
|
||||||
import { Row } from './layout/row'
|
import { Row } from './layout/row'
|
||||||
|
import { AddFundsModal } from './add-funds-modal'
|
||||||
|
|
||||||
export function AmountInput(props: {
|
export function AmountInput(props: {
|
||||||
amount: number | undefined
|
amount: number | undefined
|
||||||
|
@ -35,6 +35,8 @@ export function AmountInput(props: {
|
||||||
onChange(isInvalid ? undefined : amount)
|
onChange(isInvalid ? undefined : amount)
|
||||||
}
|
}
|
||||||
|
|
||||||
|
const [addFundsModalOpen, setAddFundsModalOpen] = useState(false)
|
||||||
|
|
||||||
return (
|
return (
|
||||||
<>
|
<>
|
||||||
<Col className={className}>
|
<Col className={className}>
|
||||||
|
@ -66,9 +68,16 @@ export function AmountInput(props: {
|
||||||
{error === 'Insufficient balance' ? (
|
{error === 'Insufficient balance' ? (
|
||||||
<>
|
<>
|
||||||
Not enough funds.
|
Not enough funds.
|
||||||
<span className="ml-1 text-indigo-500">
|
<button
|
||||||
<SiteLink href="/add-funds">Buy more?</SiteLink>
|
className="ml-1 text-indigo-500 hover:underline hover:decoration-indigo-400"
|
||||||
</span>
|
onClick={() => setAddFundsModalOpen(true)}
|
||||||
|
>
|
||||||
|
Buy more?
|
||||||
|
</button>
|
||||||
|
<AddFundsModal
|
||||||
|
open={addFundsModalOpen}
|
||||||
|
setOpen={setAddFundsModalOpen}
|
||||||
|
/>
|
||||||
</>
|
</>
|
||||||
) : (
|
) : (
|
||||||
error
|
error
|
||||||
|
|
|
@ -36,6 +36,8 @@ import { MultipleChoiceAnswers } from 'web/components/answers/multiple-choice-an
|
||||||
import { MINUTE_MS } from 'common/util/time'
|
import { MINUTE_MS } from 'common/util/time'
|
||||||
import { ExternalLinkIcon } from '@heroicons/react/outline'
|
import { ExternalLinkIcon } from '@heroicons/react/outline'
|
||||||
import { SiteLink } from 'web/components/site-link'
|
import { SiteLink } from 'web/components/site-link'
|
||||||
|
import { Button } from 'web/components/button'
|
||||||
|
import { AddFundsModal } from 'web/components/add-funds-modal'
|
||||||
|
|
||||||
export const getServerSideProps = redirectIfLoggedOut('/', async (_, creds) => {
|
export const getServerSideProps = redirectIfLoggedOut('/', async (_, creds) => {
|
||||||
return { props: { auth: await getUserAndPrivateUser(creds.uid) } }
|
return { props: { auth: await getUserAndPrivateUser(creds.uid) } }
|
||||||
|
@ -168,6 +170,8 @@ export function NewContract(props: {
|
||||||
const [showGroupSelector, setShowGroupSelector] = useState(true)
|
const [showGroupSelector, setShowGroupSelector] = useState(true)
|
||||||
const [visibility, setVisibility] = useState<visibility>('public')
|
const [visibility, setVisibility] = useState<visibility>('public')
|
||||||
|
|
||||||
|
const [fundsModalOpen, setFundsModalOpen] = useState(false)
|
||||||
|
|
||||||
const closeTime = closeDate
|
const closeTime = closeDate
|
||||||
? dayjs(`${closeDate}T${closeHoursMinutes}`).valueOf()
|
? dayjs(`${closeDate}T${closeHoursMinutes}`).valueOf()
|
||||||
: undefined
|
: undefined
|
||||||
|
@ -507,12 +511,17 @@ export function NewContract(props: {
|
||||||
{ante > balance && !deservesFreeMarket && (
|
{ante > balance && !deservesFreeMarket && (
|
||||||
<div className="mb-2 mt-2 mr-auto self-center whitespace-nowrap text-xs font-medium tracking-wide">
|
<div className="mb-2 mt-2 mr-auto self-center whitespace-nowrap text-xs font-medium tracking-wide">
|
||||||
<span className="mr-2 text-red-500">Insufficient balance</span>
|
<span className="mr-2 text-red-500">Insufficient balance</span>
|
||||||
<button
|
<Button
|
||||||
className="btn btn-xs btn-primary"
|
size="xs"
|
||||||
onClick={() => (window.location.href = '/add-funds')}
|
color="green"
|
||||||
|
onClick={() => setFundsModalOpen(true)}
|
||||||
>
|
>
|
||||||
Get M$
|
Get M$
|
||||||
</button>
|
</Button>
|
||||||
|
<AddFundsModal
|
||||||
|
open={fundsModalOpen}
|
||||||
|
setOpen={setFundsModalOpen}
|
||||||
|
/>
|
||||||
</div>
|
</div>
|
||||||
)}
|
)}
|
||||||
</div>
|
</div>
|
||||||
|
|
|
@ -1,11 +1,9 @@
|
||||||
import { RefreshIcon } from '@heroicons/react/outline'
|
import { RefreshIcon } from '@heroicons/react/outline'
|
||||||
import { PrivateUser, User } from 'common/user'
|
import { PrivateUser, User } from 'common/user'
|
||||||
import { cleanDisplayName, cleanUsername } from 'common/util/clean-username'
|
import { cleanDisplayName, cleanUsername } from 'common/util/clean-username'
|
||||||
import { formatMoney } from 'common/util/format'
|
|
||||||
import Link from 'next/link'
|
import Link from 'next/link'
|
||||||
import React, { useState } from 'react'
|
import React, { useState } from 'react'
|
||||||
import Textarea from 'react-expanding-textarea'
|
import Textarea from 'react-expanding-textarea'
|
||||||
import { AddFundsButton } from 'web/components/add-funds-button'
|
|
||||||
import { ConfirmationButton } from 'web/components/confirmation-button'
|
import { ConfirmationButton } from 'web/components/confirmation-button'
|
||||||
import { Col } from 'web/components/layout/col'
|
import { Col } from 'web/components/layout/col'
|
||||||
import { Row } from 'web/components/layout/row'
|
import { Row } from 'web/components/layout/row'
|
||||||
|
@ -198,14 +196,6 @@ export default function ProfilePage(props: {
|
||||||
</div>
|
</div>
|
||||||
</div>
|
</div>
|
||||||
|
|
||||||
<div>
|
|
||||||
<label className="label">Balance</label>
|
|
||||||
<Row className="ml-1 items-start gap-4 text-gray-500">
|
|
||||||
{formatMoney(user.balance)}
|
|
||||||
<AddFundsButton />
|
|
||||||
</Row>
|
|
||||||
</div>
|
|
||||||
|
|
||||||
<div>
|
<div>
|
||||||
<label className="label">API key</label>
|
<label className="label">API key</label>
|
||||||
<div className="input-group w-full">
|
<div className="input-group w-full">
|
||||||
|
|
Loading…
Reference in New Issue
Block a user