mango-v4-ui/components/TopBar.tsx

235 lines
8.7 KiB
TypeScript
Raw Normal View History

import { useCallback, useEffect, useState } from 'react'
2022-11-19 10:33:12 -08:00
import {
ArrowLeftIcon,
ArrowRightIcon,
CheckCircleIcon,
DocumentDuplicateIcon,
2022-11-19 10:33:12 -08:00
ExclamationTriangleIcon,
EyeIcon,
2022-11-19 10:33:12 -08:00
} from '@heroicons/react/20/solid'
2022-11-15 20:12:51 -08:00
import { useWallet } from '@solana/wallet-adapter-react'
import { useTranslation } from 'next-i18next'
import WalletIcon from './icons/WalletIcon'
2023-05-14 21:30:00 -07:00
import Button from './shared/Button'
import ConnectedMenu from './wallet/ConnectedMenu'
import ConnectWalletButton from './wallet/ConnectWalletButton'
import CreateAccountModal from './modals/CreateAccountModal'
2022-10-25 02:42:51 -07:00
import { useRouter } from 'next/router'
2023-08-06 22:57:02 -07:00
// import SolanaTps from './SolanaTps'
2022-11-18 09:09:39 -08:00
import useMangoAccount from 'hooks/useMangoAccount'
2022-11-19 10:33:12 -08:00
import useOnlineStatus from 'hooks/useOnlineStatus'
2022-12-15 20:04:26 -08:00
import { abbreviateAddress } from 'utils/formatting'
import DepositWithdrawModal from './modals/DepositWithdrawModal'
2022-12-21 03:07:17 -08:00
import { useViewport } from 'hooks/useViewport'
import { breakpoints } from 'utils/theme'
import AccountsButton from './AccountsButton'
import useUnownedAccount from 'hooks/useUnownedAccount'
import NotificationsButton from './notifications/NotificationsButton'
import Tooltip from './shared/Tooltip'
import { copyToClipboard } from 'utils'
2023-06-06 22:00:59 -07:00
import mangoStore from '@store/mangoStore'
import UserSetupModal from './modals/UserSetupModal'
import { IS_ONBOARDED_KEY } from 'utils/constants'
import useLocalStorageState from 'hooks/useLocalStorageState'
2023-07-21 07:28:26 -07:00
const set = mangoStore.getState().set
const TopBar = () => {
const { t } = useTranslation('common')
2023-08-01 14:38:08 -07:00
const { mangoAccount, mangoAccountAddress } = useMangoAccount()
2022-11-15 20:12:51 -08:00
const { connected } = useWallet()
2023-06-06 22:00:59 -07:00
const themeData = mangoStore((s) => s.themeData)
const [action, setAction] = useState<'deposit' | 'withdraw'>('deposit')
const [copied, setCopied] = useState('')
const [showDepositWithdrawModal, setShowDepositWithdrawModal] =
useState(false)
const [showCreateAccountModal, setShowCreateAccountModal] = useState(false)
2022-11-19 10:33:12 -08:00
const isOnline = useOnlineStatus()
2022-10-25 02:42:51 -07:00
const router = useRouter()
const { query } = router
2022-12-21 03:07:17 -08:00
const { width } = useViewport()
const isMobile = width ? width < breakpoints.sm : false
const { isUnownedAccount } = useUnownedAccount()
2023-07-21 07:28:26 -07:00
const showUserSetup = mangoStore((s) => s.showUserSetup)
const [, setIsOnboarded] = useLocalStorageState(IS_ONBOARDED_KEY)
2022-11-11 03:24:24 -08:00
const handleCloseSetup = useCallback(() => {
2023-07-21 07:28:26 -07:00
set((s) => {
s.showUserSetup = false
})
2022-11-11 03:24:24 -08:00
setIsOnboarded(true)
2023-07-21 07:28:26 -07:00
}, [setIsOnboarded])
2022-11-11 03:24:24 -08:00
const handleShowSetup = useCallback(() => {
2023-07-21 07:28:26 -07:00
set((s) => {
s.showUserSetup = true
})
}, [])
const handleDepositWithdrawModal = (action: 'deposit' | 'withdraw') => {
if (!connected || mangoAccount) {
setAction(action)
setShowDepositWithdrawModal(true)
} else {
setShowCreateAccountModal(true)
}
}
const handleCopy = (text: string) => {
copyToClipboard(text)
setCopied(text)
}
useEffect(() => {
setTimeout(() => setCopied(''), 2000)
}, [copied])
return (
2023-05-14 21:30:00 -07:00
<div
2023-08-09 20:31:47 -07:00
className={`flex h-16 items-center justify-between border-b border-th-bkg-3 bg-th-bkg-1 bg-contain`}
2023-06-06 22:00:59 -07:00
style={{ backgroundImage: `url(${themeData.topTilePath})` }}
2023-05-14 21:30:00 -07:00
>
2023-05-29 22:30:34 -07:00
<div className="flex w-full items-center justify-between md:space-x-4">
2022-10-25 02:42:51 -07:00
<span className="mb-0 flex items-center">
2023-04-11 20:38:21 -07:00
{query.token || query.market ? (
2023-05-14 21:30:00 -07:00
<button
className="mr-4 flex h-16 w-16 items-center justify-center border-r border-th-bkg-3 focus-visible:bg-th-bkg-3 md:hover:bg-th-bkg-2"
onClick={() => router.back()}
>
<ArrowLeftIcon className="h-5 w-5" />
</button>
2022-10-25 02:42:51 -07:00
) : null}
2023-08-06 22:57:02 -07:00
{/* {connected ? (
<div className="hidden h-[63px] bg-th-bkg-1 md:flex md:items-center md:pl-6 md:pr-8">
2022-11-19 02:03:39 -08:00
<SolanaTps />
</div>
2023-08-06 22:57:02 -07:00
) : null} */}
<div className="flex h-[63px] w-16 items-center justify-center bg-th-bkg-1 md:hidden">
<img
className="h-9 w-9 flex-shrink-0"
src={themeData.logoPath}
alt="logo"
/>
</div>
{!connected ? (
mangoAccount ? (
2023-06-06 05:52:33 -07:00
<span className="hidden items-center md:flex md:pl-6">
<EyeIcon className="h-5 w-5 text-th-fgd-3" />
<span className="ml-2">
{t('unowned-helper', {
accountPk: '',
})}
</span>
:
<Tooltip
content={
<>
<p>{t('account')}</p>
<button
className="mb-2 flex items-center"
onClick={() =>
handleCopy(mangoAccount.publicKey.toString())
}
>
<p className="mr-1.5 font-mono text-th-fgd-1">
{abbreviateAddress(mangoAccount.publicKey)}
</p>
{copied === mangoAccount.publicKey.toString() ? (
<CheckCircleIcon className="h-4 w-4 flex-shrink-0 text-th-success" />
) : (
<DocumentDuplicateIcon className="h-4 w-4 flex-shrink-0" />
)}
</button>
<p>{t('wallet')}</p>
<button
className="flex items-center"
onClick={() =>
handleCopy(mangoAccount.owner.toString())
}
>
<p className="mr-1.5 font-mono text-th-fgd-1">
{abbreviateAddress(mangoAccount.owner)}
</p>
{copied === mangoAccount.owner.toString() ? (
<CheckCircleIcon className="h-4 w-4 flex-shrink-0 text-th-success" />
) : (
<DocumentDuplicateIcon className="h-4 w-4 flex-shrink-0" />
)}
</button>
</>
}
>
<span className="tooltip-underline ml-1 font-bold text-th-fgd-1">
{mangoAccount.name
? mangoAccount.name
: abbreviateAddress(mangoAccount.publicKey)}
</span>
</Tooltip>
</span>
) : (
2023-06-06 05:52:33 -07:00
<span className="hidden items-center md:flex md:pl-6">
<WalletIcon className="h-5 w-5 text-th-fgd-3" />
<span className="ml-2">{t('connect-helper')}</span>
<ArrowRightIcon className="sideways-bounce ml-2 h-5 w-5 text-th-fgd-1" />
</span>
)
) : null}
</span>
2022-11-19 10:33:12 -08:00
{!isOnline ? (
<div className="absolute left-1/2 top-3 z-10 flex h-10 w-max -translate-x-1/2 items-center rounded-full bg-th-down px-4 py-2 md:top-8">
2023-05-29 22:30:34 -07:00
<ExclamationTriangleIcon className="h-5 w-5 flex-shrink-0 text-th-fgd-1" />
2022-12-16 03:26:42 -08:00
<p className="ml-2 text-th-fgd-1">
Your connection appears to be offline
</p>
2022-11-19 10:33:12 -08:00
</div>
) : null}
2022-12-16 03:26:42 -08:00
<div className="flex items-center">
2023-05-29 22:21:31 -07:00
{isUnownedAccount || (!connected && isMobile) ? null : isMobile ? (
<button
onClick={() => handleDepositWithdrawModal('deposit')}
className="h-[63px] border-l border-th-bkg-3 bg-th-bkg-1 px-4 text-center font-display text-th-fgd-1"
2023-05-29 22:21:31 -07:00
>{`${t('deposit')} / ${t('withdraw')}`}</button>
) : (
2022-12-21 03:07:17 -08:00
<Button
onClick={() => handleDepositWithdrawModal('deposit')}
secondary
2023-05-29 22:21:31 -07:00
className="mr-4"
2022-12-21 03:07:17 -08:00
>{`${t('deposit')} / ${t('withdraw')}`}</Button>
)}
2022-12-16 03:26:42 -08:00
{connected ? (
<div className="flex h-[63px] items-center bg-th-bkg-1">
2023-08-01 14:38:08 -07:00
{mangoAccountAddress && <NotificationsButton />}
<AccountsButton />
2022-12-16 03:26:42 -08:00
<ConnectedMenu />
</div>
) : (
<ConnectWalletButton handleShowSetup={handleShowSetup} />
2022-12-16 03:26:42 -08:00
)}
</div>
</div>
{showDepositWithdrawModal ? (
<DepositWithdrawModal
action={action}
isOpen={showDepositWithdrawModal}
onClose={() => setShowDepositWithdrawModal(false)}
/>
) : null}
2022-12-20 17:14:35 -08:00
{showUserSetup ? (
<UserSetupModal isOpen={showUserSetup} onClose={handleCloseSetup} />
) : null}
{showCreateAccountModal ? (
<CreateAccountModal
isOpen={showCreateAccountModal}
onClose={() => setShowCreateAccountModal(false)}
/>
) : null}
2023-05-14 21:30:00 -07:00
</div>
)
}
export default TopBar