diff --git a/apis/coingecko.ts b/apis/coingecko.ts index bc68d8e0..6821a62b 100644 --- a/apis/coingecko.ts +++ b/apis/coingecko.ts @@ -3,41 +3,45 @@ export const fetchChartData = async ( quoteTokenId: string, daysToShow: number ) => { - const [inputResponse, outputResponse] = await Promise.all([ - fetch( - `https://api.coingecko.com/api/v3/coins/${baseTokenId}/ohlc?vs_currency=usd&days=${daysToShow}` - ), - fetch( - `https://api.coingecko.com/api/v3/coins/${quoteTokenId}/ohlc?vs_currency=usd&days=${daysToShow}` - ), - ]) + try { + const [inputResponse, outputResponse] = await Promise.all([ + fetch( + `https://api.coingecko.com/api/v3/coins/${baseTokenId}/ohlc?vs_currency=usd&days=${daysToShow}` + ), + fetch( + `https://api.coingecko.com/api/v3/coins/${quoteTokenId}/ohlc?vs_currency=usd&days=${daysToShow}` + ), + ]) - const [inputData, outputData] = await Promise.all([ - inputResponse.json(), - outputResponse.json(), - ]) + const [inputData, outputData] = await Promise.all([ + inputResponse.json(), + outputResponse.json(), + ]) - let data: any[] = [] - if (Array.isArray(inputData)) { - data = data.concat(inputData) - } - if (Array.isArray(outputData)) { - data = data.concat(outputData) - } - - const formattedData = data.reduce((a, c) => { - const found = a.find((price: any) => price.time === c[0]) - if (found) { - if (['usd-coin', 'tether'].includes(quoteTokenId)) { - found.price = found.inputPrice / c[4] - } else { - found.price = c[4] / found.inputPrice - } - } else { - a.push({ time: c[0], inputPrice: c[4] }) + let data: any[] = [] + if (Array.isArray(inputData)) { + data = data.concat(inputData) } - return a - }, []) - formattedData[formattedData.length - 1].time = Date.now() - return formattedData.filter((d: any) => d.price) + if (Array.isArray(outputData)) { + data = data.concat(outputData) + } + + const formattedData = data.reduce((a, c) => { + const found = a.find((price: any) => price.time === c[0]) + if (found) { + if (['usd-coin', 'tether'].includes(quoteTokenId)) { + found.price = found.inputPrice / c[4] + } else { + found.price = c[4] / found.inputPrice + } + } else { + a.push({ time: c[0], inputPrice: c[4] }) + } + return a + }, []) + formattedData[formattedData.length - 1].time = Date.now() + return formattedData.filter((d: any) => d.price) + } catch { + return [] + } } diff --git a/components/TopBar.tsx b/components/TopBar.tsx index 33582eab..00d87931 100644 --- a/components/TopBar.tsx +++ b/components/TopBar.tsx @@ -9,7 +9,6 @@ import ConnectedMenu from './wallet/ConnectedMenu' import { ConnectWalletButton } from './wallet/ConnectWalletButton' import { IS_ONBOARDED_KEY } from '../utils/constants' import useLocalStorageState from '../hooks/useLocalStorageState' -import UserSetupModal from './modals/UserSetupModal' import CreateAccountModal from './modals/CreateAccountModal' import MangoAccountsListModal from './modals/MangoAccountsListModal' import { useRouter } from 'next/router' @@ -19,19 +18,20 @@ const TopBar = () => { const { t } = useTranslation('common') const mangoAccount = mangoStore((s) => s.mangoAccount.current) const connected = mangoStore((s) => s.connected) - const [isOnboarded] = useLocalStorageState(IS_ONBOARDED_KEY) - const [showUserSetupModal, setShowUserSetupModal] = useState(false) + const [isOnboarded, setIsOnboarded] = useLocalStorageState(IS_ONBOARDED_KEY) + const [showUserSetup, setShowUserSetup] = useState(false) const [showCreateAccountModal, setShowCreateAccountModal] = useState(false) const [showMangoAccountsModal, setShowMangoAccountsModal] = useState(false) const router = useRouter() const { query } = router - const handleCloseModal = useCallback(() => { - setShowUserSetupModal(false) + const handleCloseSetup = useCallback(() => { + setShowUserSetup(false) + setIsOnboarded(true) }, []) - const handleShowModal = useCallback(() => { - setShowUserSetupModal(true) + const handleShowSetup = useCallback(() => { + setShowUserSetup(true) }, []) const handleShowAccounts = useCallback(() => { @@ -95,7 +95,7 @@ const TopBar = () => { ) : ( ))} - - )} + ) : null} void }) => { leaveFrom="opacity-100" leaveTo="opacity-0" > - {loadingAccount ? ( -
- -
- ) : ( + {showSetupStep === 2 ? (
-

Create Your Account

+

+ Create Your Account +

You need a Mango Account to get started.

@@ -337,14 +365,18 @@ const UserSetup = ({ onClose }: { onClose: () => void }) => {
@@ -354,7 +386,7 @@ const UserSetup = ({ onClose }: { onClose: () => void }) => {
- )} + ) : null}
void }) => { leaveFrom="opacity-100" leaveTo="opacity-0" > - {submitDeposit ? ( -
- -
- ) : ( -
-
-

Fund Your Account

- 0} - enter="transition ease-in duration-300" - enterFrom="opacity-0" - enterTo="opacity-100" - leave="transition ease-out duration-300" - leaveFrom="opacity-100" - leaveTo="opacity-0" - > -
-
-
- - ) => - setDepositAmount(e.target.value) - } - /> -
- handleSizePercentage(p)} - values={['10', '25', '50', '75', '100']} - unit="%" - /> -
-
-
- -
+

Fund Your Account

+ 0} + enter="transition ease-in duration-300" + enterFrom="opacity-0" + enterTo="opacity-100" + leave="transition ease-out duration-300" + leaveFrom="opacity-100" + leaveTo="opacity-0" + > +
+
+
+ Skip for now -
+
+ +
+
+
+

{t('token')}

+
+
+

{t('deposit-rate')}

+
+
+

+ {t('wallet-balance')} +

+
+
+ +
+
- )} + ) : null}
-
-
- onClose()}> - - -
-
- next -
+
diff --git a/components/account/ActionTokenItem.tsx b/components/account/ActionTokenItem.tsx index 609deabe..68c46d98 100644 --- a/components/account/ActionTokenItem.tsx +++ b/components/account/ActionTokenItem.tsx @@ -32,7 +32,7 @@ const ActionTokenItem = ({ return ( - - - {connected && mangoAccountLoading ? ( -
- -
- ) : ( -
-
-
-

Connect Wallet

-
-

Choose Wallet

-
- {wallets?.map((w) => ( - - ))} -
-
- -
- )} -
- - {loadingAccount ? ( -
- -
- ) : ( -
-
-
-

Create Account

-

You need a Mango Account to get started.

-
-
-
-
-
- -
- - - - Skip for now - - -
-
-
- )} -
- - {submitDeposit ? ( -
- -
- ) : ( -
-
-

Fund Your Account

- -
-
-
- - ) => - setDepositAmount(e.target.value) - } - /> -
- handleSizePercentage(p)} - values={['10', '25', '50', '75', '100']} - unit="%" - /> -
-
-
- {!depositToken ? ( -
-
-
-

{t('token')}

-
-
-

{t('deposit-rate')}

-
-
-

- {t('wallet-balance')} -

-
-
- -
- ) : null} -
-
- - - - Skip for now - - -
-
- )} -
- -

Your Profile

-

- Add an NFT profile pic and edit your assigned name. Your profile - will be used for social features in the app. -

- setShowEditProfilePic(true)} - /> - - - Skip and Finish - - - - setShowEditProfilePic(false)} - /> - -
-
- - - - ) -} - -export default UserSetupModal diff --git a/components/swap/SwapPage.tsx b/components/swap/SwapPage.tsx index bb191e98..829137e4 100644 --- a/components/swap/SwapPage.tsx +++ b/components/swap/SwapPage.tsx @@ -4,6 +4,8 @@ import SwapOnboardingTour from '@components/tours/SwapOnboardingTour' import { useWallet } from '@solana/wallet-adapter-react' import SwapInfoTabs from './SwapInfoTabs' import dynamic from 'next/dynamic' +import useLocalStorageState from 'hooks/useLocalStorageState' +import { IS_ONBOARDED_KEY } from 'utils/constants' const SwapTokenChart = dynamic(() => import('./SwapTokenChart'), { ssr: false }) const SwapPage = () => { @@ -11,6 +13,7 @@ const SwapPage = () => { const outputTokenInfo = mangoStore((s) => s.swap.outputTokenInfo) const { connected } = useWallet() const tourSettings = mangoStore((s) => s.settings.tours) + const [isOnboarded] = useLocalStorageState(IS_ONBOARDED_KEY) return ( <> @@ -31,7 +34,7 @@ const SwapPage = () => { - {!tourSettings?.swap_tour_seen && connected ? ( + {!tourSettings?.swap_tour_seen && isOnboarded && connected ? ( ) : null} diff --git a/components/swap/SwapTokenChart.tsx b/components/swap/SwapTokenChart.tsx index 7f7d8dcf..57d3a2c0 100644 --- a/components/swap/SwapTokenChart.tsx +++ b/components/swap/SwapTokenChart.tsx @@ -91,7 +91,7 @@ const SwapTokenChart: FunctionComponent = ({ const chartDataQuery = useQuery( ['chart-data', baseTokenId, quoteTokenId, daysToShow], () => fetchChartData(baseTokenId, quoteTokenId, daysToShow), - { staleTime: 120000 } + { staleTime: 0 } ) const chartData = chartDataQuery.data diff --git a/components/trade/TradeAdvancedPage.tsx b/components/trade/TradeAdvancedPage.tsx index e0426bea..93e78deb 100644 --- a/components/trade/TradeAdvancedPage.tsx +++ b/components/trade/TradeAdvancedPage.tsx @@ -3,7 +3,7 @@ import dynamic from 'next/dynamic' import ReactGridLayout, { Responsive, WidthProvider } from 'react-grid-layout' import mangoStore from '@store/mangoStore' -import { GRID_LAYOUT_KEY } from 'utils/constants' +import { GRID_LAYOUT_KEY, IS_ONBOARDED_KEY } from 'utils/constants' import useLocalStorageState from 'hooks/useLocalStorageState' import { breakpoints } from 'utils/theme' import { useViewport } from 'hooks/useViewport' @@ -53,6 +53,7 @@ const TradeAdvancedPage = () => { const showMobileView = width <= breakpoints.md const tourSettings = mangoStore((s) => s.settings.tours) const { connected } = useWallet() + const [isOnboarded] = useLocalStorageState(IS_ONBOARDED_KEY) const defaultLayouts: ReactGridLayout.Layouts = useMemo(() => { const topnavbarHeight = 67 @@ -224,7 +225,7 @@ const TradeAdvancedPage = () => { - {!tourSettings?.trade_tour_seen && connected ? ( + {!tourSettings?.trade_tour_seen && isOnboarded && connected ? ( ) : null} diff --git a/public/images/trade.png b/public/images/trade.png new file mode 100644 index 00000000..cfcdfb43 Binary files /dev/null and b/public/images/trade.png differ diff --git a/styles/globals.css b/styles/globals.css index d8250fa1..4ddafb1b 100644 --- a/styles/globals.css +++ b/styles/globals.css @@ -420,12 +420,10 @@ input[type='range']::-webkit-slider-runnable-track { .radial-gradient-bg { background-image: radial-gradient( - at -100% -100%, - var(--red) 0, - transparent 65% - ), - radial-gradient(at 300% 200%, var(--button) 0, transparent 75%); - /* radial-gradient(at -100% 200%, var(--primary) 0, transparent 65%); */ + at 300% 100%, + var(--button) 0, + transparent 75% + ); @apply bg-th-bkg-1; }