Skip to content

Commit

Permalink
chore: tweak disconnect behaviour
Browse files Browse the repository at this point in the history
chore: remove unnecessary code

chore: remove unnecessary code
  • Loading branch information
magiziz committed Apr 8, 2024
1 parent c02d1fa commit a69fe5c
Show file tree
Hide file tree
Showing 14 changed files with 38 additions and 66 deletions.
2 changes: 1 addition & 1 deletion .changeset/wild-hounds-talk.md
Expand Up @@ -2,4 +2,4 @@
"@rainbow-me/rainbowkit": patch
---

Added optimistic disconnect behavior for the account modal and chain modal. Additionally, a new prop `disconnecting` was introduced to `<ConnectButton.Custom>` to enable rendering of UI based on the optimistic behavior.
Introduced optimistic disconnect behavior by monitoring `isDisconnecting` in `RainbowKitWagmiStateProvider`. If `isDisconnecting` is `true`, the `useConnectionStatus` hook will mark its state as `disconnected`.
5 changes: 2 additions & 3 deletions examples/with-next-custom-button/pages/index.tsx
Expand Up @@ -14,7 +14,6 @@ const Home: NextPage = () => {
<ConnectButton.Custom>
{({
account,
disconnecting,
chain,
openAccountModal,
openChainModal,
Expand All @@ -33,9 +32,9 @@ const Home: NextPage = () => {
})}
>
{(() => {
if (!mounted || !account || !chain || disconnecting) {
if (!mounted || !account || !chain) {
return (
<button disabled={disconnecting} onClick={openConnectModal} type="button">
<button onClick={openConnectModal} type="button">
Connect Wallet
</button>
);
Expand Down
8 changes: 1 addition & 7 deletions packages/example/pages/index.tsx
Expand Up @@ -129,7 +129,6 @@ const Example = ({ authEnabled }: AppContextProps) => {
authenticationStatus,
chain,
mounted,
disconnecting,
openAccountModal,
openChainModal,
openConnectModal,
Expand All @@ -138,7 +137,6 @@ const Example = ({ authEnabled }: AppContextProps) => {
const connected =
ready &&
account &&
!disconnecting &&
chain &&
(!authenticationStatus ||
authenticationStatus === 'authenticated');
Expand All @@ -157,11 +155,7 @@ const Example = ({ authEnabled }: AppContextProps) => {
{(() => {
if (!connected) {
return (
<button
disabled={disconnecting}
onClick={openConnectModal}
type="button"
>
<button onClick={openConnectModal} type="button">
Connect Wallet
</button>
);
Expand Down
Expand Up @@ -20,8 +20,8 @@ export function AccountModal({ onClose, open }: AccountModalProps) {

const { disconnect } = useDisconnect({
mutation: {
onSuccess: () => setIsDisconnecting(false),
onError: () => setIsDisconnecting(false),
onMutate: () => setIsDisconnecting(true),
onSettled: () => setIsDisconnecting(false),
},
});

Expand All @@ -43,7 +43,6 @@ export function AccountModal({ onClose, open }: AccountModalProps) {
onClose={onClose}
onDisconnect={() => {
onClose();
setIsDisconnecting(true);
disconnect();
}}
/>
Expand Down
5 changes: 2 additions & 3 deletions packages/rainbowkit/src/components/ChainModal/ChainModal.tsx
Expand Up @@ -48,8 +48,8 @@ export function ChainModal({ onClose, open }: ChainModalProps) {

const { disconnect } = useDisconnect({
mutation: {
onSuccess: () => setIsDisconnecting(false),
onError: () => setIsDisconnecting(false),
onMutate: () => setIsDisconnecting(true),
onSettled: () => setIsDisconnecting(false),
},
});

Expand Down Expand Up @@ -126,7 +126,6 @@ export function ChainModal({ onClose, open }: ChainModalProps) {
<MenuButton
onClick={() => {
onClose();
setIsDisconnecting(true);
disconnect();
}}
testId="chain-option-disconnect"
Expand Down

This file was deleted.

19 changes: 5 additions & 14 deletions packages/rainbowkit/src/components/ConnectButton/ConnectButton.tsx
Expand Up @@ -14,7 +14,6 @@ import { DropdownIcon } from '../Icons/Dropdown';
import { I18nContext } from '../RainbowKitProvider/I18nContext';
import { useRainbowKitChains } from '../RainbowKitProvider/RainbowKitChainContext';
import { useShowBalance } from '../RainbowKitProvider/ShowBalanceContext';
import * as styles from './ConnectButton.css';
import { ConnectButtonRenderer } from './ConnectButtonRenderer';

type AccountStatus = 'full' | 'avatar' | 'address';
Expand Down Expand Up @@ -59,7 +58,6 @@ export function ConnectButton({
account,
chain,
mounted,
disconnecting,
openAccountModal,
openChainModal,
openConnectModal,
Expand All @@ -80,10 +78,7 @@ export function ConnectButton({
},
})}
>
{ready &&
account &&
!disconnecting &&
connectionStatus === 'connected' ? (
{ready && account && connectionStatus === 'connected' ? (
<>
{chain && (chains.length > 1 || unsupportedChain) && (
<Box
Expand Down Expand Up @@ -271,19 +266,15 @@ export function ConnectButton({
background="accentColor"
borderRadius="connectButton"
boxShadow="connectButton"
className={[
styles.button,
touchableStyles({
active: 'shrink',
hover: 'grow',
}),
]}
className={touchableStyles({
active: 'shrink',
hover: 'grow',
})}
color="accentColorForeground"
fontFamily="body"
fontWeight="bold"
height="40"
key="connect"
disabled={disconnecting}
onClick={openConnectModal}
paddingX="14"
testId="connect-button"
Expand Down
Expand Up @@ -18,7 +18,6 @@ import {
useModalState,
} from '../RainbowKitProvider/ModalContext';
import { useRainbowKitChainsById } from '../RainbowKitProvider/RainbowKitChainContext';
import { useRainbowKitWagmiState } from '../RainbowKitProvider/RainbowKitWagmiStateProvider';
import { useShowBalance } from '../RainbowKitProvider/ShowBalanceContext';
import { ShowRecentTransactionsContext } from '../RainbowKitProvider/ShowRecentTransactionsContext';
import { abbreviateETHBalance } from './abbreviateETHBalance';
Expand Down Expand Up @@ -49,7 +48,6 @@ export interface ConnectButtonRendererProps {
unsupported?: boolean;
};
mounted: boolean;
disconnecting: boolean;
authenticationStatus?: AuthenticationStatus;
openAccountModal: () => void;
openChainModal: () => void;
Expand All @@ -67,6 +65,7 @@ export function ConnectButtonRenderer({
const { address } = useAccount();
const ensName = useMainnetEnsName(address);
const ensAvatar = useMainnetEnsAvatar(ensName);

const { chainId } = useAccount();
const { chains: wagmiChains } = useConfig();
const isCurrentChainSupported = wagmiChains.some(
Expand Down Expand Up @@ -116,7 +115,6 @@ export function ConnectButtonRenderer({
const { openConnectModal } = useConnectModal();
const { openChainModal } = useChainModal();
const { openAccountModal } = useAccountModal();
const { isDisconnecting: disconnecting } = useRainbowKitWagmiState();
const { accountModalOpen, chainModalOpen, connectModalOpen } =
useModalState();

Expand Down Expand Up @@ -153,7 +151,6 @@ export function ConnectButtonRenderer({
chainModalOpen,
connectModalOpen,
mounted: isMounted(),
disconnecting,
openAccountModal: openAccountModal ?? noop,
openChainModal: openChainModal ?? noop,
openConnectModal: openConnectModal ?? noop,
Expand Down
Expand Up @@ -4,6 +4,7 @@ import { useConnectionStatus } from '../../hooks/useConnectionStatus';
import ConnectOptions from '../ConnectOptions/ConnectOptions';
import { Dialog } from '../Dialog/Dialog';
import { DialogContent } from '../Dialog/DialogContent';
import { useRainbowKitWagmiState } from '../RainbowKitProvider/RainbowKitWagmiStateProvider';
import { SignIn } from '../SignIn/SignIn';

export interface ConnectModalProps {
Expand All @@ -14,8 +15,15 @@ export interface ConnectModalProps {
export function ConnectModal({ onClose, open }: ConnectModalProps) {
const titleId = 'rk_connect_title';
const connectionStatus = useConnectionStatus();
const { setIsDisconnecting } = useRainbowKitWagmiState();

const { disconnect } = useDisconnect({
mutation: {
onMutate: () => setIsDisconnecting(true),
onSettled: () => setIsDisconnecting(false),
},
});

const { disconnect } = useDisconnect();
const { isConnecting } = useAccount();

// when a user cancels or dismisses the SignIn modal for SIWE, disconnect and call onClose
Expand Down

This file was deleted.

Expand Up @@ -67,13 +67,13 @@ export function ModalProvider({ children }: ModalProviderProps) {
openModal: openChainModal,
} = useModalStateValue();

const { isDisconnecting } = useRainbowKitWagmiState();

const [isWalletConnectModalOpen, setIsWalletConnectModalOpen] =
useState(false);

const connectionStatus = useConnectionStatus();

const { isDisconnecting } = useRainbowKitWagmiState();

const { chainId } = useAccount();
const { chains } = useConfig();

Expand Down Expand Up @@ -116,19 +116,18 @@ export function ModalProvider({ children }: ModalProviderProps) {
connectModalOpen,
isWalletConnectModalOpen,
openAccountModal:
!isDisconnecting &&
isCurrentChainSupported &&
connectionStatus === 'connected'
isCurrentChainSupported && connectionStatus === 'connected'
? openAccountModal
: undefined,
openChainModal:
!isDisconnecting && connectionStatus === 'connected'
? openChainModal
: undefined,
connectionStatus === 'connected' ? openChainModal : undefined,
openConnectModal:
// Prevent opening the connect modal during disconnecting mode. Even though `connectionStatus`
// may mark it as 'disconnected', we don't want the user to open the modal as the wagmi state
// still considers it 'connected'
!isDisconnecting &&
(connectionStatus === 'disconnected' ||
connectionStatus === 'unauthenticated') &&
!isDisconnecting
connectionStatus === 'unauthenticated')
? openConnectModal
: undefined,
setIsWalletConnectModalOpen,
Expand Down
Expand Up @@ -24,6 +24,8 @@ interface RainbowKitWagmiStateProviderProps {
export function RainbowKitWagmiStateProvider({
children,
}: RainbowKitWagmiStateProviderProps) {
// The 'status' state from the `useDisconnect` hook in wagmi can't be used for 'pending' logic,
// as it doesn't share its state globally. It only shares its state within the same component (like useState).
const [isDisconnecting, setIsDisconnecting] = useState(false);

return (
Expand Down
4 changes: 3 additions & 1 deletion packages/rainbowkit/src/hooks/useConnectionStatus.ts
@@ -1,5 +1,6 @@
import { useAccount } from 'wagmi';
import { useAuthenticationStatus } from '../components/RainbowKitProvider/AuthenticationContext';
import { useRainbowKitWagmiState } from '../components/RainbowKitProvider/RainbowKitWagmiStateProvider';

export type ConnectionStatus =
| 'disconnected'
Expand All @@ -10,8 +11,9 @@ export type ConnectionStatus =
export function useConnectionStatus(): ConnectionStatus {
const authenticationStatus = useAuthenticationStatus();
const { isConnected } = useAccount();
const { isDisconnecting } = useRainbowKitWagmiState();

if (!isConnected) {
if (!isConnected || isDisconnecting) {
return 'disconnected';
}

Expand Down
4 changes: 1 addition & 3 deletions site/data/en-US/docs/custom-connect-button.mdx
Expand Up @@ -19,7 +19,6 @@ export const YourApp = () => {
<ConnectButton.Custom>
{({
account,
disconnecting,
chain,
openAccountModal,
openChainModal,
Expand All @@ -34,7 +33,6 @@ export const YourApp = () => {
ready &&
account &&
chain &&
!disconnecting &&
(!authenticationStatus ||
authenticationStatus === 'authenticated');

Expand All @@ -52,7 +50,7 @@ export const YourApp = () => {
{(() => {
if (!connected) {
return (
<button disabled={disconnecting} onClick={openConnectModal} type="button">
<button onClick={openConnectModal} type="button">
Connect Wallet
</button>
);
Expand Down

0 comments on commit a69fe5c

Please sign in to comment.