Compare commits
2
Commits
| Author | SHA1 | Date | |
|---|---|---|---|
|
|
59cc31b388 | ||
|
|
ef5b5013c5 |
@@ -7,7 +7,7 @@ import { layoutMixins } from '@/styles/layoutMixins';
|
|||||||
import { breakpoints } from '@/styles';
|
import { breakpoints } from '@/styles';
|
||||||
|
|
||||||
type PanelProps = {
|
type PanelProps = {
|
||||||
slotHeaderContent?: React.ReactNode;
|
slotHeaderContent?: string;
|
||||||
slotHeader?: React.ReactNode;
|
slotHeader?: React.ReactNode;
|
||||||
slotRight?: React.ReactNode;
|
slotRight?: React.ReactNode;
|
||||||
children?: React.ReactNode;
|
children?: React.ReactNode;
|
||||||
|
|||||||
@@ -982,4 +982,4 @@ Styled.ViewMoreButton = styled(Button)`
|
|||||||
width: 0.675rem;
|
width: 0.675rem;
|
||||||
margin-left: 0.5ch;
|
margin-left: 0.5ch;
|
||||||
}
|
}
|
||||||
`;
|
`;
|
||||||
|
|||||||
@@ -1,7 +1,6 @@
|
|||||||
import { useCallback, useEffect, useState, useMemo } from 'react';
|
import { useCallback, useEffect, useState, useMemo } from 'react';
|
||||||
import { useSelector } from 'react-redux';
|
import { useSelector } from 'react-redux';
|
||||||
|
|
||||||
import { EvmDerivedAddresses } from '@/constants/account';
|
|
||||||
import { LocalStorageKey } from '@/constants/localStorage';
|
import { LocalStorageKey } from '@/constants/localStorage';
|
||||||
import { ENVIRONMENT_CONFIG_MAP } from '@/constants/networks';
|
import { ENVIRONMENT_CONFIG_MAP } from '@/constants/networks';
|
||||||
|
|
||||||
@@ -105,17 +104,11 @@ export const useWalletConnection = () => {
|
|||||||
[walletConnectConfig, walletType, walletConnectionType]
|
[walletConnectConfig, walletType, walletConnectionType]
|
||||||
);
|
);
|
||||||
|
|
||||||
const { connectAsync: connectWagmi } = useConnectWagmi({ connector: wagmiConnector });
|
const { connectAsync: connectWagmi } = useConnectWagmi({ connector: wagmiConnector })
|
||||||
const { suggestAndConnect: connectGraz } = useConnectGraz();
|
const { suggestAndConnect: connectGraz } = useConnectGraz();
|
||||||
const [evmDerivedAddresses] = useLocalStorage({
|
|
||||||
key: LocalStorageKey.EvmDerivedAddresses,
|
|
||||||
defaultValue: {} as EvmDerivedAddresses,
|
|
||||||
});
|
|
||||||
|
|
||||||
const connectWallet = useCallback(
|
const connectWallet = useCallback(
|
||||||
async ({ walletType, forceConnect }: { walletType?: WalletType; forceConnect?: boolean }) => {
|
async ({ walletType }: { walletType: WalletType }) => {
|
||||||
if (!walletType) return { walletType, walletConnectionType };
|
|
||||||
|
|
||||||
const walletConnection = getWalletConnection({ walletType });
|
const walletConnection = getWalletConnection({ walletType });
|
||||||
|
|
||||||
try {
|
try {
|
||||||
@@ -139,11 +132,7 @@ export const useWalletConnection = () => {
|
|||||||
});
|
});
|
||||||
}
|
}
|
||||||
} else {
|
} else {
|
||||||
const isAccountConnected = Boolean(
|
if (!isConnectedWagmi) {
|
||||||
evmAddress && evmDerivedAddresses[evmAddress]?.encryptedSignature
|
|
||||||
);
|
|
||||||
// if account connected (via remember me), do not show wagmi popup until forceConnect
|
|
||||||
if (!isConnectedWagmi && (forceConnect || !isAccountConnected)) {
|
|
||||||
await connectWagmi({
|
await connectWagmi({
|
||||||
connector: resolveWagmiConnector({
|
connector: resolveWagmiConnector({
|
||||||
walletType,
|
walletType,
|
||||||
@@ -239,12 +228,6 @@ export const useWalletConnection = () => {
|
|||||||
evmAddressWagmi,
|
evmAddressWagmi,
|
||||||
signerWagmi,
|
signerWagmi,
|
||||||
publicClientWagmi,
|
publicClientWagmi,
|
||||||
isConnectedWagmi,
|
|
||||||
connectWallet: () =>
|
|
||||||
connectWallet({
|
|
||||||
walletType: selectedWalletType,
|
|
||||||
forceConnect: true,
|
|
||||||
}),
|
|
||||||
|
|
||||||
// Wallet connection (Cosmos)
|
// Wallet connection (Cosmos)
|
||||||
dydxAddress,
|
dydxAddress,
|
||||||
|
|||||||
+5
-10
@@ -171,15 +171,6 @@ class AbacusStateManager {
|
|||||||
this.setTransferValue({ value: null, field: TransferInputField.usdcSize });
|
this.setTransferValue({ value: null, field: TransferInputField.usdcSize });
|
||||||
};
|
};
|
||||||
|
|
||||||
resetInputState = () => {
|
|
||||||
this.clearTransferInputValues();
|
|
||||||
this.setTransferValue({
|
|
||||||
field: TransferInputField.type,
|
|
||||||
value: null,
|
|
||||||
});
|
|
||||||
this.clearTradeInputValues();
|
|
||||||
};
|
|
||||||
|
|
||||||
// ------ Set Data ------ //
|
// ------ Set Data ------ //
|
||||||
setStore = (store: RootStore) => {
|
setStore = (store: RootStore) => {
|
||||||
this.store = store;
|
this.store = store;
|
||||||
@@ -271,7 +262,11 @@ class AbacusStateManager {
|
|||||||
) => this.stateManager.cancelOrder(orderId, callback);
|
) => this.stateManager.cancelOrder(orderId, callback);
|
||||||
|
|
||||||
cctpWithdraw = (
|
cctpWithdraw = (
|
||||||
callback: (success: boolean, parsingError: Nullable<ParsingError>, data: string) => void
|
callback: (
|
||||||
|
success: boolean,
|
||||||
|
parsingError: Nullable<ParsingError>,
|
||||||
|
data: string,
|
||||||
|
) => void
|
||||||
): void => this.stateManager.commitCCTPWithdraw(callback);
|
): void => this.stateManager.commitCCTPWithdraw(callback);
|
||||||
|
|
||||||
// ------ Utils ------ //
|
// ------ Utils ------ //
|
||||||
|
|||||||
@@ -5,7 +5,7 @@ import { useEnsName } from 'wagmi';
|
|||||||
import { useNavigate } from 'react-router-dom';
|
import { useNavigate } from 'react-router-dom';
|
||||||
|
|
||||||
import { ButtonSize } from '@/constants/buttons';
|
import { ButtonSize } from '@/constants/buttons';
|
||||||
import { TransferType } from '@/constants/abacus';
|
import { TransferInputField, TransferType } from '@/constants/abacus';
|
||||||
|
|
||||||
import { layoutMixins } from '@/styles/layoutMixins';
|
import { layoutMixins } from '@/styles/layoutMixins';
|
||||||
|
|
||||||
@@ -26,13 +26,12 @@ import { useAccounts, useStringGetter, useTokenConfigs } from '@/hooks';
|
|||||||
import { getOnboardingState } from '@/state/accountSelectors';
|
import { getOnboardingState } from '@/state/accountSelectors';
|
||||||
import { openDialog } from '@/state/dialogs';
|
import { openDialog } from '@/state/dialogs';
|
||||||
|
|
||||||
|
import abacusStateManager from '@/lib/abacus';
|
||||||
import { isTruthy } from '@/lib/isTruthy';
|
import { isTruthy } from '@/lib/isTruthy';
|
||||||
import { truncateAddress } from '@/lib/wallet';
|
import { truncateAddress } from '@/lib/wallet';
|
||||||
|
|
||||||
import { DYDXBalancePanel } from './rewards/DYDXBalancePanel';
|
import { DYDXBalancePanel } from './rewards/DYDXBalancePanel';
|
||||||
import { MigratePanel } from './rewards/MigratePanel';
|
import { MigratePanel } from './rewards/MigratePanel';
|
||||||
import { GovernancePanel } from './rewards/GovernancePanel';
|
|
||||||
import { StakingPanel } from './rewards/StakingPanel';
|
|
||||||
|
|
||||||
const ENS_CHAIN_ID = 1; // Ethereum
|
const ENS_CHAIN_ID = 1; // Ethereum
|
||||||
|
|
||||||
@@ -179,7 +178,7 @@ const Profile = () => {
|
|||||||
onClick={() => dispatch(openDialog({ type: DialogTypes.Help }))}
|
onClick={() => dispatch(openDialog({ type: DialogTypes.Help }))}
|
||||||
/>
|
/>
|
||||||
</Styled.EqualGrid>
|
</Styled.EqualGrid>
|
||||||
|
|
||||||
<MigratePanel />
|
<MigratePanel />
|
||||||
<DYDXBalancePanel />
|
<DYDXBalancePanel />
|
||||||
|
|
||||||
@@ -231,9 +230,6 @@ const Profile = () => {
|
|||||||
withInnerBorders={false}
|
withInnerBorders={false}
|
||||||
/>
|
/>
|
||||||
</Styled.TablePanel>
|
</Styled.TablePanel>
|
||||||
|
|
||||||
<GovernancePanel />
|
|
||||||
<StakingPanel />
|
|
||||||
</Styled.MobileProfileLayout>
|
</Styled.MobileProfileLayout>
|
||||||
);
|
);
|
||||||
};
|
};
|
||||||
@@ -247,7 +243,6 @@ Styled.MobileProfileLayout = styled.div`
|
|||||||
|
|
||||||
gap: 1rem;
|
gap: 1rem;
|
||||||
padding: 1.25rem 0.9rem;
|
padding: 1.25rem 0.9rem;
|
||||||
max-width: 100vw;
|
|
||||||
`;
|
`;
|
||||||
|
|
||||||
Styled.Header = styled.header`
|
Styled.Header = styled.header`
|
||||||
@@ -342,7 +337,7 @@ Styled.Details = styled(Details)`
|
|||||||
|
|
||||||
Styled.RewardsPanel = styled(Panel)`
|
Styled.RewardsPanel = styled(Panel)`
|
||||||
align-self: flex-start;
|
align-self: flex-start;
|
||||||
|
|
||||||
&,
|
&,
|
||||||
> * {
|
> * {
|
||||||
height: 100%;
|
height: 100%;
|
||||||
|
|||||||
@@ -1,75 +0,0 @@
|
|||||||
import styled, { AnyStyledComponent } from 'styled-components';
|
|
||||||
import { useDispatch } from 'react-redux';
|
|
||||||
|
|
||||||
import { ButtonAction, ButtonSize } from '@/constants/buttons';
|
|
||||||
import { STRING_KEYS } from '@/constants/localization';
|
|
||||||
import { DialogTypes } from '@/constants/dialogs';
|
|
||||||
|
|
||||||
import { useStringGetter, useURLConfigs } from '@/hooks';
|
|
||||||
|
|
||||||
import { Panel } from '@/components/Panel';
|
|
||||||
import { IconName } from '@/components/Icon';
|
|
||||||
import { IconButton } from '@/components/IconButton';
|
|
||||||
import { Link } from '@/components/Link';
|
|
||||||
|
|
||||||
import { openDialog } from '@/state/dialogs';
|
|
||||||
|
|
||||||
export const GovernancePanel = () => {
|
|
||||||
const stringGetter = useStringGetter();
|
|
||||||
const dispatch = useDispatch();
|
|
||||||
const { governanceLearnMore } = useURLConfigs();
|
|
||||||
|
|
||||||
return (
|
|
||||||
<Panel
|
|
||||||
slotHeaderContent={
|
|
||||||
<Styled.Title>{stringGetter({ key: STRING_KEYS.GOVERNANCE })}</Styled.Title>
|
|
||||||
}
|
|
||||||
slotRight={
|
|
||||||
<Styled.Arrow>
|
|
||||||
<Styled.IconButton
|
|
||||||
action={ButtonAction.Base}
|
|
||||||
iconName={IconName.Arrow}
|
|
||||||
size={ButtonSize.Small}
|
|
||||||
/>
|
|
||||||
</Styled.Arrow>
|
|
||||||
}
|
|
||||||
onClick={() => dispatch(openDialog({ type: DialogTypes.ExternalNavKeplr }))}
|
|
||||||
>
|
|
||||||
<Styled.Description>
|
|
||||||
{stringGetter({ key: STRING_KEYS.GOVERNANCE_DESCRIPTION })}
|
|
||||||
<Link href={governanceLearnMore} onClick={(e) => e.stopPropagation()}>
|
|
||||||
{stringGetter({ key: STRING_KEYS.LEARN_MORE })} →
|
|
||||||
</Link>
|
|
||||||
</Styled.Description>
|
|
||||||
</Panel>
|
|
||||||
);
|
|
||||||
};
|
|
||||||
|
|
||||||
const Styled: Record<string, AnyStyledComponent> = {};
|
|
||||||
|
|
||||||
Styled.Description = styled.div`
|
|
||||||
color: var(--color-text-0);
|
|
||||||
--link-color: var(--color-text-1);
|
|
||||||
|
|
||||||
a {
|
|
||||||
display: inline;
|
|
||||||
::before {
|
|
||||||
content: ' ';
|
|
||||||
}
|
|
||||||
}
|
|
||||||
`;
|
|
||||||
|
|
||||||
Styled.IconButton = styled(IconButton)`
|
|
||||||
color: var(--color-text-0);
|
|
||||||
--color-border: var(--color-layer-6);
|
|
||||||
`;
|
|
||||||
|
|
||||||
Styled.Arrow = styled.div`
|
|
||||||
padding-right: 1.5rem;
|
|
||||||
`;
|
|
||||||
|
|
||||||
Styled.Title = styled.h3`
|
|
||||||
font: var(--font-medium-book);
|
|
||||||
color: var(--color-text-2);
|
|
||||||
margin-bottom: -1rem;
|
|
||||||
`;
|
|
||||||
@@ -146,15 +146,14 @@ Styled.Title = styled.h3`
|
|||||||
color: var(--color-text-2);
|
color: var(--color-text-2);
|
||||||
|
|
||||||
padding: var(--panel-paddingY) var(--panel-paddingX) 0;
|
padding: var(--panel-paddingY) var(--panel-paddingX) 0;
|
||||||
margin-bottom: -0.5rem;
|
|
||||||
`;
|
`;
|
||||||
|
|
||||||
Styled.MigrateAction = styled.div`
|
Styled.MigrateAction = styled.div`
|
||||||
${layoutMixins.flexEqualColumns}
|
${layoutMixins.flexEqualColumns}
|
||||||
align-items: center;
|
align-items: center;
|
||||||
|
margin: 1rem;
|
||||||
gap: 1rem;
|
gap: 1rem;
|
||||||
padding: 1rem;
|
padding: 1rem;
|
||||||
margin: 1rem;
|
|
||||||
width: 100%;
|
width: 100%;
|
||||||
|
|
||||||
background-color: var(--color-layer-2);
|
background-color: var(--color-layer-2);
|
||||||
@@ -234,4 +233,4 @@ Styled.InlineRow = styled.div`
|
|||||||
${layoutMixins.inlineRow}
|
${layoutMixins.inlineRow}
|
||||||
color: var(--color-text-0);
|
color: var(--color-text-0);
|
||||||
--link-color: var(--color-text-1);
|
--link-color: var(--color-text-1);
|
||||||
`;
|
`;
|
||||||
|
|||||||
@@ -3,29 +3,45 @@ import { useDispatch } from 'react-redux';
|
|||||||
import { useNavigate } from 'react-router-dom';
|
import { useNavigate } from 'react-router-dom';
|
||||||
|
|
||||||
import { STRING_KEYS } from '@/constants/localization';
|
import { STRING_KEYS } from '@/constants/localization';
|
||||||
|
import { ButtonAction, ButtonSize } from '@/constants/buttons';
|
||||||
|
import { DialogTypes } from '@/constants/dialogs';
|
||||||
import { AppRoute } from '@/constants/routes';
|
import { AppRoute } from '@/constants/routes';
|
||||||
|
|
||||||
import { useBreakpoints, useStringGetter } from '@/hooks';
|
import { useBreakpoints, useStringGetter, useURLConfigs } from '@/hooks';
|
||||||
|
|
||||||
import { breakpoints } from '@/styles';
|
import { breakpoints } from '@/styles';
|
||||||
import { layoutMixins } from '@/styles/layoutMixins';
|
import { layoutMixins } from '@/styles/layoutMixins';
|
||||||
|
|
||||||
import { BackButton } from '@/components/BackButton';
|
import { BackButton } from '@/components/BackButton';
|
||||||
import { Panel } from '@/components/Panel';
|
import { Panel } from '@/components/Panel';
|
||||||
|
import { IconName } from '@/components/Icon';
|
||||||
|
import { IconButton } from '@/components/IconButton';
|
||||||
|
import { Link } from '@/components/Link';
|
||||||
|
|
||||||
|
import { openDialog } from '@/state/dialogs';
|
||||||
|
|
||||||
import { DYDXBalancePanel } from './DYDXBalancePanel';
|
import { DYDXBalancePanel } from './DYDXBalancePanel';
|
||||||
import { MigratePanel } from './MigratePanel';
|
import { MigratePanel } from './MigratePanel';
|
||||||
import { LaunchIncentivesPanel } from './LaunchIncentivesPanel';
|
import { LaunchIncentivesPanel } from './LaunchIncentivesPanel';
|
||||||
import { RewardsHelpPanel } from './RewardsHelpPanel';
|
import { RewardsHelpPanel } from './RewardsHelpPanel';
|
||||||
import { GovernancePanel } from './GovernancePanel';
|
|
||||||
import { StakingPanel } from './StakingPanel';
|
|
||||||
|
|
||||||
const RewardsPage = () => {
|
const RewardsPage = () => {
|
||||||
const dispatch = useDispatch();
|
const dispatch = useDispatch();
|
||||||
const stringGetter = useStringGetter();
|
const stringGetter = useStringGetter();
|
||||||
|
const { governanceLearnMore, stakingLearnMore } = useURLConfigs();
|
||||||
const { isTablet, isNotTablet } = useBreakpoints();
|
const { isTablet, isNotTablet } = useBreakpoints();
|
||||||
const navigate = useNavigate();
|
const navigate = useNavigate();
|
||||||
|
|
||||||
|
const panelArrow = (
|
||||||
|
<Styled.Arrow>
|
||||||
|
<Styled.IconButton
|
||||||
|
action={ButtonAction.Base}
|
||||||
|
iconName={IconName.Arrow}
|
||||||
|
size={ButtonSize.Small}
|
||||||
|
/>
|
||||||
|
</Styled.Arrow>
|
||||||
|
);
|
||||||
|
|
||||||
return (
|
return (
|
||||||
<Styled.Page>
|
<Styled.Page>
|
||||||
{isTablet && (
|
{isTablet && (
|
||||||
@@ -45,12 +61,37 @@ const RewardsPage = () => {
|
|||||||
</Styled.PanelRowIncentivesAndBalance>
|
</Styled.PanelRowIncentivesAndBalance>
|
||||||
)}
|
)}
|
||||||
|
|
||||||
{isNotTablet && (
|
<Styled.PanelRow>
|
||||||
<Styled.PanelRow>
|
<Styled.Panel
|
||||||
<GovernancePanel />
|
slotHeaderContent={
|
||||||
<StakingPanel />
|
<Styled.Title>{stringGetter({ key: STRING_KEYS.GOVERNANCE })}</Styled.Title>
|
||||||
</Styled.PanelRow>
|
}
|
||||||
)}
|
slotRight={panelArrow}
|
||||||
|
onClick={() => dispatch(openDialog({ type: DialogTypes.ExternalNavKeplr }))}
|
||||||
|
>
|
||||||
|
<Styled.Description>
|
||||||
|
{stringGetter({ key: STRING_KEYS.GOVERNANCE_DESCRIPTION })}
|
||||||
|
<Link href={governanceLearnMore} onClick={(e) => e.stopPropagation()}>
|
||||||
|
{stringGetter({ key: STRING_KEYS.LEARN_MORE })} →
|
||||||
|
</Link>
|
||||||
|
</Styled.Description>
|
||||||
|
</Styled.Panel>
|
||||||
|
|
||||||
|
<Styled.Panel
|
||||||
|
slotHeaderContent={
|
||||||
|
<Styled.Title>{stringGetter({ key: STRING_KEYS.STAKING })}</Styled.Title>
|
||||||
|
}
|
||||||
|
slotRight={panelArrow}
|
||||||
|
onClick={() => dispatch(openDialog({ type: DialogTypes.ExternalNavKeplr }))}
|
||||||
|
>
|
||||||
|
<Styled.Description>
|
||||||
|
{stringGetter({ key: STRING_KEYS.STAKING_DESCRIPTION })}
|
||||||
|
<Link href={stakingLearnMore} onClick={(e) => e.stopPropagation()}>
|
||||||
|
{stringGetter({ key: STRING_KEYS.LEARN_MORE })} →
|
||||||
|
</Link>
|
||||||
|
</Styled.Description>
|
||||||
|
</Styled.Panel>
|
||||||
|
</Styled.PanelRow>
|
||||||
|
|
||||||
<RewardsHelpPanel />
|
<RewardsHelpPanel />
|
||||||
</Styled.Page>
|
</Styled.Page>
|
||||||
@@ -99,6 +140,24 @@ Styled.Panel = styled(Panel)`
|
|||||||
height: fit-content;
|
height: fit-content;
|
||||||
`;
|
`;
|
||||||
|
|
||||||
|
Styled.Title = styled.h3`
|
||||||
|
font: var(--font-medium-book);
|
||||||
|
color: var(--color-text-2);
|
||||||
|
margin-bottom: -1rem;
|
||||||
|
`;
|
||||||
|
|
||||||
|
Styled.Description = styled.div`
|
||||||
|
color: var(--color-text-0);
|
||||||
|
--link-color: var(--color-text-1);
|
||||||
|
|
||||||
|
a {
|
||||||
|
display: inline;
|
||||||
|
::before {
|
||||||
|
content: ' ';
|
||||||
|
}
|
||||||
|
}
|
||||||
|
`;
|
||||||
|
|
||||||
Styled.PanelRow = styled.div`
|
Styled.PanelRow = styled.div`
|
||||||
${layoutMixins.gridEqualColumns}
|
${layoutMixins.gridEqualColumns}
|
||||||
gap: 1.5rem;
|
gap: 1.5rem;
|
||||||
@@ -112,3 +171,12 @@ Styled.PanelRow = styled.div`
|
|||||||
Styled.PanelRowIncentivesAndBalance = styled(Styled.PanelRow)`
|
Styled.PanelRowIncentivesAndBalance = styled(Styled.PanelRow)`
|
||||||
grid-template-columns: 2fr 1fr;
|
grid-template-columns: 2fr 1fr;
|
||||||
`;
|
`;
|
||||||
|
|
||||||
|
Styled.IconButton = styled(IconButton)`
|
||||||
|
color: var(--color-text-0);
|
||||||
|
--color-border: var(--color-layer-6);
|
||||||
|
`;
|
||||||
|
|
||||||
|
Styled.Arrow = styled.div`
|
||||||
|
padding: 1rem;
|
||||||
|
`;
|
||||||
|
|||||||
@@ -1,73 +0,0 @@
|
|||||||
import styled, { AnyStyledComponent } from 'styled-components';
|
|
||||||
import { useDispatch } from 'react-redux';
|
|
||||||
|
|
||||||
import { ButtonAction, ButtonSize } from '@/constants/buttons';
|
|
||||||
import { STRING_KEYS } from '@/constants/localization';
|
|
||||||
import { DialogTypes } from '@/constants/dialogs';
|
|
||||||
|
|
||||||
import { useStringGetter, useURLConfigs } from '@/hooks';
|
|
||||||
|
|
||||||
import { Panel } from '@/components/Panel';
|
|
||||||
import { IconName } from '@/components/Icon';
|
|
||||||
import { IconButton } from '@/components/IconButton';
|
|
||||||
import { Link } from '@/components/Link';
|
|
||||||
|
|
||||||
import { openDialog } from '@/state/dialogs';
|
|
||||||
|
|
||||||
export const StakingPanel = () => {
|
|
||||||
const stringGetter = useStringGetter();
|
|
||||||
const dispatch = useDispatch();
|
|
||||||
const { stakingLearnMore } = useURLConfigs();
|
|
||||||
|
|
||||||
return (
|
|
||||||
<Panel
|
|
||||||
slotHeaderContent={<Styled.Title>{stringGetter({ key: STRING_KEYS.STAKING })}</Styled.Title>}
|
|
||||||
slotRight={
|
|
||||||
<Styled.Arrow>
|
|
||||||
<Styled.IconButton
|
|
||||||
action={ButtonAction.Base}
|
|
||||||
iconName={IconName.Arrow}
|
|
||||||
size={ButtonSize.Small}
|
|
||||||
/>
|
|
||||||
</Styled.Arrow>
|
|
||||||
}
|
|
||||||
onClick={() => dispatch(openDialog({ type: DialogTypes.ExternalNavKeplr }))}
|
|
||||||
>
|
|
||||||
<Styled.Description>
|
|
||||||
{stringGetter({ key: STRING_KEYS.STAKING_DESCRIPTION })}
|
|
||||||
<Link href={stakingLearnMore} onClick={(e) => e.stopPropagation()}>
|
|
||||||
{stringGetter({ key: STRING_KEYS.LEARN_MORE })} →
|
|
||||||
</Link>
|
|
||||||
</Styled.Description>
|
|
||||||
</Panel>
|
|
||||||
);
|
|
||||||
};
|
|
||||||
|
|
||||||
const Styled: Record<string, AnyStyledComponent> = {};
|
|
||||||
|
|
||||||
Styled.Description = styled.div`
|
|
||||||
color: var(--color-text-0);
|
|
||||||
--link-color: var(--color-text-1);
|
|
||||||
|
|
||||||
a {
|
|
||||||
display: inline;
|
|
||||||
::before {
|
|
||||||
content: ' ';
|
|
||||||
}
|
|
||||||
}
|
|
||||||
`;
|
|
||||||
|
|
||||||
Styled.IconButton = styled(IconButton)`
|
|
||||||
color: var(--color-text-0);
|
|
||||||
--color-border: var(--color-layer-6);
|
|
||||||
`;
|
|
||||||
|
|
||||||
Styled.Arrow = styled.div`
|
|
||||||
padding-right: 1.5rem;
|
|
||||||
`;
|
|
||||||
|
|
||||||
Styled.Title = styled.h3`
|
|
||||||
font: var(--font-medium-book);
|
|
||||||
color: var(--color-text-2);
|
|
||||||
margin-bottom: -1rem;
|
|
||||||
`;
|
|
||||||
@@ -72,7 +72,6 @@ export const GenerateKeys = ({
|
|||||||
if (message) {
|
if (message) {
|
||||||
log('GenerateKeys/switchNetwork', error, { walletErrorType });
|
log('GenerateKeys/switchNetwork', error, { walletErrorType });
|
||||||
setError(message);
|
setError(message);
|
||||||
throw error;
|
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
};
|
};
|
||||||
|
|||||||
@@ -17,7 +17,6 @@ import type { EvmAddress } from '@/constants/wallets';
|
|||||||
import { useAccounts, useDebounce, useStringGetter, useSelectedNetwork } from '@/hooks';
|
import { useAccounts, useDebounce, useStringGetter, useSelectedNetwork } from '@/hooks';
|
||||||
import { useAccountBalance, CHAIN_DEFAULT_TOKEN_ADDRESS } from '@/hooks/useAccountBalance';
|
import { useAccountBalance, CHAIN_DEFAULT_TOKEN_ADDRESS } from '@/hooks/useAccountBalance';
|
||||||
import { useLocalNotifications } from '@/hooks/useLocalNotifications';
|
import { useLocalNotifications } from '@/hooks/useLocalNotifications';
|
||||||
import { useWalletConnection } from '@/hooks/useWalletConnection';
|
|
||||||
|
|
||||||
import { layoutMixins } from '@/styles/layoutMixins';
|
import { layoutMixins } from '@/styles/layoutMixins';
|
||||||
import { formMixins } from '@/styles/formMixins';
|
import { formMixins } from '@/styles/formMixins';
|
||||||
@@ -121,7 +120,11 @@ export const DepositForm = ({ onDeposit, onError }: DepositFormProps) => {
|
|||||||
});
|
});
|
||||||
|
|
||||||
return () => {
|
return () => {
|
||||||
abacusStateManager.resetInputState();
|
abacusStateManager.clearTransferInputValues();
|
||||||
|
abacusStateManager.setTransferValue({
|
||||||
|
field: TransferInputField.type,
|
||||||
|
value: null,
|
||||||
|
});
|
||||||
};
|
};
|
||||||
}, []);
|
}, []);
|
||||||
|
|
||||||
@@ -365,8 +368,6 @@ export const DepositForm = ({ onDeposit, onError }: DepositFormProps) => {
|
|||||||
return <LoadingSpace id="DepositForm" />;
|
return <LoadingSpace id="DepositForm" />;
|
||||||
}
|
}
|
||||||
|
|
||||||
const [requireUserActionInWallet, setRequireUserActionInWallet] = useState(false);
|
|
||||||
|
|
||||||
return (
|
return (
|
||||||
<Styled.Form onSubmit={onSubmit}>
|
<Styled.Form onSubmit={onSubmit}>
|
||||||
<ChainSelectMenu selectedChain={chainIdStr || undefined} onSelectChain={onSelectChain} />
|
<ChainSelectMenu selectedChain={chainIdStr || undefined} onSelectChain={onSelectChain} />
|
||||||
@@ -385,11 +386,7 @@ export const DepositForm = ({ onDeposit, onError }: DepositFormProps) => {
|
|||||||
/>
|
/>
|
||||||
</Styled.WithDetailsReceipt>
|
</Styled.WithDetailsReceipt>
|
||||||
{errorMessage && <AlertMessage type={AlertType.Error}>{errorMessage}</AlertMessage>}
|
{errorMessage && <AlertMessage type={AlertType.Error}>{errorMessage}</AlertMessage>}
|
||||||
{requireUserActionInWallet && (
|
|
||||||
<AlertMessage type={AlertType.Warning}>
|
|
||||||
{stringGetter({ key: STRING_KEYS.CHECK_WALLET_FOR_REQUEST })}
|
|
||||||
</AlertMessage>
|
|
||||||
)}
|
|
||||||
<Styled.Footer>
|
<Styled.Footer>
|
||||||
<DepositButtonAndReceipt
|
<DepositButtonAndReceipt
|
||||||
isDisabled={isDisabled}
|
isDisabled={isDisabled}
|
||||||
@@ -398,8 +395,6 @@ export const DepositForm = ({ onDeposit, onError }: DepositFormProps) => {
|
|||||||
setSlippage={onSetSlippage}
|
setSlippage={onSetSlippage}
|
||||||
slippage={slippage}
|
slippage={slippage}
|
||||||
sourceToken={sourceToken || undefined}
|
sourceToken={sourceToken || undefined}
|
||||||
setRequireUserActionInWallet={setRequireUserActionInWallet}
|
|
||||||
setError={setError}
|
|
||||||
/>
|
/>
|
||||||
</Styled.Footer>
|
</Styled.Footer>
|
||||||
</Styled.Form>
|
</Styled.Form>
|
||||||
|
|||||||
@@ -1,7 +1,8 @@
|
|||||||
import { type Dispatch, type SetStateAction, useState, type ReactNode, useEffect } from 'react';
|
import { type Dispatch, type ReactNode, type SetStateAction, useState, useMemo } from 'react';
|
||||||
import styled, { type AnyStyledComponent } from 'styled-components';
|
import styled, { type AnyStyledComponent } from 'styled-components';
|
||||||
import { shallowEqual, useSelector } from 'react-redux';
|
import { shallowEqual, useSelector } from 'react-redux';
|
||||||
import type { RouteData } from '@0xsquid/sdk';
|
import type { RouteData } from '@0xsquid/sdk';
|
||||||
|
import { formatUnits } from 'viem';
|
||||||
|
|
||||||
import { ButtonAction, ButtonShape, ButtonSize, ButtonType } from '@/constants/buttons';
|
import { ButtonAction, ButtonShape, ButtonSize, ButtonType } from '@/constants/buttons';
|
||||||
|
|
||||||
@@ -11,7 +12,6 @@ import { NumberSign, TOKEN_DECIMALS } from '@/constants/numbers';
|
|||||||
|
|
||||||
import { useStringGetter, useTokenConfigs } from '@/hooks';
|
import { useStringGetter, useTokenConfigs } from '@/hooks';
|
||||||
import { useMatchingEvmNetwork } from '@/hooks/useMatchingEvmNetwork';
|
import { useMatchingEvmNetwork } from '@/hooks/useMatchingEvmNetwork';
|
||||||
import { useWalletConnection } from '@/hooks/useWalletConnection';
|
|
||||||
|
|
||||||
import { layoutMixins } from '@/styles/layoutMixins';
|
import { layoutMixins } from '@/styles/layoutMixins';
|
||||||
|
|
||||||
@@ -39,8 +39,7 @@ type ElementProps = {
|
|||||||
isLoading?: boolean;
|
isLoading?: boolean;
|
||||||
|
|
||||||
chainId?: string | number;
|
chainId?: string | number;
|
||||||
setError?: Dispatch<SetStateAction<Error | null>>;
|
setError?: Dispatch<SetStateAction<Error | undefined>>;
|
||||||
setRequireUserActionInWallet: (val: boolean) => void;
|
|
||||||
slippage: number;
|
slippage: number;
|
||||||
slotError?: ReactNode;
|
slotError?: ReactNode;
|
||||||
setSlippage: (slippage: number) => void;
|
setSlippage: (slippage: number) => void;
|
||||||
@@ -58,7 +57,6 @@ export const DepositButtonAndReceipt = ({
|
|||||||
isDisabled,
|
isDisabled,
|
||||||
isLoading,
|
isLoading,
|
||||||
slotError,
|
slotError,
|
||||||
setRequireUserActionInWallet,
|
|
||||||
}: ElementProps) => {
|
}: ElementProps) => {
|
||||||
const [showFeeBreakdown, setShowFeeBreakdown] = useState(false);
|
const [showFeeBreakdown, setShowFeeBreakdown] = useState(false);
|
||||||
const [isEditingSlippage, setIsEditingSlipapge] = useState(false);
|
const [isEditingSlippage, setIsEditingSlipapge] = useState(false);
|
||||||
@@ -66,24 +64,6 @@ export const DepositButtonAndReceipt = ({
|
|||||||
|
|
||||||
const canAccountTrade = useSelector(calculateCanAccountTrade, shallowEqual);
|
const canAccountTrade = useSelector(calculateCanAccountTrade, shallowEqual);
|
||||||
|
|
||||||
const { connectWallet, isConnectedWagmi } = useWalletConnection();
|
|
||||||
|
|
||||||
const connectWagmi = async () => {
|
|
||||||
try {
|
|
||||||
setRequireUserActionInWallet(false);
|
|
||||||
await connectWallet();
|
|
||||||
setRequireUserActionInWallet(false);
|
|
||||||
} catch (e) {
|
|
||||||
setRequireUserActionInWallet(true);
|
|
||||||
}
|
|
||||||
};
|
|
||||||
|
|
||||||
useEffect(() => {
|
|
||||||
if (!isConnectedWagmi && canAccountTrade) {
|
|
||||||
connectWagmi();
|
|
||||||
}
|
|
||||||
}, [isConnectedWagmi, canAccountTrade]);
|
|
||||||
|
|
||||||
const {
|
const {
|
||||||
matchNetwork: switchNetwork,
|
matchNetwork: switchNetwork,
|
||||||
isSwitchingNetwork,
|
isSwitchingNetwork,
|
||||||
@@ -100,7 +80,7 @@ export const DepositButtonAndReceipt = ({
|
|||||||
useSelector(getSubaccountBuyingPower, shallowEqual) || {};
|
useSelector(getSubaccountBuyingPower, shallowEqual) || {};
|
||||||
|
|
||||||
const { isCctp, summary, requestPayload } = useSelector(getTransferInputs, shallowEqual) || {};
|
const { isCctp, summary, requestPayload } = useSelector(getTransferInputs, shallowEqual) || {};
|
||||||
const { usdcLabel } = useTokenConfigs();
|
const { usdcDecimals, usdcLabel } = useTokenConfigs();
|
||||||
|
|
||||||
const feeSubitems: DetailsItem[] = [];
|
const feeSubitems: DetailsItem[] = [];
|
||||||
|
|
||||||
@@ -136,9 +116,7 @@ export const DepositButtonAndReceipt = ({
|
|||||||
{stringGetter({ key: STRING_KEYS.EXPECTED_DEPOSIT_AMOUNT })} <Tag>{usdcLabel}</Tag>
|
{stringGetter({ key: STRING_KEYS.EXPECTED_DEPOSIT_AMOUNT })} <Tag>{usdcLabel}</Tag>
|
||||||
</span>
|
</span>
|
||||||
),
|
),
|
||||||
value: (
|
value: <Output type={OutputType.Fiat} fractionDigits={TOKEN_DECIMALS} value={summary?.toAmount} />,
|
||||||
<Output type={OutputType.Fiat} fractionDigits={TOKEN_DECIMALS} value={summary?.toAmount} />
|
|
||||||
),
|
|
||||||
subitems: [
|
subitems: [
|
||||||
{
|
{
|
||||||
key: 'minimum-deposit-amount',
|
key: 'minimum-deposit-amount',
|
||||||
@@ -148,11 +126,7 @@ export const DepositButtonAndReceipt = ({
|
|||||||
</span>
|
</span>
|
||||||
),
|
),
|
||||||
value: (
|
value: (
|
||||||
<Output
|
<Output type={OutputType.Fiat} fractionDigits={TOKEN_DECIMALS} value={summary?.toAmountMin} />
|
||||||
type={OutputType.Fiat}
|
|
||||||
fractionDigits={TOKEN_DECIMALS}
|
|
||||||
value={summary?.toAmountMin}
|
|
||||||
/>
|
|
||||||
),
|
),
|
||||||
tooltip: 'minimum-deposit-amount',
|
tooltip: 'minimum-deposit-amount',
|
||||||
},
|
},
|
||||||
@@ -279,8 +253,6 @@ export const DepositButtonAndReceipt = ({
|
|||||||
>
|
>
|
||||||
{!canAccountTrade ? (
|
{!canAccountTrade ? (
|
||||||
<OnboardingTriggerButton size={ButtonSize.Base} />
|
<OnboardingTriggerButton size={ButtonSize.Base} />
|
||||||
) : !isConnectedWagmi ? (
|
|
||||||
<Button action={ButtonAction.Primary} onClick={connectWallet} state={{ isLoading: true }} />
|
|
||||||
) : !isMatchingNetwork ? (
|
) : !isMatchingNetwork ? (
|
||||||
<Button
|
<Button
|
||||||
action={ButtonAction.Primary}
|
action={ButtonAction.Primary}
|
||||||
|
|||||||
@@ -101,7 +101,11 @@ export const WithdrawForm = () => {
|
|||||||
});
|
});
|
||||||
|
|
||||||
return () => {
|
return () => {
|
||||||
abacusStateManager.resetInputState();
|
abacusStateManager.clearTransferInputValues();
|
||||||
|
abacusStateManager.setTransferValue({
|
||||||
|
field: TransferInputField.type,
|
||||||
|
value: null,
|
||||||
|
});
|
||||||
};
|
};
|
||||||
}, []);
|
}, []);
|
||||||
|
|
||||||
|
|||||||
@@ -118,7 +118,11 @@ export const TransferForm = ({
|
|||||||
onChangeAsset(selectedAsset);
|
onChangeAsset(selectedAsset);
|
||||||
|
|
||||||
return () => {
|
return () => {
|
||||||
abacusStateManager.resetInputState();
|
abacusStateManager.clearTransferInputValues();
|
||||||
|
abacusStateManager.setTransferValue({
|
||||||
|
field: TransferInputField.type,
|
||||||
|
value: null,
|
||||||
|
});
|
||||||
};
|
};
|
||||||
}, []);
|
}, []);
|
||||||
|
|
||||||
|
|||||||
Reference in New Issue
Block a user