diff --git a/public/locales/en/staking.json b/public/locales/en/staking.json index ef0d859b..a4cb1a5c 100644 --- a/public/locales/en/staking.json +++ b/public/locales/en/staking.json @@ -112,7 +112,8 @@ "status": { "activating": "Activating", "active": "Active", - "deactivating": "Deactivating" + "deactivating": "Deactivating", + "inactive": "Inactive" } }, "stakeAccounts": "Accounts", diff --git a/public/locales/zh-CN/staking.json b/public/locales/zh-CN/staking.json index 86193b65..2b245e94 100644 --- a/public/locales/zh-CN/staking.json +++ b/public/locales/zh-CN/staking.json @@ -111,7 +111,8 @@ "status": { "activating": "Active", "active": "Active", - "deactivating": "Deactivating" + "deactivating": "Deactivating", + "inactive": "Inactive" } }, "stakeAccounts": "Accounts", diff --git a/public/locales/zh-HK/staking.json b/public/locales/zh-HK/staking.json index 4ac4375d..e8052cba 100644 --- a/public/locales/zh-HK/staking.json +++ b/public/locales/zh-HK/staking.json @@ -111,7 +111,8 @@ "status": { "activating": "Active", "active": "Active", - "deactivating": "Deactivating" + "deactivating": "Deactivating", + "inactive": "Inactive" } }, "stakeAccounts": "Accounts", diff --git a/src/screens/staking/components/networks/components/network_grid/components/network_card/stake_accounts.tsx b/src/screens/staking/components/networks/components/network_grid/components/network_card/stake_accounts.tsx index dc3b2466..a1658276 100644 --- a/src/screens/staking/components/networks/components/network_grid/components/network_card/stake_accounts.tsx +++ b/src/screens/staking/components/networks/components/network_grid/components/network_card/stake_accounts.tsx @@ -140,6 +140,7 @@ const StakeAccounts = ({ network, onClose }: Props) => { activating: t("stakeAccount.status.activating"), active: t("stakeAccount.status.active"), deactivating: t("stakeAccount.status.deactivating"), + inactive: t("stakeAccount.status.inactive"), }[account.status] || account.status; const statusStyle = @@ -147,6 +148,7 @@ const StakeAccounts = ({ network, onClose }: Props) => { activating: styles.statusActivating, active: styles.statusActive, deactivating: styles.statusDeactivating, + inactive: null, }[account.status] || null; const reward = rewardsByAddress?.[account.address]; diff --git a/src/screens/staking/components/staking_section/connect_wallet_modal.module.scss b/src/screens/staking/components/staking_section/connect_wallet_modal.module.scss index f2c935f5..9255877a 100644 --- a/src/screens/staking/components/staking_section/connect_wallet_modal.module.scss +++ b/src/screens/staking/components/staking_section/connect_wallet_modal.module.scss @@ -33,8 +33,9 @@ .wallets { display: flex; - flex-direction: row; + flex-flow: row wrap; gap: 24px; + justify-content: center; margin-bottom: 48px; margin-top: 48px; } diff --git a/src/screens/staking/components/staking_section/unstaking_modal.tsx b/src/screens/staking/components/staking_section/unstaking_modal.tsx index fea666d7..8c7d806a 100644 --- a/src/screens/staking/components/staking_section/unstaking_modal.tsx +++ b/src/screens/staking/components/staking_section/unstaking_modal.tsx @@ -25,6 +25,7 @@ import { } from "@src/screens/staking/lib/staking_sdk/context/selectors"; import type { StakingNetworkInfo } from "@src/screens/staking/lib/staking_sdk/core"; import { mainNetworkDenom } from "@src/screens/staking/lib/staking_sdk/core/base"; +import { solanaNetworks } from "@src/screens/staking/lib/staking_sdk/core/solana"; import { formatCoin } from "@src/screens/staking/lib/staking_sdk/formatters"; import { getAccountNormalisedDelegation } from "@src/screens/staking/lib/staking_sdk/utils/accounts"; import { @@ -124,12 +125,14 @@ const UnstakingModal = () => { } })() as string; - const stakeAccounts = selectedAccount - ? getStakeAccountsForNetwork( - stakingRef.current.state, - selectedAccount.networkId, - ) - : []; + const stakeAccounts = ( + selectedAccount + ? getStakeAccountsForNetwork( + stakingRef.current.state, + selectedAccount.networkId, + ) + : [] + ).filter((acc) => ["activating", "active"].includes(acc.status)); const onSubmit = (e: any) => { e?.preventDefault(); @@ -207,7 +210,9 @@ const UnstakingModal = () => { }); }; - const hasStakingAccounts = stakeAccounts.length > 0; + const usesStakeAccounts = account?.networkId + ? solanaNetworks.has(account.networkId) + : false; const delegationProp = account?.info?.delegation; @@ -230,7 +235,7 @@ const UnstakingModal = () => { )} - {hasStakingAccounts ? ( + {usesStakeAccounts ? ( <> { - // eslint-disable-next-line no-console - console.log("disconnected"); - }); -} - -testnetWallet.on("disconnect", () => { - // eslint-disable-next-line no-console - console.log("disconnected"); -}); +const devnetWallet = new Solflare({ network: "devnet" }); let connectListenerMainnet: (() => void) | undefined; let connectListenerTestnet: (() => void) | undefined; +let connectListenerDevnet: (() => void) | undefined; export const tryToConnectSolflare = async ( context: TStakingContext, @@ -48,6 +38,9 @@ export const tryToConnectSolflare = async ( const hasTestnetWallet = ENABLE_TESTNETS && solanaNetworks.has(StakingNetworkId.SolanaTestnet); + const hasDevnetWallet = + ENABLE_TESTNETS && solanaNetworks.has(StakingNetworkId.SolanaDevnet); + const getListener = (wallet: typeof mainnetWallet, networkId: StakingNetworkId) => async () => { @@ -91,9 +84,11 @@ export const tryToConnectSolflare = async ( resolvedItems += 1; - const totalItems = [hasMainnetWallet, hasTestnetWallet].filter( - Boolean, - ).length; + const totalItems = [ + hasMainnetWallet, + hasTestnetWallet, + hasDevnetWallet, + ].filter(Boolean).length; if (resolvedItems === totalItems) { resolve(true); @@ -117,9 +112,8 @@ export const tryToConnectSolflare = async ( } if (hasTestnetWallet) { - if (connectListenerTestnet) { + if (connectListenerTestnet) testnetWallet.off("connect", connectListenerTestnet); - } connectListenerTestnet = getListener( testnetWallet, @@ -129,9 +123,22 @@ export const tryToConnectSolflare = async ( testnetWallet.on("connect", connectListenerTestnet); } + if (hasDevnetWallet) { + if (connectListenerDevnet) + devnetWallet.off("connect", connectListenerDevnet); + + connectListenerDevnet = getListener( + devnetWallet, + StakingNetworkId.SolanaDevnet, + ); + + devnetWallet.on("connect", connectListenerDevnet); + } + await Promise.all([ hasMainnetWallet ? mainnetWallet.connect() : Promise.resolve(), hasTestnetWallet ? testnetWallet.connect() : Promise.resolve(), + hasDevnetWallet ? devnetWallet.connect() : Promise.resolve(), ]); }); @@ -213,9 +220,15 @@ const getWalletApi = (account: Account): WalletApi => { }; } - return account.networkId === StakingNetworkId.SolanaTestnet - ? testnetWallet - : mainnetWallet; + const wallet = { + [StakingNetworkId.Solana]: mainnetWallet, + [StakingNetworkId.SolanaDevnet]: devnetWallet, + [StakingNetworkId.SolanaTestnet]: testnetWallet, + }[account.networkId as string]; + + if (!wallet) throw new Error("Unexpected wallet"); + + return wallet; }; // https://solanacookbook.com/references/staking.html