CtrlK
BlogDocsLog inGet started
Tessl Logo

tessl/npm-rainbow-me--rainbowkit

A comprehensive React library that simplifies wallet connection functionality for decentralized applications with support for 66 wallets and extensive customization options

Pending

Quality

Pending

Does it follow best practices?

Impact

Pending

No eval scenarios have been run

Overview
Eval results
Files

modal-controls.mddocs/

Modal Controls

React hooks for programmatically controlling wallet connection, account, and chain selection modals.

Capabilities

useConnectModal

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>
  );
}

useAccountModal

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>
  );
}

useChainModal

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>
  );
}

useModalState

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>
  );
}

Advanced Usage Patterns

Custom Modal Trigger Components

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>
  );
}

Conditional Modal Opening

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>
  );
}

Modal State-Based UI

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>
  );
}

Integration with Form Validation

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

docs

authentication.md

configuration.md

core-components.md

index.md

modal-controls.md

theming.md

wallet-connectors.md

tile.json