A comprehensive React library that simplifies wallet connection functionality for decentralized applications with support for 66 wallets and extensive customization options
—
Quality
Pending
Does it follow best practices?
Impact
Pending
No eval scenarios have been run
React hooks for programmatically controlling wallet connection, account, and chain selection modals.
Hook for controlling the wallet connection modal programmatically.
/**
* Hook for controlling the wallet connection modal
* @returns Object with modal state and control function
*/
function useConnectModal(): {
connectModalOpen: boolean;
openConnectModal?: () => void;
};Usage Examples:
import { useConnectModal } from '@rainbow-me/rainbowkit';
function CustomConnectButton() {
const { openConnectModal, connectModalOpen } = useConnectModal();
return (
<button
onClick={openConnectModal}
disabled={!openConnectModal || connectModalOpen}
>
{connectModalOpen ? 'Connecting...' : 'Connect Wallet'}
</button>
);
}Hook for controlling the account management modal programmatically.
/**
* Hook for controlling the account management modal
* @returns Object with modal state and control function
*/
function useAccountModal(): {
accountModalOpen: boolean;
openAccountModal?: () => void;
};Usage Examples:
import { useAccountModal } from '@rainbow-me/rainbowkit';
import { useAccount } from 'wagmi';
function AccountButton() {
const { openAccountModal, accountModalOpen } = useAccountModal();
const { address, isConnected } = useAccount();
if (!isConnected) return null;
return (
<button
onClick={openAccountModal}
disabled={!openAccountModal || accountModalOpen}
>
{address?.slice(0, 6)}...{address?.slice(-4)}
</button>
);
}Hook for controlling the chain/network selection modal programmatically.
/**
* Hook for controlling the chain selection modal
* @returns Object with modal state and control function
*/
function useChainModal(): {
chainModalOpen: boolean;
openChainModal?: () => void;
};Usage Examples:
import { useChainModal } from '@rainbow-me/rainbowkit';
import { useNetwork } from 'wagmi';
function ChainSelector() {
const { openChainModal, chainModalOpen } = useChainModal();
const { chain } = useNetwork();
return (
<button
onClick={openChainModal}
disabled={!openChainModal || chainModalOpen}
>
{chain?.name ?? 'Unknown Chain'}
</button>
);
}Hook for accessing the state of all modals simultaneously.
/**
* Hook for accessing the state of all modals
* @returns Object with all modal states
*/
function useModalState(): {
accountModalOpen: boolean;
chainModalOpen: boolean;
connectModalOpen: boolean;
};Usage Examples:
import { useModalState } from '@rainbow-me/rainbowkit';
function ModalStateIndicator() {
const { accountModalOpen, chainModalOpen, connectModalOpen } = useModalState();
const anyModalOpen = accountModalOpen || chainModalOpen || connectModalOpen;
return (
<div>
<p>Modal Status: {anyModalOpen ? 'Open' : 'Closed'}</p>
{connectModalOpen && <p>Connect modal is open</p>}
{accountModalOpen && <p>Account modal is open</p>}
{chainModalOpen && <p>Chain modal is open</p>}
</div>
);
}import {
useConnectModal,
useAccountModal,
useChainModal
} from '@rainbow-me/rainbowkit';
import { useAccount, useNetwork } from 'wagmi';
function CustomWalletInterface() {
const { openConnectModal } = useConnectModal();
const { openAccountModal } = useAccountModal();
const { openChainModal } = useChainModal();
const { address, isConnected } = useAccount();
const { chain } = useNetwork();
if (!isConnected) {
return (
<button onClick={openConnectModal} className="connect-btn">
Connect Wallet
</button>
);
}
return (
<div className="wallet-interface">
<button onClick={openAccountModal} className="account-btn">
<span>👤</span>
<span>{address?.slice(0, 6)}...{address?.slice(-4)}</span>
</button>
<button onClick={openChainModal} className="chain-btn">
<span>🌐</span>
<span>{chain?.name ?? 'Unknown'}</span>
</button>
</div>
);
}import { useConnectModal, useChainModal } from '@rainbow-me/rainbowkit';
import { useAccount, useNetwork } from 'wagmi';
function SmartConnectButton() {
const { openConnectModal } = useConnectModal();
const { openChainModal } = useChainModal();
const { isConnected } = useAccount();
const { chain } = useNetwork();
const handleClick = () => {
if (!isConnected) {
openConnectModal?.();
} else if (chain?.unsupported) {
openChainModal?.();
}
};
const getButtonText = () => {
if (!isConnected) return 'Connect Wallet';
if (chain?.unsupported) return 'Switch Network';
return 'Connected';
};
return (
<button
onClick={handleClick}
disabled={isConnected && !chain?.unsupported}
>
{getButtonText()}
</button>
);
}import { useModalState } from '@rainbow-me/rainbowkit';
function AppLayout({ children }) {
const { accountModalOpen, chainModalOpen, connectModalOpen } = useModalState();
const isAnyModalOpen = accountModalOpen || chainModalOpen || connectModalOpen;
return (
<div className={`app-layout ${isAnyModalOpen ? 'modal-active' : ''}`}>
{/* Overlay when modals are open */}
{isAnyModalOpen && <div className="modal-overlay" />}
<header>
<h1>My DApp</h1>
</header>
<main>
{children}
</main>
{/* Disable interactions when modals are open */}
<style jsx>{`
.app-layout.modal-active main {
pointer-events: none;
opacity: 0.8;
}
.modal-overlay {
position: fixed;
top: 0;
left: 0;
right: 0;
bottom: 0;
background: rgba(0, 0, 0, 0.3);
z-index: 999;
}
`}</style>
</div>
);
}import { useConnectModal } from '@rainbow-me/rainbowkit';
import { useAccount } from 'wagmi';
import { useState } from 'react';
function TokenTransferForm() {
const { openConnectModal } = useConnectModal();
const { isConnected } = useAccount();
const [recipient, setRecipient] = useState('');
const [amount, setAmount] = useState('');
const handleSubmit = (e: React.FormEvent) => {
e.preventDefault();
if (!isConnected) {
openConnectModal?.();
return;
}
// Process transfer
console.log('Transferring', amount, 'to', recipient);
};
return (
<form onSubmit={handleSubmit}>
<input
type="text"
placeholder="Recipient address"
value={recipient}
onChange={(e) => setRecipient(e.target.value)}
required
/>
<input
type="number"
placeholder="Amount"
value={amount}
onChange={(e) => setAmount(e.target.value)}
required
/>
<button type="submit">
{isConnected ? 'Transfer' : 'Connect Wallet to Transfer'}
</button>
</form>
);
}Install with Tessl CLI
npx tessl i tessl/npm-rainbow-me--rainbowkit