208 lines
5.4 KiB
TypeScript
208 lines
5.4 KiB
TypeScript
import classNames from 'classnames';
|
|
import { t } from '@vegaprotocol/i18n';
|
|
import {
|
|
ExternalLink,
|
|
Intent,
|
|
TradingAnchorButton,
|
|
TradingButton,
|
|
VegaIcon,
|
|
VegaIconNames,
|
|
} from '@vegaprotocol/ui-toolkit';
|
|
import { useVegaWallet, useVegaWalletDialogStore } from '@vegaprotocol/wallet';
|
|
import { Networks, useEnvironment } from '@vegaprotocol/environment';
|
|
import {
|
|
OnboardingStep,
|
|
useGetOnboardingStep,
|
|
useOnboardingStore,
|
|
} from './use-get-onboarding-step';
|
|
import { Links, Routes } from '../../lib/links';
|
|
import { useGlobalStore } from '../../stores';
|
|
import { useSidebar, ViewType } from '../sidebar';
|
|
|
|
interface Props {
|
|
lead?: string;
|
|
}
|
|
|
|
const GetStartedButton = ({ step }: { step: OnboardingStep }) => {
|
|
const dismiss = useOnboardingStore((store) => store.dismiss);
|
|
const setDialogOpen = useOnboardingStore((store) => store.setDialogOpen);
|
|
const marketId = useGlobalStore((store) => store.marketId);
|
|
const openVegaWalletDialog = useVegaWalletDialogStore(
|
|
(store) => store.openVegaWalletDialog
|
|
);
|
|
const setViews = useSidebar((store) => store.setViews);
|
|
|
|
const buttonProps = {
|
|
size: 'small' as const,
|
|
'data-testid': 'get-started-button',
|
|
intent: Intent.Info,
|
|
};
|
|
|
|
if (step <= OnboardingStep.ONBOARDING_CONNECT_STEP) {
|
|
return (
|
|
<TradingButton {...buttonProps} onClick={() => openVegaWalletDialog()}>
|
|
{t('Connect')}
|
|
</TradingButton>
|
|
);
|
|
} else if (step === OnboardingStep.ONBOARDING_DEPOSIT_STEP) {
|
|
return (
|
|
<TradingAnchorButton
|
|
{...buttonProps}
|
|
href={Links.DEPOSIT()}
|
|
onClick={() => setDialogOpen(false)}
|
|
>
|
|
{t('Deposit')}
|
|
</TradingAnchorButton>
|
|
);
|
|
} else if (step >= OnboardingStep.ONBOARDING_ORDER_STEP) {
|
|
const link = marketId ? Links.MARKET(marketId) : Links.HOME();
|
|
return (
|
|
<TradingAnchorButton
|
|
{...buttonProps}
|
|
href={link}
|
|
onClick={() => {
|
|
setViews({ type: ViewType.Order }, Routes.MARKET);
|
|
dismiss();
|
|
}}
|
|
>
|
|
{t('Ready to trade')}
|
|
</TradingAnchorButton>
|
|
);
|
|
}
|
|
|
|
return (
|
|
<TradingButton {...buttonProps} onClick={() => openVegaWalletDialog()}>
|
|
{t('Get started')}
|
|
</TradingButton>
|
|
);
|
|
};
|
|
|
|
export const GetStartedCheckList = () => {
|
|
const { pubKey } = useVegaWallet();
|
|
const currentStep = useGetOnboardingStep();
|
|
return (
|
|
<ul className="list-none">
|
|
<Step
|
|
step={1}
|
|
text={t('Connect')}
|
|
complete={Boolean(
|
|
currentStep > OnboardingStep.ONBOARDING_CONNECT_STEP || pubKey
|
|
)}
|
|
/>
|
|
<Step
|
|
step={2}
|
|
text={t('Deposit funds')}
|
|
complete={currentStep > OnboardingStep.ONBOARDING_DEPOSIT_STEP}
|
|
/>
|
|
<Step
|
|
step={3}
|
|
text={t('Open a position')}
|
|
complete={currentStep > OnboardingStep.ONBOARDING_ORDER_STEP}
|
|
/>
|
|
</ul>
|
|
);
|
|
};
|
|
|
|
export const GetStarted = ({ lead }: Props) => {
|
|
const { pubKey } = useVegaWallet();
|
|
const { VEGA_ENV, VEGA_NETWORKS } = useEnvironment();
|
|
const openVegaWalletDialog = useVegaWalletDialogStore(
|
|
(store) => store.openVegaWalletDialog
|
|
);
|
|
const currentStep = useGetOnboardingStep();
|
|
const dismissed = useOnboardingStore((store) => store.dismissed);
|
|
|
|
const wrapperClasses = classNames(
|
|
'flex flex-col py-4 px-6 gap-4 rounded',
|
|
'bg-vega-blue-300 dark:bg-vega-blue-700',
|
|
'border border-vega-blue-350 dark:border-vega-blue-650',
|
|
{ 'mt-8': !lead }
|
|
);
|
|
|
|
if (!dismissed) {
|
|
return (
|
|
<div className={wrapperClasses} data-testid="get-started-banner">
|
|
{lead && <h2>{lead}</h2>}
|
|
<h3 className="text-lg">{t('Get started')}</h3>
|
|
<div>
|
|
<GetStartedCheckList />
|
|
</div>
|
|
<div>
|
|
<GetStartedButton step={currentStep} />
|
|
</div>
|
|
{VEGA_ENV === Networks.MAINNET && (
|
|
<p className="text-sm">
|
|
{t('Experiment for free with virtual assets on')}{' '}
|
|
<ExternalLink href={VEGA_NETWORKS.TESTNET}>
|
|
{t('Fairground Testnet')}
|
|
</ExternalLink>
|
|
</p>
|
|
)}
|
|
{VEGA_ENV === Networks.TESTNET && (
|
|
<p className="text-sm">
|
|
{t('Ready to trade with real funds?')}{' '}
|
|
<ExternalLink href={VEGA_NETWORKS.MAINNET}>
|
|
{t('Switch to Mainnet')}
|
|
</ExternalLink>
|
|
</p>
|
|
)}
|
|
</div>
|
|
);
|
|
}
|
|
|
|
if (!pubKey) {
|
|
return (
|
|
<div className={wrapperClasses}>
|
|
<p className="mb-1 text-sm">
|
|
You need a{' '}
|
|
<ExternalLink href="https://vega.xyz/wallet">
|
|
Vega wallet
|
|
</ExternalLink>{' '}
|
|
to start trading in this market.
|
|
</p>
|
|
<TradingButton
|
|
onClick={openVegaWalletDialog}
|
|
size="small"
|
|
data-testid="order-connect-wallet"
|
|
intent={Intent.Info}
|
|
>
|
|
{t('Connect wallet')}
|
|
</TradingButton>
|
|
</div>
|
|
);
|
|
}
|
|
|
|
return null;
|
|
};
|
|
|
|
const Step = ({
|
|
step,
|
|
text,
|
|
complete,
|
|
}: {
|
|
step: number;
|
|
text: string;
|
|
complete: boolean;
|
|
}) => {
|
|
return (
|
|
<li
|
|
className={classNames('flex', {
|
|
'text-vega-clight-200 dark:text-vega-cdark-200': complete,
|
|
})}
|
|
>
|
|
<div className="flex justify-center w-5">
|
|
{complete ? <Tick /> : <span>{step}.</span>}
|
|
</div>
|
|
<div className="ml-1">{text}</div>
|
|
</li>
|
|
);
|
|
};
|
|
|
|
const Tick = () => {
|
|
return (
|
|
<span className="relative right-[2px]">
|
|
<VegaIcon name={VegaIconNames.TICK} size={18} />
|
|
</span>
|
|
);
|
|
};
|