manifold/web/components/onboarding/welcome.tsx
ingawei ae2e7dfe30
noobify welcome demo (#699)
* noobify welcome
* also beginning to add greyscale color scheme
2022-07-30 02:50:03 -05:00

174 lines
4.9 KiB
TypeScript
Raw Permalink Blame History

This file contains ambiguous Unicode characters

This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.

import { ChevronLeftIcon, ChevronRightIcon } from '@heroicons/react/solid'
import clsx from 'clsx'
import { useState } from 'react'
import { useUser } from 'web/hooks/use-user'
import { updateUser } from 'web/lib/firebase/users'
import { Col } from '../layout/col'
import { Modal } from '../layout/modal'
import { Row } from '../layout/row'
import { Title } from '../title'
export default function Welcome() {
const user = useUser()
const [open, setOpen] = useState(true)
const [page, setPage] = useState(0)
const TOTAL_PAGES = 4
function increasePage() {
if (page < TOTAL_PAGES - 1) {
setPage(page + 1)
}
}
function decreasePage() {
if (page > 0) {
setPage(page - 1)
}
}
async function setUserHasSeenWelcome() {
if (user) {
await updateUser(user.id, { ['shouldShowWelcome']: false })
}
}
if (!user || !user.shouldShowWelcome) {
return <></>
} else
return (
<Modal
open={open}
setOpen={(newOpen) => {
setUserHasSeenWelcome()
setOpen(newOpen)
}}
>
<Col className="h-[32rem] place-content-between rounded-md bg-white px-8 py-6 text-sm font-light md:h-[40rem] md:text-lg">
{page === 0 && <Page0 />}
{page === 1 && <Page1 />}
{page === 2 && <Page2 />}
{page === 3 && <Page3 />}
<Col>
<Row className="place-content-between">
<ChevronLeftIcon
className={clsx(
'h-10 w-10 text-gray-400 hover:text-gray-500',
page === 0 ? 'disabled invisible' : ''
)}
onClick={decreasePage}
/>
<PageIndicator page={page} totalpages={TOTAL_PAGES} />
<ChevronRightIcon
className={clsx(
'h-10 w-10 text-indigo-500 hover:text-indigo-600',
page === TOTAL_PAGES - 1 ? 'disabled invisible' : ''
)}
onClick={increasePage}
/>
</Row>
<u
className="self-center text-xs text-gray-500"
onClick={() => {
setOpen(false)
setUserHasSeenWelcome()
}}
>
I got the gist, exit welcome
</u>
</Col>
</Col>
</Modal>
)
}
function PageIndicator(props: { page: number; totalpages: number }) {
const { page, totalpages } = props
return (
<Row>
{[...Array(totalpages)].map((e, i) => (
<div
className={clsx(
'mx-1.5 my-auto h-1.5 w-1.5 rounded-full',
i === page ? 'bg-indigo-500' : 'bg-gray-300'
)}
/>
))}
</Row>
)
}
function Page0() {
return (
<>
<img
className="h-2/3 w-2/3 place-self-center object-contain"
src="/welcome/manipurple.png"
/>
<Title className="text-center" text="Welcome to Manifold Markets!" />
<p>
Manifold Markets is a place where anyone can ask a question about the
future.
</p>
<div className="mt-4">For example,</div>
<div className="mt-2 font-normal text-indigo-700">
Will Michelle Obama be the next president of the United States?
</div>
</>
)
}
function Page1() {
return (
<>
<p>
Your question becomes a prediction market that people can bet{' '}
<span className="font-normal text-indigo-700">mana (M$)</span> on.
</p>
<div className="mt-8 font-semibold">The core idea</div>
<div className="mt-2">
If people have to put their mana where their mouth is, youll get a
pretty accurate answer!
</div>
<video loop autoPlay className="my-4 h-full w-full">
<source src="/welcome/mana-example.mp4" type="video/mp4" />
Your browser does not support video
</video>
</>
)
}
function Page2() {
return (
<>
<p>
<span className="mt-4 font-normal text-indigo-700">Mana (M$)</span> is
the play money you bet with. You can also turn it into a real donation
to charity, at a 100:1 ratio.
</p>
<div className="mt-8 font-semibold">Example</div>
<p className="mt-2">
When you donate <span className="font-semibold">M$1000</span> to
Givewell, Manifold sends them{' '}
<span className="font-semibold">$10 USD</span>.
</p>
<video loop autoPlay className="my-4 h-full w-full">
<source src="/welcome/charity.mp4" type="video/mp4" />
Your browser does not support video
</video>
</>
)
}
function Page3() {
return (
<>
<img className="mx-auto object-contain" src="/welcome/treasure.png" />
<Title className="mx-auto" text="Let's start predicting!" />
<p className="mb-8">
As a thank you for signing up, weve sent you{' '}
<span className="font-normal text-indigo-700">M$1000 Mana</span>{' '}
</p>
</>
)
}