Compare commits
6
Commits
| Author | SHA1 | Date | |
|---|---|---|---|
|
|
464f8165d6 | ||
|
|
1eed6e3e5c | ||
|
|
483ea78260 | ||
|
|
eceaea5235 | ||
|
|
ab04f262ab | ||
|
|
0dae28d605 |
+2
-3
@@ -13,7 +13,6 @@
|
||||
"build:inject-app-deeplinks": "sh scripts/inject-app-deeplinks.sh",
|
||||
"build:inject-amplitude": "node scripts/inject-amplitude.js",
|
||||
"build:inject-bugsnag": "node scripts/inject-bugsnag.js",
|
||||
"build:inject-intercom": "node scripts/inject-intercom.js",
|
||||
"build:inject-statuspage": "node scripts/inject-statuspage.js",
|
||||
"deploy:ipfs": "node scripts/upload-ipfs.js --verbose",
|
||||
"deploy:update-ipns": "node scripts/update-ipns.js",
|
||||
@@ -39,9 +38,9 @@
|
||||
"@cosmjs/proto-signing": "^0.31.0",
|
||||
"@cosmjs/stargate": "^0.31.0",
|
||||
"@cosmjs/tendermint-rpc": "^0.31.0",
|
||||
"@dydxprotocol/v4-abacus": "^0.7.6",
|
||||
"@dydxprotocol/v4-abacus": "^0.7.2",
|
||||
"@dydxprotocol/v4-client-js": "^0.40.3",
|
||||
"@dydxprotocol/v4-localization": "^0.1.32",
|
||||
"@dydxprotocol/v4-localization": "^0.1.30",
|
||||
"@ethersproject/providers": "^5.7.2",
|
||||
"@js-joda/core": "^5.5.3",
|
||||
"@radix-ui/react-collapsible": "^1.0.3",
|
||||
|
||||
Generated
+8
-8
@@ -27,14 +27,14 @@ dependencies:
|
||||
specifier: ^0.31.0
|
||||
version: 0.31.0
|
||||
'@dydxprotocol/v4-abacus':
|
||||
specifier: ^0.7.6
|
||||
version: 0.7.6
|
||||
specifier: ^0.7.2
|
||||
version: 0.7.2
|
||||
'@dydxprotocol/v4-client-js':
|
||||
specifier: ^0.40.3
|
||||
version: 0.40.3
|
||||
'@dydxprotocol/v4-localization':
|
||||
specifier: ^0.1.32
|
||||
version: 0.1.32
|
||||
specifier: ^0.1.30
|
||||
version: 0.1.30
|
||||
'@ethersproject/providers':
|
||||
specifier: ^5.7.2
|
||||
version: 5.7.2
|
||||
@@ -979,8 +979,8 @@ packages:
|
||||
resolution: {integrity: sha512-RpfLEtTlyIxeNPGKcokS+p3BZII/Q3bYxryFRglh5H3A3T8q9fsLYm72VYAMEOOIBLEa8o93kFLiBDUWKrwXZA==}
|
||||
dev: true
|
||||
|
||||
/@dydxprotocol/v4-abacus@0.7.6:
|
||||
resolution: {integrity: sha512-FdDXRaFMfxhyrJJs0dNrb1KG6X95lPHelua1yCn/SVgzwGaAqlJczrzmdh98INntuRAgIxOu69R5mCGyekumyg==}
|
||||
/@dydxprotocol/v4-abacus@0.7.2:
|
||||
resolution: {integrity: sha512-5foamomN82FH6ko3EuzwFlSoAEY6Sal8fDgvZo2RsB19Ks6SFgFDeeOcEDdfoa3DNwvl8yW0C9cfxeQ+BfU8uA==}
|
||||
dev: false
|
||||
|
||||
/@dydxprotocol/v4-client-js@0.40.3:
|
||||
@@ -1011,8 +1011,8 @@ packages:
|
||||
- utf-8-validate
|
||||
dev: false
|
||||
|
||||
/@dydxprotocol/v4-localization@0.1.32:
|
||||
resolution: {integrity: sha512-ZtXScxgFLjUt0Ag52RyFnQe9aEl1Aky5fp+vMGOBduVkFiCEMRMkSsSgg6grMdyw/x0AbnxOTRkhYoX2MsK9Ow==}
|
||||
/@dydxprotocol/v4-localization@0.1.30:
|
||||
resolution: {integrity: sha512-xTlQuQmPz7wfGkjd07giYMAxRrolDbJE3DryJSIMB6R1MBq1wLzAcwp/iR/nELRwilRX9c44Tap0gGt+oAajiQ==}
|
||||
dev: false
|
||||
|
||||
/@dydxprotocol/v4-proto@0.4.1:
|
||||
|
||||
+3
-73
@@ -56,15 +56,15 @@
|
||||
"endpoints": {
|
||||
"indexers": [
|
||||
{
|
||||
"api": "https://indexer.v4dev.dydx.exchange",
|
||||
"api": "http://indexer.v4dev.dydx.exchange",
|
||||
"socket": "wss://indexer.v4dev.dydx.exchange"
|
||||
}
|
||||
],
|
||||
"validators": [
|
||||
"https://validator.v4dev.dydx.exchange"
|
||||
"http://validator.v4dev.dydx.exchange"
|
||||
],
|
||||
"0xsquid": "https://testnet.api.0xsquid.com",
|
||||
"faucet": "https://faucet.v4dev.dydx.exchange"
|
||||
"faucet": "http://faucet.v4dev.dydx.exchange"
|
||||
},
|
||||
"links": {
|
||||
"tos": "https://dydx.exchange/v4-terms",
|
||||
@@ -331,76 +331,6 @@
|
||||
"signTypedDataDomainName": "dYdX Chain"
|
||||
}
|
||||
},
|
||||
"dydxprotocol-staging-forced-update": {
|
||||
"name": "v4 Staging Forced Update",
|
||||
"ethereumChainId": "5",
|
||||
"dydxChainId": "dydxprotocol-testnet",
|
||||
"chainName": "dYdX Chain",
|
||||
"chainLogo": "dydx-chain.png",
|
||||
"isMainNet": false,
|
||||
"tokens": {
|
||||
"chain": {
|
||||
"name": "Dv4TNT",
|
||||
"denom": "adv4tnt",
|
||||
"decimals": 18,
|
||||
"image": "/currencies/dydx.png"
|
||||
},
|
||||
"usdc": {
|
||||
"name": "USDC",
|
||||
"denom": "ibc/8E27BA2D5493AF5636760E354E46004562C46AB7EC0CC4C1CA14E9E20E2545B5",
|
||||
"gasDenom": "uusdc",
|
||||
"decimals": 6,
|
||||
"image": "/currencies/usdc.png"
|
||||
}
|
||||
},
|
||||
"endpoints": {
|
||||
"indexers": [
|
||||
{
|
||||
"api": "https://indexer.v4staging.dydx.exchange",
|
||||
"socket": "wss://indexer.v4staging.dydx.exchange"
|
||||
}
|
||||
],
|
||||
"faucet": "https://faucet.v4staging.dydx.exchange",
|
||||
"validators": [
|
||||
"https://validator.v4staging.dydx.exchange"
|
||||
],
|
||||
"0xsquid": "https://testnet.api.squidrouter.com"
|
||||
},
|
||||
"links": {
|
||||
"tos": "https://dydx.exchange/v4-terms",
|
||||
"privacy": "https://dydx.exchange/privacy",
|
||||
"mintscan": "https://testnet.mintscan.io/dydx-testnet/txs/{tx_hash}",
|
||||
"documentation": "https://v4-teacher.vercel.app/",
|
||||
"community": "https://discord.com/invite/dydx",
|
||||
"feedback": "https://docs.google.com/forms/d/e/1FAIpQLSezLsWCKvAYDEb7L-2O4wOON1T56xxro9A2Azvl6IxXHP_15Q/viewform",
|
||||
"blogs": "https://www.dydx.foundation/blog"
|
||||
},
|
||||
"wallets": {
|
||||
"walletconnect": {
|
||||
"client": {
|
||||
"name": "dYdX v4",
|
||||
"description": "dYdX v4 App",
|
||||
"iconUrl": "/logos/dydx-x.png"
|
||||
},
|
||||
"v2": {
|
||||
"projectId": "47559b2ec96c09aed9ff2cb54a31ab0e"
|
||||
}
|
||||
},
|
||||
"walletSegue": {
|
||||
"callbackUrl": "/walletsegue"
|
||||
},
|
||||
"images": "/wallets/",
|
||||
"signTypedDataAction": "dYdX Chain Onboarding",
|
||||
"signTypedDataDomainName": "dYdX Chain"
|
||||
},
|
||||
"apps": {
|
||||
"ios": {
|
||||
"minimalVersion": "1.0",
|
||||
"build":40000,
|
||||
"url": "https://apps.apple.com/app/dydx/id1564787350"
|
||||
}
|
||||
}
|
||||
},
|
||||
"dydxprotocol-staging-west": {
|
||||
"name": "v4 Staging West",
|
||||
"ethereumChainId": "5",
|
||||
|
||||
@@ -1,76 +0,0 @@
|
||||
/* eslint-disable no-console */
|
||||
import fs from 'fs/promises';
|
||||
import path from 'path';
|
||||
import { fileURLToPath } from 'url';
|
||||
|
||||
const INTERCOM_APP_ID = process.env.INTERCOM_APP_ID;
|
||||
|
||||
const currentPath = fileURLToPath(import.meta.url);
|
||||
const projectRoot = path.dirname(currentPath);
|
||||
const htmlFilePath = path.resolve(projectRoot, '../dist/index.html');
|
||||
|
||||
if (INTERCOM_APP_ID) {
|
||||
try {
|
||||
const html = await fs.readFile(htmlFilePath, 'utf-8');
|
||||
|
||||
const intercomScripts = `
|
||||
<!-- Intercom -->
|
||||
<script>
|
||||
window.intercomSettings = {
|
||||
api_base: 'https://api-iam.intercom.io',
|
||||
app_id: '${INTERCOM_APP_ID}',
|
||||
custom_launcher_selector: '.custom_intercom',
|
||||
hide_default_launcher: true,
|
||||
};
|
||||
</script>
|
||||
|
||||
<script>
|
||||
// We pre-filled your app ID in the widget URL: 'https://widget.intercom.io/widget/${INTERCOM_APP_ID}'
|
||||
(function () {
|
||||
var w = window;
|
||||
var ic = w.Intercom;
|
||||
if (typeof ic === 'function') {
|
||||
ic('reattach_activator');
|
||||
ic('update', w.intercomSettings);
|
||||
} else {
|
||||
var d = document;
|
||||
var i = function () {
|
||||
i.c(arguments);
|
||||
};
|
||||
i.q = [];
|
||||
i.c = function (args) {
|
||||
i.q.push(args);
|
||||
};
|
||||
w.Intercom = i;
|
||||
var l = function () {
|
||||
var s = d.createElement('script');
|
||||
s.type = 'text/javascript';
|
||||
s.async = true;
|
||||
s.src = 'https://widget.intercom.io/widget/${INTERCOM_APP_ID}';
|
||||
var x = d.getElementsByTagName('script')[0];
|
||||
x.parentNode.insertBefore(s, x);
|
||||
};
|
||||
if (document.readyState === 'complete') {
|
||||
l();
|
||||
} else if (w.attachEvent) {
|
||||
w.attachEvent('onload', l);
|
||||
} else {
|
||||
w.addEventListener('load', l, false);
|
||||
}
|
||||
}
|
||||
})();
|
||||
</script>
|
||||
`;
|
||||
|
||||
const injectedHtml = html.replace(
|
||||
'<div id="root"></div>',
|
||||
`<div id="root"></div>\n${intercomScripts}\n`
|
||||
);
|
||||
|
||||
await fs.writeFile(htmlFilePath, injectedHtml, 'utf-8');
|
||||
|
||||
console.log('Intercom scripts successfully injected.');
|
||||
} catch (err) {
|
||||
console.error('Error injecting Intercom scripts:', err);
|
||||
}
|
||||
}
|
||||
@@ -3,43 +3,31 @@ import styled, { AnyStyledComponent } from 'styled-components';
|
||||
|
||||
import { type MenuConfig } from '@/constants/menus';
|
||||
|
||||
import { Dialog, DialogPlacement, type DialogProps } from '@/components/Dialog';
|
||||
import { ComboboxMenu, type ComboboxMenuProps } from '@/components/ComboboxMenu';
|
||||
import { Dialog, DialogPlacement } from '@/components/Dialog';
|
||||
import { ComboboxMenu } from '@/components/ComboboxMenu';
|
||||
|
||||
type ElementProps<MenuItemValue extends string | number, MenuGroupValue extends string | number> = {
|
||||
isOpen?: boolean;
|
||||
setIsOpen?: (open: boolean) => void;
|
||||
title?: React.ReactNode;
|
||||
description?: React.ReactNode;
|
||||
slotTrigger?: React.ReactNode;
|
||||
slotHeaderInner?: React.ReactNode;
|
||||
slotFooter?: React.ReactNode;
|
||||
children?: React.ReactNode;
|
||||
|
||||
items: MenuConfig<MenuItemValue, MenuGroupValue>;
|
||||
onItemSelected?: () => void;
|
||||
inputPlaceholder?: string;
|
||||
slotEmpty?: React.ReactNode;
|
||||
};
|
||||
|
||||
type StyleProps = {
|
||||
placement: DialogPlacement,
|
||||
className?: string;
|
||||
};
|
||||
|
||||
type PickComboxMenuProps<
|
||||
MenuItemValue extends string | number,
|
||||
MenuGroupValue extends string | number
|
||||
> = Pick<
|
||||
ComboboxMenuProps<MenuItemValue, MenuGroupValue>,
|
||||
'inputPlaceholder' | 'onItemSelected' | 'slotEmpty' | 'withSearch' | 'withStickyLayout'
|
||||
>;
|
||||
|
||||
type PickDialogProps = Pick<
|
||||
DialogProps,
|
||||
| 'description'
|
||||
| 'isOpen'
|
||||
| 'placement'
|
||||
| 'setIsOpen'
|
||||
| 'slotHeaderInner'
|
||||
| 'slotTrigger'
|
||||
| 'slotFooter'
|
||||
>;
|
||||
|
||||
export const ComboboxDialogMenu = <
|
||||
MenuItemValue extends string | number,
|
||||
MenuGroupValue extends string | number
|
||||
>({
|
||||
export const ComboboxDialogMenu = <MenuItemValue extends string | number, MenuGroupValue extends string | number>({
|
||||
isOpen = false,
|
||||
setIsOpen,
|
||||
title,
|
||||
@@ -52,16 +40,11 @@ export const ComboboxDialogMenu = <
|
||||
onItemSelected,
|
||||
inputPlaceholder,
|
||||
slotEmpty,
|
||||
withSearch,
|
||||
withStickyLayout = true,
|
||||
children,
|
||||
|
||||
|
||||
placement = DialogPlacement.Default,
|
||||
className,
|
||||
}: ElementProps<MenuItemValue, MenuGroupValue> &
|
||||
PickComboxMenuProps<MenuItemValue, MenuGroupValue> &
|
||||
PickDialogProps &
|
||||
StyleProps) => (
|
||||
}: ElementProps<MenuItemValue, MenuGroupValue> & StyleProps) => (
|
||||
// TODO: sub-menu state management
|
||||
<Styled.Dialog
|
||||
isOpen={isOpen}
|
||||
@@ -71,6 +54,7 @@ export const ComboboxDialogMenu = <
|
||||
slotHeaderInner={slotHeaderInner}
|
||||
slotTrigger={slotTrigger}
|
||||
slotFooter={slotFooter}
|
||||
|
||||
placement={placement}
|
||||
className={className}
|
||||
>
|
||||
@@ -80,8 +64,7 @@ export const ComboboxDialogMenu = <
|
||||
title={title}
|
||||
inputPlaceholder={inputPlaceholder}
|
||||
slotEmpty={slotEmpty}
|
||||
withSearch={withSearch}
|
||||
withStickyLayout={withStickyLayout}
|
||||
withStickyLayout
|
||||
/>
|
||||
{children}
|
||||
</Styled.Dialog>
|
||||
@@ -115,5 +98,4 @@ Styled.Dialog = styled(Dialog)`
|
||||
|
||||
Styled.ComboboxMenu = styled(ComboboxMenu)`
|
||||
--comboboxMenu-backgroundColor: var(--comboboxDialogMenu-backgroundColor);
|
||||
--comboboxMenu-item-gap: var(--comboxDialogMenu-item-gap, 0.5rem);
|
||||
`;
|
||||
|
||||
@@ -8,7 +8,7 @@ import { layoutMixins } from '@/styles/layoutMixins';
|
||||
|
||||
import { Tag } from '@/components/Tag';
|
||||
|
||||
type ElementProps<MenuItemValue extends string | number, MenuGroupValue extends string | number> = {
|
||||
type ElementProps<MenuItemValue extends string, MenuGroupValue extends string> = {
|
||||
items: MenuConfig<MenuItemValue, MenuGroupValue>;
|
||||
onItemSelected?: () => void;
|
||||
|
||||
@@ -23,11 +23,6 @@ type StyleProps = {
|
||||
withStickyLayout?: boolean;
|
||||
};
|
||||
|
||||
export type ComboboxMenuProps<
|
||||
MenuItemValue extends string | number,
|
||||
MenuGroupValue extends string | number
|
||||
> = ElementProps<MenuItemValue, MenuGroupValue> & StyleProps;
|
||||
|
||||
export const ComboboxMenu = <MenuItemValue extends string, MenuGroupValue extends string>({
|
||||
items,
|
||||
onItemSelected,
|
||||
@@ -39,7 +34,7 @@ export const ComboboxMenu = <MenuItemValue extends string, MenuGroupValue extend
|
||||
|
||||
className,
|
||||
withStickyLayout,
|
||||
}: ComboboxMenuProps<MenuItemValue, MenuGroupValue>) => {
|
||||
}: ElementProps<MenuItemValue, MenuGroupValue> & StyleProps) => {
|
||||
const [highlightedCommand, setHighlightedCommand] = useState<MenuItemValue>();
|
||||
const [searchValue, setSearchValue] = useState('');
|
||||
// const inputRef = useRef<HTMLInputElement | null>(null);
|
||||
@@ -176,7 +171,6 @@ Styled.Command = styled(Command)<{ $withStickyLayout?: boolean }>`
|
||||
--comboboxMenu-item-highlighted-backgroundColor: var(--color-layer-3);
|
||||
--comboboxMenu-item-highlighted-textColor: var(--color-text-1);
|
||||
--comboboxMenu-item-backgroundColor: ;
|
||||
--comboboxMenu-item-gap: 0.5rem;
|
||||
|
||||
display: grid;
|
||||
align-content: start;
|
||||
@@ -275,17 +269,18 @@ Styled.List = styled(Command.List)<{ $withStickyLayout?: boolean }>`
|
||||
`;
|
||||
|
||||
Styled.Item = styled(Command.Item)`
|
||||
${layoutMixins.scrollSnapItem}
|
||||
${popoverMixins.item}
|
||||
--item-checked-backgroundColor: var(--comboboxMenu-item-checked-backgroundColor);
|
||||
--item-checked-textColor: var(--comboboxMenu-item-checked-textColor);
|
||||
--item-highlighted-textColor: var(--comboboxMenu-item-highlighted-textColor);
|
||||
--item-gap: var(--comboboxMenu-item-gap);
|
||||
|
||||
${layoutMixins.scrollSnapItem}
|
||||
|
||||
background-color: var(--comboboxMenu-backgroundColor, inherit);
|
||||
|
||||
display: flex;
|
||||
align-items: center;
|
||||
gap: 0.5rem;
|
||||
|
||||
&[aria-disabled='true'] {
|
||||
opacity: 0.75;
|
||||
|
||||
@@ -48,8 +48,6 @@ type StyleProps = {
|
||||
className?: string;
|
||||
};
|
||||
|
||||
export type DialogProps = ElementProps & StyleProps;
|
||||
|
||||
const DialogPortal = ({
|
||||
withPortal,
|
||||
container,
|
||||
@@ -84,7 +82,7 @@ export const Dialog = ({
|
||||
hasHeaderBorder = false,
|
||||
children,
|
||||
className,
|
||||
}: DialogProps) => {
|
||||
}: ElementProps & StyleProps) => {
|
||||
const closeButtonRef = useRef<HTMLButtonElement>();
|
||||
|
||||
const showOverlay = ![DialogPlacement.Inline, DialogPlacement.FullScreen].includes(placement);
|
||||
|
||||
@@ -13,7 +13,6 @@ import {
|
||||
CaretIcon,
|
||||
CautionCircleStrokeIcon,
|
||||
CautionCircleIcon,
|
||||
ChatIcon,
|
||||
CheckIcon,
|
||||
ChevronLeftIcon,
|
||||
ChevronRightIcon,
|
||||
@@ -81,7 +80,6 @@ export enum IconName {
|
||||
Caret = 'Caret',
|
||||
CautionCircle = 'CautionCircle',
|
||||
CautionCircleStroked = 'CautionCircleStroked',
|
||||
Chat = 'Chat',
|
||||
Check = 'Check',
|
||||
ChevronLeft = 'ChevronLeft',
|
||||
ChevronRight = 'ChevronRight',
|
||||
@@ -150,7 +148,6 @@ const icons = {
|
||||
[IconName.Caret]: CaretIcon,
|
||||
[IconName.CautionCircle]: CautionCircleIcon,
|
||||
[IconName.CautionCircleStroked]: CautionCircleStrokeIcon,
|
||||
[IconName.Chat]: ChatIcon,
|
||||
[IconName.Check]: CheckIcon,
|
||||
[IconName.ChevronLeft]: ChevronLeftIcon,
|
||||
[IconName.ChevronRight]: ChevronRightIcon,
|
||||
|
||||
@@ -44,4 +44,4 @@ export type EvmDerivedAddresses = {
|
||||
};
|
||||
};
|
||||
|
||||
export const AMOUNT_RESERVED_FOR_GAS_USDC = 0.1;
|
||||
export const AMOUNT_RESERVED_FOR_GAS_USDC = 100_000;
|
||||
|
||||
@@ -21,7 +21,7 @@ export type MenuItem<MenuItemValue, MenuItemTypes = string> = {
|
||||
value: MenuItemValue;
|
||||
|
||||
slotBefore?: React.ReactNode;
|
||||
label: React.ReactNode;
|
||||
label: string;
|
||||
labelRight?: React.ReactNode;
|
||||
tag?: React.ReactNode;
|
||||
slotAfter?: React.ReactNode;
|
||||
|
||||
@@ -6,6 +6,7 @@ import { useQuery } from 'react-query';
|
||||
import { formatUnits } from 'viem';
|
||||
|
||||
import { ENVIRONMENT_CONFIG_MAP } from '@/constants/networks';
|
||||
import { QUANTUM_MULTIPLIER } from '@/constants/numbers';
|
||||
import { EvmAddress } from '@/constants/wallets';
|
||||
|
||||
import { convertBech32Address } from '@/lib/addressUtils';
|
||||
@@ -20,6 +21,7 @@ import { useTokenConfigs } from './useTokenConfigs';
|
||||
type UseAccountBalanceProps = {
|
||||
// Token Items
|
||||
addressOrDenom?: string;
|
||||
assetSymbol?: string;
|
||||
decimals?: number;
|
||||
|
||||
// Chain Items
|
||||
@@ -38,6 +40,7 @@ export const CHAIN_DEFAULT_TOKEN_ADDRESS = '0xEeeeeEeeeEeEeeEeEeEeeEEEeeeeEeeeee
|
||||
|
||||
export const useAccountBalance = ({
|
||||
addressOrDenom,
|
||||
assetSymbol,
|
||||
bech32AddrPrefix,
|
||||
chainId,
|
||||
decimals = 0,
|
||||
@@ -88,7 +91,7 @@ export const useAccountBalance = ({
|
||||
});
|
||||
|
||||
const { formatted: evmBalance } = evmQuery.data || {};
|
||||
const balance = isCosmosChain ? cosmosQuery.data : evmBalance;
|
||||
const balance = !assetSymbol ? '0' : isCosmosChain ? cosmosQuery.data : evmBalance;
|
||||
|
||||
const nativeTokenCoinBalance = balances?.[chainTokenDenom];
|
||||
const nativeTokenBalance = MustBigNumber(nativeTokenCoinBalance?.amount);
|
||||
|
||||
@@ -15,8 +15,6 @@ import type { ResolutionString } from 'public/tradingview/charting_library';
|
||||
|
||||
import type { ConnectNetworkEvent, NetworkConfig } from '@/constants/abacus';
|
||||
import { type Candle, RESOLUTION_MAP } from '@/constants/candles';
|
||||
import { ENVIRONMENT_CONFIG_MAP } from '@/constants/networks';
|
||||
import { DydxChainAsset } from '@/constants/wallets';
|
||||
|
||||
import { getSelectedNetwork } from '@/state/appSelectors';
|
||||
|
||||
@@ -38,7 +36,6 @@ const useDydxClientContext = () => {
|
||||
// ------ Network ------ //
|
||||
|
||||
const selectedNetwork = useSelector(getSelectedNetwork);
|
||||
const tokensConfigs = ENVIRONMENT_CONFIG_MAP[selectedNetwork].tokens;
|
||||
|
||||
const [networkConfig, setNetworkConfig] = useState<NetworkConfig>();
|
||||
|
||||
@@ -68,14 +65,7 @@ const useDydxClientContext = () => {
|
||||
new Network(
|
||||
selectedNetwork,
|
||||
new IndexerConfig(networkConfig.indexerUrl, networkConfig.websocketUrl),
|
||||
new ValidatorConfig(networkConfig.validatorUrl, networkConfig.chainId,
|
||||
{
|
||||
USDC_DENOM: tokensConfigs[DydxChainAsset.USDC].denom,
|
||||
USDC_DECIMALS: tokensConfigs[DydxChainAsset.USDC].decimals,
|
||||
USDC_GAS_DENOM: tokensConfigs[DydxChainAsset.USDC].gasDenom,
|
||||
CHAINTOKEN_DENOM: tokensConfigs[DydxChainAsset.CHAINTOKEN].denom,
|
||||
CHAINTOKEN_DECIMALS: tokensConfigs[DydxChainAsset.CHAINTOKEN].decimals,
|
||||
}, {
|
||||
new ValidatorConfig(networkConfig.validatorUrl, networkConfig.chainId, {
|
||||
broadcastPollIntervalMs: 3_000,
|
||||
broadcastTimeoutMs: 60_000,
|
||||
})
|
||||
|
||||
@@ -74,12 +74,13 @@ export const useSubaccountContext = ({ localDydxWallet }: { localDydxWallet?: Lo
|
||||
() => ({
|
||||
depositToSubaccount: async ({
|
||||
subaccountClient,
|
||||
assetId = 0,
|
||||
amount,
|
||||
}: {
|
||||
subaccountClient: SubaccountClient;
|
||||
assetId?: number;
|
||||
amount: number;
|
||||
}) => await compositeClient?.depositToSubaccount(subaccountClient, amount.toString()),
|
||||
amount: Long;
|
||||
}) => await compositeClient?.validatorClient.post.deposit(subaccountClient, assetId, amount),
|
||||
|
||||
withdrawFromSubaccount: async ({
|
||||
subaccountClient,
|
||||
@@ -200,9 +201,13 @@ export const useSubaccountContext = ({ localDydxWallet }: { localDydxWallet?: Lo
|
||||
async (balance: AccountBalance) => {
|
||||
if (!localDydxWallet) return;
|
||||
|
||||
const amount = parseFloat(balance.amount) - AMOUNT_RESERVED_FOR_GAS_USDC;
|
||||
const amountAfterDust = MustBigNumber(balance.amount)
|
||||
.minus(AMOUNT_RESERVED_FOR_GAS_USDC) // keep 0.1 USDC in user's wallet for gas
|
||||
.toString();
|
||||
|
||||
if (amount > 0) {
|
||||
const amount = Long.fromString(amountAfterDust || '0');
|
||||
|
||||
if (amount.greaterThan(Long.ZERO)) {
|
||||
const subaccountClient = new SubaccountClient(localDydxWallet, 0);
|
||||
await depositToSubaccount({ amount, subaccountClient });
|
||||
}
|
||||
@@ -220,7 +225,7 @@ export const useSubaccountContext = ({ localDydxWallet }: { localDydxWallet?: Lo
|
||||
}, [usdcCoinBalance]);
|
||||
|
||||
const deposit = useCallback(
|
||||
async (amount: number) => {
|
||||
async (amount: Long) => {
|
||||
if (!subaccountClient) {
|
||||
return;
|
||||
}
|
||||
|
||||
@@ -9,13 +9,11 @@ export const useTokenConfigs = (): {
|
||||
denom: string;
|
||||
name: string;
|
||||
decimals: number;
|
||||
gasDenom?: string;
|
||||
},
|
||||
[DydxChainAsset.CHAINTOKEN]: {
|
||||
denom: string;
|
||||
name: string;
|
||||
decimals: number;
|
||||
gasDenom?: string;
|
||||
},
|
||||
};
|
||||
usdcDenom: string;
|
||||
|
||||
@@ -1 +0,0 @@
|
||||
<svg width="18" height="18" viewBox="0 0 18 18" fill="none" xmlns="http://www.w3.org/2000/svg"><path d="M5.625 6.1875h6.75m-6.75 2.25H9M1.6875 9.57c0 1.2.84225 2.2455 2.03025 2.4203.84675.1245 1.7025.2197 2.56725.2842.2625.0195.5025.1575.64875.3758L9 15.75l2.0663-3.0997c.0724-.1078.1685-.1977.2809-.2628.1125-.0651.2382-.1038.3678-.113.8589-.0641 1.7152-.1589 2.5672-.2842 1.188-.1748 2.0303-1.2195 2.0303-2.42105v-4.5135c0-1.2015-.8423-2.24625-2.0303-2.421A36.294434 36.294434 0 0 0 9 2.25c-1.794 0-3.558.13125-5.28225.38475-1.188.17475-2.03025 1.22025-2.03025 2.421V9.57Z" stroke="currentColor" stroke-width="1.5" stroke-linecap="round" stroke-linejoin="round"/></svg>
|
||||
|
Before Width: | Height: | Size: 672 B |
@@ -1 +1 @@
|
||||
<svg width="16" height="16" viewBox="0 0 16 16" fill="none" xmlns="http://www.w3.org/2000/svg"><path fill-rule="evenodd" clip-rule="evenodd" d="M15 8C15 9.53527 14.6867 10.8758 14.2269 11.7954C13.77 12.7092 13.3116 12.9664 13.0527 12.9968L12.6636 12.8953C12.4116 12.7511 12.092 12.4331 11.7731 11.7954C11.3133 10.8758 11 9.53527 11 8C11 6.46473 11.3133 5.12424 11.7731 4.20457C12.0924 3.56607 12.4124 3.24815 12.6645 3.10417L13.0519 3.00311C13.3107 3.0331 13.7696 3.28991 14.2269 4.20457C14.6867 5.12424 15 6.46473 15 8ZM12.2928 2.16768L1.41963 5.00415C0.628571 5.08768 0 6.39699 0 7.99992C0 9.60346 0.629045 10.9131 1.42053 10.9958L2.50023 11.2774V12.9998C2.50023 13.8283 3.17181 14.4998 4.00023 14.4998C4.82866 14.4998 5.50023 13.8283 5.50023 12.9998V12.0601L12.2914 13.8317C12.5186 13.9417 12.7559 14 13 14C14.6569 14 16 11.3137 16 8C16 4.68629 14.6569 2 13 2C12.7564 2 12.5196 2.05808 12.2928 2.16768ZM10.9931 3.5402L2.49607 5.75681C2.80523 6.30634 3 7.10764 3 7.99992C3 8.89214 2.80525 9.69339 2.49614 10.2429L10.9929 12.4595C10.3833 11.3612 10 9.77013 10 8C10 6.22968 10.3834 4.63843 10.9931 3.5402ZM2 7.99992C2 8.70677 1.85462 9.29725 1.66623 9.67403C1.59961 9.80728 1.54246 9.88955 1.5 9.93955C1.45754 9.88955 1.40039 9.80728 1.33377 9.67403C1.14538 9.29725 1 8.70677 1 7.99992C1 7.29308 1.14538 6.70259 1.33377 6.32582C1.40039 6.19256 1.45754 6.11029 1.5 6.06029C1.54246 6.11029 1.59961 6.19256 1.66623 6.32582C1.85462 6.70259 2 7.29308 2 7.99992ZM1.41964 10.0124C1.41962 10.0124 1.42071 10.0118 1.42296 10.0109C1.42079 10.0121 1.41966 10.0125 1.41964 10.0124ZM1.57704 10.0109C1.57929 10.0118 1.58038 10.0124 1.58036 10.0124C1.58033 10.0125 1.57921 10.0121 1.57704 10.0109ZM1.58036 5.9874C1.58038 5.98747 1.57929 5.98808 1.57704 5.98899C1.57921 5.98778 1.58034 5.98732 1.58036 5.9874ZM1.42296 5.98899C1.42071 5.98808 1.41962 5.98747 1.41964 5.9874C1.41966 5.98732 1.42079 5.98778 1.42296 5.98899ZM3.50023 12.9998V11.5383L4.50023 11.7992V12.9998C4.50023 13.276 4.27638 13.4998 4.00023 13.4998C3.72409 13.4998 3.50023 13.276 3.50023 12.9998Z" fill="currentColor"/></svg>
|
||||
<svg viewBox="0 0 16 16" fill="none" xmlns="http://www.w3.org/2000/svg"><path fill-rule="evenodd" clip-rule="evenodd" d="M15 8C15 9.53527 14.6867 10.8758 14.2269 11.7954C13.77 12.7092 13.3116 12.9664 13.0527 12.9968L12.6636 12.8953C12.4116 12.7511 12.092 12.4331 11.7731 11.7954C11.3133 10.8758 11 9.53527 11 8C11 6.46473 11.3133 5.12424 11.7731 4.20457C12.0924 3.56607 12.4124 3.24815 12.6645 3.10417L13.0519 3.00311C13.3107 3.0331 13.7696 3.28991 14.2269 4.20457C14.6867 5.12424 15 6.46473 15 8ZM12.2928 2.16768L1.41963 5.00415C0.628571 5.08768 0 6.39699 0 7.99992C0 9.60346 0.629045 10.9131 1.42053 10.9958L2.50023 11.2774V12.9998C2.50023 13.8283 3.17181 14.4998 4.00023 14.4998C4.82866 14.4998 5.50023 13.8283 5.50023 12.9998V12.0601L12.2914 13.8317C12.5186 13.9417 12.7559 14 13 14C14.6569 14 16 11.3137 16 8C16 4.68629 14.6569 2 13 2C12.7564 2 12.5196 2.05808 12.2928 2.16768ZM10.9931 3.5402L2.49607 5.75681C2.80523 6.30634 3 7.10764 3 7.99992C3 8.89214 2.80525 9.69339 2.49614 10.2429L10.9929 12.4595C10.3833 11.3612 10 9.77013 10 8C10 6.22968 10.3834 4.63843 10.9931 3.5402ZM2 7.99992C2 8.70677 1.85462 9.29725 1.66623 9.67403C1.59961 9.80728 1.54246 9.88955 1.5 9.93955C1.45754 9.88955 1.40039 9.80728 1.33377 9.67403C1.14538 9.29725 1 8.70677 1 7.99992C1 7.29308 1.14538 6.70259 1.33377 6.32582C1.40039 6.19256 1.45754 6.11029 1.5 6.06029C1.54246 6.11029 1.59961 6.19256 1.66623 6.32582C1.85462 6.70259 2 7.29308 2 7.99992ZM1.41964 10.0124C1.41962 10.0124 1.42071 10.0118 1.42296 10.0109C1.42079 10.0121 1.41966 10.0125 1.41964 10.0124ZM1.57704 10.0109C1.57929 10.0118 1.58038 10.0124 1.58036 10.0124C1.58033 10.0125 1.57921 10.0121 1.57704 10.0109ZM1.58036 5.9874C1.58038 5.98747 1.57929 5.98808 1.57704 5.98899C1.57921 5.98778 1.58034 5.98732 1.58036 5.9874ZM1.42296 5.98899C1.42071 5.98808 1.41962 5.98747 1.41964 5.9874C1.41966 5.98732 1.42079 5.98778 1.42296 5.98899ZM3.50023 12.9998V11.5383L4.50023 11.7992V12.9998C4.50023 13.276 4.27638 13.4998 4.00023 13.4998C3.72409 13.4998 3.50023 13.276 3.50023 12.9998Z" fill="currentColor"/></svg>
|
||||
|
||||
|
Before Width: | Height: | Size: 2.0 KiB After Width: | Height: | Size: 2.0 KiB |
@@ -8,7 +8,6 @@ export { default as CalculatorIcon } from './calculator.svg';
|
||||
export { default as CaretIcon } from './caret-down.svg';
|
||||
export { default as CautionCircleIcon } from './caution-circle.svg';
|
||||
export { default as CautionCircleStrokeIcon } from './caution-circle-stroke.svg';
|
||||
export { default as ChatIcon } from './chat-bubble.svg';
|
||||
export { default as CheckIcon } from './check.svg';
|
||||
export { default as ChevronLeftIcon } from './chevron-left.svg';
|
||||
export { default as ChevronRightIcon } from './chevron-right.svg';
|
||||
|
||||
@@ -1,16 +1,12 @@
|
||||
import styled, { type AnyStyledComponent, css } from 'styled-components';
|
||||
|
||||
import { AbacusApiStatus } from '@/constants/abacus';
|
||||
import { ButtonSize } from '@/constants/buttons';
|
||||
import { STRING_KEYS } from '@/constants/localization';
|
||||
import { ENVIRONMENT_CONFIG_MAP } from '@/constants/networks';
|
||||
|
||||
import { useApiState, useSelectedNetwork, useStringGetter } from '@/hooks';
|
||||
import { ChatIcon, LinkOutIcon } from '@/icons';
|
||||
import { useApiState, useStringGetter } from '@/hooks';
|
||||
|
||||
import { layoutMixins } from '@/styles/layoutMixins';
|
||||
|
||||
import { Button } from '@/components/Button';
|
||||
import { Details } from '@/components/Details';
|
||||
import { Output, OutputType } from '@/components/Output';
|
||||
import { WithTooltip } from '@/components/WithTooltip';
|
||||
@@ -28,8 +24,6 @@ enum ExchangeStatus {
|
||||
export const FooterDesktop = () => {
|
||||
const stringGetter = useStringGetter();
|
||||
const { height, indexerHeight, status, statusErrorMessage } = useApiState();
|
||||
const { selectedNetwork } = useSelectedNetwork();
|
||||
const { statusPage } = ENVIRONMENT_CONFIG_MAP[selectedNetwork].links;
|
||||
|
||||
const { exchangeStatus, label } =
|
||||
!status || status === AbacusApiStatus.NORMAL
|
||||
@@ -44,37 +38,20 @@ export const FooterDesktop = () => {
|
||||
|
||||
return (
|
||||
<Styled.Footer>
|
||||
<Styled.Row>
|
||||
<WithTooltip
|
||||
slotTooltip={
|
||||
statusErrorMessage && (
|
||||
<dl>
|
||||
<dd>{statusErrorMessage}</dd>
|
||||
</dl>
|
||||
)
|
||||
}
|
||||
>
|
||||
<Styled.FooterButton
|
||||
slotLeft={<Styled.StatusDot exchangeStatus={exchangeStatus} />}
|
||||
slotRight={statusPage && <LinkOutIcon />}
|
||||
size={ButtonSize.XSmall}
|
||||
state={{ isDisabled: !statusPage }}
|
||||
>
|
||||
{label}
|
||||
</Styled.FooterButton>
|
||||
</WithTooltip>
|
||||
|
||||
{globalThis?.Intercom && (
|
||||
<Styled.FooterButton
|
||||
slotLeft={<ChatIcon />}
|
||||
size={ButtonSize.XSmall}
|
||||
onClick={() => globalThis.Intercom('show')}
|
||||
>
|
||||
{stringGetter({ key: STRING_KEYS.HELP_AND_SUPPORT })}
|
||||
</Styled.FooterButton>
|
||||
)}
|
||||
</Styled.Row>
|
||||
|
||||
<WithTooltip
|
||||
slotTooltip={
|
||||
statusErrorMessage && (
|
||||
<dl>
|
||||
<dd>{statusErrorMessage}</dd>
|
||||
</dl>
|
||||
)
|
||||
}
|
||||
>
|
||||
<Styled.Row>
|
||||
<Styled.StatusDot exchangeStatus={exchangeStatus} />
|
||||
<span>{label}</span>
|
||||
</Styled.Row>
|
||||
</WithTooltip>
|
||||
{import.meta.env.MODE !== 'production' && (
|
||||
<Styled.Details
|
||||
withSeparators
|
||||
@@ -105,22 +82,20 @@ Styled.Footer = styled.footer`
|
||||
${layoutMixins.stickyFooter}
|
||||
${layoutMixins.spacedRow}
|
||||
grid-area: Footer;
|
||||
|
||||
font-size: 0.66em;
|
||||
`;
|
||||
|
||||
Styled.Row = styled.div`
|
||||
${layoutMixins.row}
|
||||
${layoutMixins.spacedRow}
|
||||
width: var(--sidebar-width);
|
||||
|
||||
padding: 0 0.5rem;
|
||||
border-right: 1px solid var(--color-border);
|
||||
padding: 0 1rem;
|
||||
gap: 0.5rem;
|
||||
`;
|
||||
|
||||
Styled.StatusDot = styled.div<{ exchangeStatus: ExchangeStatus }>`
|
||||
width: 0.5rem;
|
||||
height: 0.5rem;
|
||||
width: 1em;
|
||||
height: 1em;
|
||||
border-radius: 50%;
|
||||
margin-right: 0.25rem;
|
||||
|
||||
background-color: ${({ exchangeStatus }) =>
|
||||
({
|
||||
@@ -129,28 +104,12 @@ Styled.StatusDot = styled.div<{ exchangeStatus: ExchangeStatus }>`
|
||||
}[exchangeStatus])};
|
||||
`;
|
||||
|
||||
Styled.FooterButton = styled(Button)`
|
||||
--button-height: 1.5rem;
|
||||
--button-radius: 0.25rem;
|
||||
--button-backgroundColor: var(--color-layer-2);
|
||||
--button-border: none;
|
||||
--button-textColor: var(--color-text-0);
|
||||
|
||||
&:hover:not(:disabled) {
|
||||
--button-backgroundColor: var(--color-layer-3);
|
||||
--button-textColor: var(--color-text-1);
|
||||
}
|
||||
|
||||
&:disabled {
|
||||
cursor: default;
|
||||
}
|
||||
`;
|
||||
|
||||
Styled.WarningOutput = styled(Output)`
|
||||
color: var(--color-warning);
|
||||
`;
|
||||
|
||||
Styled.Details = styled(Details)`
|
||||
${layoutMixins.scrollArea}
|
||||
font: var(--font-tiny-book);
|
||||
|
||||
padding: 0 0.5em;
|
||||
`;
|
||||
|
||||
@@ -22,6 +22,7 @@ import { OnboardingTriggerButton } from '@/views/dialogs/OnboardingTriggerButton
|
||||
import { openDialog } from '@/state/dialogs';
|
||||
import { calculateCanAccountTrade } from '@/state/accountCalculators';
|
||||
|
||||
// TODO(@aforaleka): replace with real data
|
||||
export const DYDXBalancePanel = () => {
|
||||
const dispatch = useDispatch();
|
||||
const stringGetter = useStringGetter();
|
||||
@@ -109,7 +110,7 @@ export const DYDXBalancePanel = () => {
|
||||
value: (
|
||||
<Output
|
||||
type={OutputType.Asset}
|
||||
value={nativeTokenBalance.plus(nativeStakingBalance)}
|
||||
value={nativeTokenBalance + nativeStakingBalance}
|
||||
tag={chainTokenLabel}
|
||||
/>
|
||||
),
|
||||
@@ -125,7 +126,7 @@ const Styled: Record<string, AnyStyledComponent> = {};
|
||||
|
||||
Styled.Header = styled.div`
|
||||
${layoutMixins.spacedRow}
|
||||
padding: 1rem 1.5rem 0;
|
||||
padding: 1.25rem 1.5rem 0.5rem;
|
||||
`;
|
||||
|
||||
Styled.Title = styled.h3`
|
||||
@@ -154,6 +155,7 @@ Styled.ReceiveButton = styled(Button)`
|
||||
Styled.Content = styled.div`
|
||||
${layoutMixins.flexColumn}
|
||||
gap: 0.75rem;
|
||||
padding: 0 0.5rem 0.5rem;
|
||||
`;
|
||||
|
||||
Styled.IconContainer = styled.div`
|
||||
|
||||
@@ -13,6 +13,4 @@ declare global {
|
||||
|
||||
'abacus:connectNetwork': CustomEvent;
|
||||
}
|
||||
|
||||
var Intercom: any;
|
||||
}
|
||||
|
||||
@@ -36,10 +36,11 @@
|
||||
--single-unit-height: 9.375rem;
|
||||
|
||||
/* Modal constants */
|
||||
--dialog-small-width: 18.75rem;
|
||||
--dialog-medium-width: 20.5rem;
|
||||
--dialog-large-width: 26.25rem;
|
||||
--dialog-header-height: 4rem;
|
||||
--sidebar-modal-width: 18.75rem;
|
||||
--modal-small-width: 18.75rem;
|
||||
--modal-medium-width: 20.5rem;
|
||||
--modal-large-width: 26.25rem;
|
||||
--modal-header-height: 4rem;
|
||||
|
||||
/* Market Selector constants */
|
||||
--marketsDropdown-openWidth: 45rem;
|
||||
|
||||
@@ -188,14 +188,13 @@ export const popoverMixins = {
|
||||
--item-highlighted-backgroundColor: var(--color-layer-2);
|
||||
--item-highlighted-textColor: var(--color-text-2);
|
||||
|
||||
--item-gap: 0.5em;
|
||||
--item-radius: 0px;
|
||||
--item-padding: 0.5em 1em;
|
||||
|
||||
display: flex;
|
||||
justify-content: space-between;
|
||||
align-items: center;
|
||||
gap: var(--item-gap);
|
||||
gap: 0.5em;
|
||||
|
||||
padding: var(--item-padding);
|
||||
border-radius: var(--item-radius);
|
||||
|
||||
@@ -1,94 +1,69 @@
|
||||
import { useMemo } from 'react';
|
||||
import styled, { AnyStyledComponent } from 'styled-components';
|
||||
import { useDispatch } from 'react-redux';
|
||||
import { Close } from '@radix-ui/react-dialog';
|
||||
|
||||
import { STRING_KEYS } from '@/constants/localization';
|
||||
import { useStringGetter } from '@/hooks';
|
||||
import { ChatIcon, FeedbackIcon, FileIcon, TerminalIcon } from '@/icons';
|
||||
import { layoutMixins } from '@/styles/layoutMixins';
|
||||
|
||||
import { ComboboxDialogMenu } from '@/components/ComboboxDialogMenu';
|
||||
|
||||
import { isTruthy } from '@/lib/isTruthy';
|
||||
import { Button } from '@/components/Button';
|
||||
import { Dialog } from '@/components/Dialog';
|
||||
import { ButtonAction, ButtonType } from '@/constants/buttons';
|
||||
import { Icon, IconName } from '@/components/Icon';
|
||||
|
||||
type ElementProps = {
|
||||
setIsOpen: (open: boolean) => void;
|
||||
};
|
||||
|
||||
const HELP_LINKS = {
|
||||
apiDocumentation: 'https://v4-teacher.vercel.app/',
|
||||
helpCenter: null,
|
||||
feedback: null,
|
||||
};
|
||||
export const HELP_URL = `https://docs.google.com/forms/d/e/1FAIpQLSezLsWCKvAYDEb7L-2O4wOON1T56xxro9A2Azvl6IxXHP_15Q/viewform?usp=sf_link`;
|
||||
|
||||
/**
|
||||
* HelpDialog
|
||||
* - Will temporarily be used as a 'Give Feedback' dialog.
|
||||
* - It will ask users to navigate to a Google Form in order to record feedback.
|
||||
*/
|
||||
export const HelpDialog = ({ setIsOpen }: ElementProps) => {
|
||||
const stringGetter = useStringGetter();
|
||||
|
||||
const HELP_ITEMS = useMemo(
|
||||
() => [
|
||||
{
|
||||
group: 'help-items',
|
||||
items: [
|
||||
HELP_LINKS.helpCenter && {
|
||||
value: 'help-center',
|
||||
label: stringGetter({ key: STRING_KEYS.HELP_CENTER }),
|
||||
description: stringGetter({ key: STRING_KEYS.HELP_CENTER_DESCRIPTION }),
|
||||
onSelect: () => {
|
||||
HELP_LINKS.helpCenter && globalThis.open(HELP_LINKS.helpCenter, '_blank');
|
||||
setIsOpen(false);
|
||||
},
|
||||
slotBefore: <FileIcon />,
|
||||
},
|
||||
HELP_LINKS.apiDocumentation && {
|
||||
value: 'api-documentation',
|
||||
label: stringGetter({ key: STRING_KEYS.API_DOCUMENTATION }),
|
||||
description: stringGetter({ key: STRING_KEYS.API_DOCUMENTATION_DESCRIPTION }),
|
||||
onSelect: () => {
|
||||
HELP_LINKS.apiDocumentation && globalThis.open(HELP_LINKS.apiDocumentation, '_blank');
|
||||
setIsOpen(false);
|
||||
},
|
||||
slotBefore: <TerminalIcon />,
|
||||
},
|
||||
globalThis?.Intercom && {
|
||||
value: 'live-chat',
|
||||
label: stringGetter({ key: STRING_KEYS.LIVE_CHAT }),
|
||||
description: stringGetter({ key: STRING_KEYS.LIVE_CHAT_DESCRIPTION }),
|
||||
onSelect: () => {
|
||||
globalThis.Intercom('show');
|
||||
setIsOpen(false);
|
||||
},
|
||||
slotBefore: <ChatIcon />,
|
||||
},
|
||||
HELP_LINKS.feedback && {
|
||||
value: 'feedback',
|
||||
label: stringGetter({ key: STRING_KEYS.PROVIDE_FEEDBACK }),
|
||||
description: stringGetter({ key: STRING_KEYS.PROVIDE_FEEDBACK_DESCRIPTION }),
|
||||
onSelect: () => {
|
||||
HELP_LINKS.feedback && globalThis.open(HELP_LINKS.feedback, '_blank');
|
||||
setIsOpen(false);
|
||||
},
|
||||
slotBefore: <FeedbackIcon />,
|
||||
},
|
||||
].filter(isTruthy),
|
||||
},
|
||||
],
|
||||
[stringGetter]
|
||||
);
|
||||
|
||||
return (
|
||||
<Styled.ComboboxDialogMenu
|
||||
<Dialog
|
||||
isOpen
|
||||
withSearch={false}
|
||||
setIsOpen={setIsOpen}
|
||||
title={stringGetter({ key: STRING_KEYS.HELP })}
|
||||
items={HELP_ITEMS}
|
||||
/>
|
||||
title={stringGetter({ key: STRING_KEYS.PROVIDE_FEEDBACK })}
|
||||
description={stringGetter({ key: STRING_KEYS.PROVIDE_FEEDBACK_DESCRIPTION })}
|
||||
>
|
||||
<Styled.Content>
|
||||
<p>
|
||||
You will be navigated to a Google Form where you will be able to provide feedback. Thank
|
||||
you for your contribution!
|
||||
</p>
|
||||
<Styled.ButtonRow>
|
||||
<Close asChild>
|
||||
<Button
|
||||
action={ButtonAction.Primary}
|
||||
type={ButtonType.Link}
|
||||
href={HELP_URL}
|
||||
slotRight={<Icon iconName={IconName.LinkOut} />}
|
||||
>
|
||||
{stringGetter({ key: STRING_KEYS.CONTINUE })}
|
||||
</Button>
|
||||
</Close>
|
||||
</Styled.ButtonRow>
|
||||
</Styled.Content>
|
||||
</Dialog>
|
||||
);
|
||||
};
|
||||
|
||||
const Styled: Record<string, AnyStyledComponent> = {};
|
||||
|
||||
Styled.ComboboxDialogMenu = styled(ComboboxDialogMenu)`
|
||||
--dialog-width: var(--dialog-small-width);
|
||||
--dialog-content-paddingTop: 1rem;
|
||||
--dialog-content-paddingBottom: 1rem;
|
||||
--comboxDialogMenu-item-gap: 1rem;
|
||||
Styled.ButtonRow = styled.div`
|
||||
${layoutMixins.row}
|
||||
|
||||
gap: 0.5rem;
|
||||
justify-content: end;
|
||||
`;
|
||||
|
||||
Styled.Content = styled.div`
|
||||
${layoutMixins.column}
|
||||
gap: 1rem;
|
||||
`;
|
||||
|
||||
@@ -37,7 +37,7 @@ export const OnboardingDialog = ({ setIsOpen }: ElementProps) => {
|
||||
const stringGetter = useStringGetter();
|
||||
const { isMobile } = useBreakpoints();
|
||||
|
||||
const { disconnect, walletType } = useAccounts();
|
||||
const { walletType } = useAccounts();
|
||||
|
||||
const currentOnboardingStep = useSelector(calculateOnboardingStep);
|
||||
|
||||
@@ -45,17 +45,10 @@ export const OnboardingDialog = ({ setIsOpen }: ElementProps) => {
|
||||
if (!currentOnboardingStep) setIsOpen?.(false);
|
||||
}, [currentOnboardingStep]);
|
||||
|
||||
const setIsOpenFromDialog = (open: boolean) => {
|
||||
if (!open && currentOnboardingStep === OnboardingSteps.AcknowledgeTerms) {
|
||||
disconnect();
|
||||
}
|
||||
setIsOpen?.(open);
|
||||
}
|
||||
|
||||
return (
|
||||
<Styled.Dialog
|
||||
isOpen={Boolean(currentOnboardingStep)}
|
||||
setIsOpen={setIsOpenFromDialog}
|
||||
setIsOpen={setIsOpen}
|
||||
{...(currentOnboardingStep &&
|
||||
{
|
||||
[OnboardingSteps.ChooseWallet]: {
|
||||
@@ -94,10 +87,10 @@ export const OnboardingDialog = ({ setIsOpen }: ElementProps) => {
|
||||
title: stringGetter({ key: STRING_KEYS.ACKNOWLEDGE_TERMS }),
|
||||
children: (
|
||||
<Styled.Content>
|
||||
<AcknowledgeTerms onClose={() => setIsOpenFromDialog?.(false)} />
|
||||
<AcknowledgeTerms />
|
||||
</Styled.Content>
|
||||
),
|
||||
width: '30rem',
|
||||
width: '20rem',
|
||||
},
|
||||
[OnboardingSteps.DepositFunds]: {
|
||||
title: stringGetter({ key: STRING_KEYS.DEPOSIT }),
|
||||
|
||||
@@ -6,17 +6,14 @@ import { AppRoute } from '@/constants/routes';
|
||||
import { STRING_KEYS } from '@/constants/localization';
|
||||
import { ButtonAction } from '@/constants/buttons';
|
||||
|
||||
import { layoutMixins } from '@/styles/layoutMixins';
|
||||
|
||||
import { Button } from '@/components/Button';
|
||||
import { Link } from '@/components/Link';
|
||||
|
||||
type ElementProps = {
|
||||
onClose?: () => void;
|
||||
onContinue?: () => void;
|
||||
};
|
||||
|
||||
export const AcknowledgeTerms = ({ onClose, onContinue }: ElementProps) => {
|
||||
export const AcknowledgeTerms = ({ onContinue }: ElementProps) => {
|
||||
const stringGetter = useStringGetter();
|
||||
|
||||
const { saveHasAcknowledgedTerms } = useAccounts();
|
||||
@@ -28,40 +25,26 @@ export const AcknowledgeTerms = ({ onClose, onContinue }: ElementProps) => {
|
||||
|
||||
return (
|
||||
<>
|
||||
<p>
|
||||
<span>
|
||||
{stringGetter({
|
||||
key: STRING_KEYS.TOS_TITLE,
|
||||
key: STRING_KEYS.LEGAL_UPDATES_DESCRIPTION,
|
||||
params: {
|
||||
TERMS_LINK: (
|
||||
TOU: (
|
||||
<Styled.Link href={`/#${AppRoute.Terms}`}>
|
||||
{stringGetter({ key: STRING_KEYS.TERMS_OF_USE })}
|
||||
</Styled.Link>
|
||||
),
|
||||
PRIVACY_POLICY_LINK: (
|
||||
PRIVACY_POLICY: (
|
||||
<Styled.Link href={`/#${AppRoute.Privacy}`}>
|
||||
{stringGetter({ key: STRING_KEYS.PRIVACY_POLICY })}
|
||||
</Styled.Link>
|
||||
),
|
||||
},
|
||||
})}
|
||||
</p>
|
||||
<Styled.TOS>
|
||||
<ul>
|
||||
<li>{stringGetter({ key: STRING_KEYS.TOS_LINE1 })}</li>
|
||||
<li>{stringGetter({ key: STRING_KEYS.TOS_LINE2 })}</li>
|
||||
<li>{stringGetter({ key: STRING_KEYS.TOS_LINE3 })}</li>
|
||||
<li>{stringGetter({ key: STRING_KEYS.TOS_LINE4 })}</li>
|
||||
<li>{stringGetter({ key: STRING_KEYS.TOS_LINE5 })}</li>
|
||||
</ul>
|
||||
</Styled.TOS>
|
||||
<Styled.Row>
|
||||
<Styled.Button onClick={onClose} action={ButtonAction.Base}>
|
||||
{stringGetter({ key: STRING_KEYS.CLOSE })}
|
||||
</Styled.Button>
|
||||
<Styled.Button onClick={onAcknowledgement} action={ButtonAction.Primary}>
|
||||
{stringGetter({ key: STRING_KEYS.I_AGREE })}
|
||||
</Styled.Button>
|
||||
</Styled.Row>
|
||||
</span>
|
||||
<Button onClick={onAcknowledgement} action={ButtonAction.Primary}>
|
||||
{stringGetter({ key: STRING_KEYS.I_AGREE })}
|
||||
</Button>
|
||||
</>
|
||||
);
|
||||
};
|
||||
@@ -76,23 +59,3 @@ Styled.Link = styled(Link)`
|
||||
color: var(--color-accent);
|
||||
}
|
||||
`;
|
||||
|
||||
Styled.TOS = styled.section`
|
||||
background-color: var(--color-layer-4);
|
||||
padding: 1rem 1rem 1rem 2rem;
|
||||
border-radius: 0.875rem;
|
||||
> ul {
|
||||
${layoutMixins.column};
|
||||
gap: 1rem;
|
||||
}
|
||||
`;
|
||||
|
||||
Styled.Row = styled.div`
|
||||
${layoutMixins.row};
|
||||
|
||||
gap: 1rem;
|
||||
`;
|
||||
|
||||
Styled.Button = styled(Button)`
|
||||
flex-grow: 1;
|
||||
`;
|
||||
|
||||
@@ -87,6 +87,7 @@ export const DepositForm = ({ onDeposit, onError }: DepositFormProps) => {
|
||||
// Async Data
|
||||
const { balance, queryStatus, isQueryFetching } = useAccountBalance({
|
||||
addressOrDenom: sourceToken?.address || CHAIN_DEFAULT_TOKEN_ADDRESS,
|
||||
assetSymbol: sourceToken?.symbol || undefined,
|
||||
chainId: chainId,
|
||||
decimals: sourceToken?.decimals || undefined,
|
||||
isCosmosChain: false,
|
||||
|
||||
Reference in New Issue
Block a user