React-Celo
La manera más fácil de acceder a ContractKit en tus aplicaciones React.
React-Celo
La manera más fácil de acceder a Celo en tus aplicaciones React 🔥. react-celo
es un React hook para administrar el acceso a Celo con un sistema modal integrado sin cabecera para conectarse a la billetera de su elección.
Ahora su DApp puede ser puesto a disposición de todos en el ecosistema de Celo, desde usuarios de Valora hasta usuarios Ledger autocustodiados.
Por defecto, react-celo está diseñado para que puedas colocarlo en tu aplicación y listo, sin embargo, es totalmente personalizable para que puedas mantener una UX consistente en toda tu aplicación.
Tabla de Contenidos
Instalar
yarn add @celo/react-celo @celo/contractkit
Billeteras Soportadas
- Celo Dance
- Celo Extension Wallet (Metamask fork)
- Celo Terminal
- Celo Wallet
- Ledger
- MetaMask
- Clave privada de texto plano
- Omni
- Valora
- WalletConnect
Uso Básico
Envuelve tu aplicación con CeloProvider
react-celo usa React's Context.Provider bajo la capa para inyectar estado a través de la aplicación. Debe asegurarse de que su aplicación está envuelta con el proveedor para poder acceder a todos los bienes que react-celo proporciona.
import { CeloProvider } from "@celo/react-celo";
import "@celo/react-celo/lib/styles.css";
function WrappedApp() {
return (
<CeloProvider
dapp={{
name: "My awesome dApp",
description: "My awesome description",
url: "https://example.com",
}}
>
<App />
</CeloProvider>
);
}
function App() {
// your application code
}
Billeteras predeterminadas y personalización
react-celo proporciona una lista de billeteras por defecto (CeloExtensionWallet, Injected, Ledger, MetaMask, PrivateKey (sólo desarrollo) y WalletConnect). Puede configurarse como se muestra a continuación.
<CeloProvider
dapp={{
name: "My awesome dApp",
description: "My awesome description",
url: "https://example.com",
}}
connectModal={{
// This options changes the title of the modal and can be either a string or a react element
title: <span>Connect your Wallet</span>,
providersOptions: {
// This option hides specific wallets from the default list
hideFromDefaults: [
SupportedProvider.MetaMask,
SupportedProvider.PrivateKey,
SupportedProvider.CeloExtensionWallet,
SupportedProvider.Valora,
],
// This option hides all default wallets
hideFromDefaults: true,
// This option toggles on and off the searchbar
searchable: true,
},
}}
>
<App />
</CeloProvider>
También puede añadir nuevas billeteras personalizadas que no existen en el registro o que no están en nuestros valores predeterminados. Por ahora, sólo apoyamos las billeteras personalizadas que implementan el protocolo de walletconnect, pero más pueden venir en el futuro. En el ejemplo de abajo, estamos ocultando todas las billereas excepto una nueva billetera personalizada.
<CeloProvider
dapp={{
name: "My awesome dApp",
description: "My awesome description",
url: "https://example.com",
}}
// Utiliza el tema para personalizar los colores.
// Si proporciona un tema, debe proporcionar todos los valores debajo!
theme={{
primary: "#6366f1",
secondary: "#eef2ff",
text: "#000000",
textSecondary: "#1f2937",
textTertiary: "#64748b",
muted: "#e2e8f0",
background: "#ffffff",
error: "#ef4444",
}}
connectModal={{
title: <span>Connect your ExampleWallet</span>,
providersOptions: {
hideFromDefaults: true,
additionalWCWallets: [
// see https://github.com/WalletConnect/walletconnect-registry/#schema for a schema example
{
id: "example-wallet",
name: "Example Wallet",
description: "Lorem ipsum",
homepage: "https://example.com",
chains: ["eip:4220"],
// IMPORTANT
// This is the version of WC. Sólo soportamos la versión 1 en este momento.
versions: ["1"],
logos: {
sm: "https://via.placeholder.com/40/000000/FFFFFF",
md: "https://via.placeholder.com/80/000000/FFFFFF",
lg: "https://via.placeholder.com/160/000000/FFFFFF",
},
app: {
browser: "...",
ios: "...",
android: "...",
mac: "...",
windows: "..",
linux: "...",
},
mobile: {
native: "...",
universal: "...",
},
desktop: {
native: "...",
universal: "...",
},
metadata: {
shortName: "...",
colors: {
primary: "...",
secondary: "...",
},
},
responsive: {
mobileFriendly: true,
browserFriendly: true,
mobileOnly: false,
browserOnly: false,
},
},
],
},
}}
>
<App />
</CeloProvider>
Pedir a los usuarios que conecten su billetera
react-celo proporciona una función connect
que abrirá un modal con una lista de billeteras a las que su usuario puede conectar.
import { useCelo } from "@celo/react-celo";
function App() {
const { connect, address } = useCelo();
return (
<>
{address ? (
<div>Connected to {address}</div>
) : (
<button onClick={connect}>Connect wallet</button>
)}
</>
);
}
Después de conectar a una cuenta se establecerá la propiedad dirección
.
Usar ContractKit para leer datos en cadena
Ahora que hemos conectado a una cuenta y tenemos la dirección del usuario, podemos utilizar el kit
para consultar datos en cadena:
import { useCelo } from '@celo/react-celo';
function App() {
const { kit, address } = useCelo();
async function getAccountSummary() {
const accounts = await kit.contracts.getAccounts();
await accounts.getAccountSummary(address);
}
return (
...
)
}
Accediendo a cuentas de usuario
El mayor problema al desarrollar DApps es asegurar una experiencia de nivel Web2 mientras se gestiona la naturaleza defectuosa y a menudo lenta de blockchains. Para ello, hemos diseñado react-celo de una manera que abstrae la mayor parte de ese dolor.
Conectar inicialmente a la cuenta de un usuario es una cosa, manejada a través de la función connect
que acabamos de mencionar. Sin embargo, una vez que un usuario se ha conectado a tu DApp podemos hacer la experiencia más agradable para ellos en visitas repetidas.
Última cuenta conectada
react-celo recordará la última dirección conectada de un usuario cuando vuelva a su aplicación o actualice su DApp. Asegúrese de que al desarrollar su DApp nada cambia en la interfaz de usuario si el usuario tiene o no una propiedad kit.defaultAccount
.
import { useCelo } from "@celo/react-celo";
const { address } = useCelo();
Obtener una cuenta conectada
Cuando un usuario refresca o navega de vuelta a tu página, puede que ya no tenga necesariamente una cuenta conectada, sin embargo no deberíamos necesitar pedirle que se conecte de nuevo sólo para ver la página, eso sólo se puede hacer al realizar una acción.
Para esa funcionalidad tenemos los métodos performActions
y getConnectedKit
. El uso se parece un poco a esto para getConnectedKit
:
import { useCelo } from "@celo/react-celo";
function App() {
const { getConnectedKit } = useCelo();
async function transfer() {
const kit = await getConnectedKit();
const cUSD = await kit.contracts.getStableToken();
await cUSD.transfer("0x...", 10000).sendAndWaitForReceipt();
}
return <button onClick={transfer}>Transfer</button>;
}
y esto para performActions
:
import { useCelo } from "@celo/react-celo";
function App() {
const { performActions } = useCelo();
async function transfer() {
await performActions(async (kit) => {
const cUSD = await kit.contracts.getStableToken();
await cUSD.transfer("0x...", 10000).sendAndWaitForReceipt();
});
}
return <button onClick={transfer}>Transfer</button>;
}
El método performActions
también se encargará de mostrar un modal al usuario diciéndole que confirme cualquier acción en su billetera conectada.
Administración de redes
react-celo proporciona una variable network
y una función updateNetwork
que puede utilizar para mostrar la red conectada actualmente, así como para cambiar a otra diferente (por ejemplo, Alfajores, Baklava o Mainnet).
Si prefieres que tu DApp solo acceda a una red específica (tal vez estás implementando tu sitio web de testnet en https://test-app.dapp. el nombre
y la versión del mainnet en https://app.dapp. ame
) puede pasar la red que desea utilizar como variable al proveedor con el que envuelve su aplicación:
También puede pasar un accesorio de network
al CeloProvider
como la red inicial predeterminada
walletChainId vs red
useCelo
devuelve dos propiedades. red, un objeto con un nombre, un chainId y una url rpc. es con qué cadena o red se está comunicando el dapp. walletChainId
es el código de cadena al que está conectado la billetera/firma (suponiendo que este es un concepto que tiene uno) o será nulo. a menos que el modo de red manual esté habilitado, estos serán consistentes o walletChainId será nulo.
import { CeloProvider, Alfajores, NetworkNames } from '@celo/react-celo';
function WrappedApp({ Component, pageProps }) {
return (
<CeloProvider
...
networks={[Alfajores]}
network={{
name: NetworkNames.Alfajores,
rpcUrl: 'https://alfajores-forno.celo-testnet.org',
graphQl: 'https://alfajores-blockscout.celo-testnet.org/graphiql',
explorer: 'https://alfajores-blockscout.celo-testnet.org',
chainId: 44787,
}}
>
<App />
</CeloProvider>
);
}
function App () {
...
}
Asegúrese de comprobar la aplicación de ejemplo de react-celo para un escaparate de cómo la administración de red funciona en mayor profundidad. Normalmente querrás mostrar un menú desplegable a tus usuarios permitiéndoles seleccionar la red a la que conectar.
import { useCelo } from "@celo/react-celo";
function App() {
const { network, updateNetwork } = useCelo();
return <div>Currently connected to {network}</div>;
}
Extendiendo redes soportadas
Por defecto Use-Contractkit sólo soporta redes de Celo Blockchain. Sin embargo, puedes extender esto para incluir otras cadenas que elijas como Ethereum, Polygon, Avalanche etc pasando su array de Network
en CeloProvider
. Tenga en cuenta que esta característica se considera experimental y funciona mejor con billeteras como Metamask.
Modo de red manual
Optar por que React-Celo no cambie automáticamente la red en la que está la dapp / wallet. walletChainId
podría ser diferente a la network.chainId
de dapp. DEBES usar updateNetwork
para establecer la cadena deseada en este caso.
Ajustar FeeCurrency
react-celo proporciona una variable feeCurrency
y una función updateFeeeCurrency
que puede utilizar para mostrar la feeCurrency seleccionada actualmente (cUSD, CELO, CSLO). La feeCurrency también se puede pasar al componente proveedor. Los valores válidos son CeloContract.GoldToken
, CeloContract.StableToken
, CeloContract.StableTokenEUR
. CeloContract puede importarse así:
import { CeloTokenContract } from '@celo/contractkit'
Temas y modo oscuro
Actualmente react-celo soporta modo oscuro y modo claro (también conocido por defecto) a través del ajuste de la caja para usar la modal en modo oscuro, simplemente añade la clase tw-dark
a la raíz <html />
etiqueta de la página web.
Si los estilos por defecto no son a tu gusto, puedes proporcionar un objeto de tema definido como tal. Puedes hacerlo durante la configuración de tu dapp, en el nivel de Provider
. O sobre la marcha (digamos, si tus usuarios pueden cambiar el tema de tu dapp), a través de updateTheme
.
interface Theme {
primary: string;
secondary: string;
text: string;
textSecondary: string;
textTertiary: string;
muted: string;
background: string;
error: string;
}
Registro y depuración
Registramos por defecto debug
o superior en modo desarrollo. Se determinan las variables de entorno: estableciendo DEBUG
a true
o ajustando NODE_ENV
a algo más que production
). En el modo de producción, solo registramos error
.
Pero usted es bienvenido a proporcionar su propio registrador a nivel de proveedor. Debería implementar nuestra interfaz ILogger
que se ve así:
interface ILogger {
debug(...args: unknown[]): void;
log(...args: unknown[]): void;
warn(...args: unknown[]): void;
error(...args: unknown[]): void;
}
Desarrollo
Para ejecutar todos los paquetes localmente a la vez, simplemente clone este repositorio y ejecute:
yarn;
yarn build; #sólo necesita ejecutarse la primera vez
yarn dev;
Un servidor de recarga en caliente debería aparecer en localhost:3000, es exactamente lo mismo que en react-celo-c-labs.vercel.app.
Alternativamente, puedes ejecutar react-celo
individualmente y la aplicación example
en paralelo.
Para eso, todavía necesitas ejecutar yarn
en la raíz.
Luego, puedes ejecutar react-celo
en una pestaña:
cd packages/react-celo
yarn dev
y ejecuta la aplicación example
en otra:
cd packages/example
yarn dev
Soporte
¿Luchando con algo relacionado con react-celo? Salta al GitHub Discussions o celo-org discord channel y pide ayuda en cualquier momento.
Guías
Puedes encontrar más información de casos de uso especializado en nuestras Guías