3. Obtener Datos de la Cadena
En el tercer capítulo del tutorial sobre construir una dapp de extremo a extremo en Aptos, aprenderás a obtener datos de la cadena.
Nuestra lógica de interfaz de usuario depende de si la cuenta conectada ha creado una lista de tareas. Si la cuenta ha creado una lista de tareas, nuestra aplicación debería mostrar esa lista; si no, la aplicación debería mostrar un botón ofreciendo la opción de crear una nueva lista.
Para eso, primero necesitamos verificar si la cuenta conectada tiene un recurso TodoList
. En nuestro contrato inteligente, cada vez que alguien crea una lista de tareas creamos y asignamos un recurso TodoList
a su cuenta.
Para obtener datos de la cadena, podemos usar el SDK de TypeScript de Aptos. El SDK proporciona clases y funciones para que podamos interactuar y consultar fácilmente la cadena de Aptos.
Para comenzar:
- Detén el servidor local si está ejecutándose.
- Importa wallet del proveedor React del adaptador de billetera:
import { useWallet } from "@aptos-labs/wallet-adapter-react";
- Extrae el objeto account del adaptador de billetera:
function App() { const { account } = useWallet();}
El objeto account
es null
si no hay una cuenta conectada; cuando una cuenta está conectada, el objeto account
contiene la información de la cuenta, incluyendo la dirección de la cuenta.
- A continuación, queremos obtener el recurso TodoList de la cuenta.
Comienza importando
useEffect
usandoimport { useEffect } from "react";
Agreguemos un hookuseEffect
a nuestro archivo que llamaría a una función para obtener el recurso cada vez que cambie nuestra dirección de cuenta:
function App() { import { useEffect } from "react" ... useEffect(() => { fetchList(); }, [account?.address]); ...}
- Antes de crear nuestra función
fetchList
, también creemos un estado local para almacenar si la cuenta tiene una lista:
function App() { ... const [accountHasList, setAccountHasList] = useState<boolean>(false); ...}
también importa useState
usando
import { useState, useEffect } from "react";
- Importa la variable
MODULE_ADDRESS
usandoimport { MODULE_ADDRESS } from "./constants";
. Esta es la dirección del módulo que publicamos en el capítulo anterior. - Importa
aptosClient
usandoimport { aptosClient } from "./utils/aptosClient";
. Este es un cliente quecreate-aptos-dapp
creó para nosotros para interactuar con la cadena. - Nuestro hook
useEffect
está llamando a una funciónfetchList
; vamos a crearla:
const fetchList = async () => { if (!account) return []; const moduleAddress = MODULE_ADDRESS; try { const todoListResource = await aptosClient().getAccountResource( { accountAddress:account?.address, resourceType:`${moduleAddress}::todolist::TodoList` } ); setAccountHasList(true); } catch (e: any) { setAccountHasList(false); }};
Repasemos el código de la función fetchList
.
Primero, usamos la propiedad account
de nuestro proveedor de billetera para asegurarnos de que hay una cuenta conectada a nuestra aplicación.
Luego, usamos el método getAccountResource
de aptosClient
para obtener el recurso de la cuenta. Esta función toma la dirección de la cuenta y el tipo de recurso que queremos obtener.
Si la función se ejecuta exitosamente, significa que la cuenta tiene un recurso TodoList
, así que establecemos accountHasList
a true
.
Si la función falla (i.e., arroja un error), significa que la cuenta no tiene un recurso TodoList
, así que establecemos accountHasList
a false
.
- Ahora, actualicemos nuestra interfaz de usuario para mostrar contenido diferente basado en el estado
accountHasList
:
function App() { ... return ( <> <TopBanner /> <Header /> <div className="flex items-center justify-center flex-col"> {!accountHasList ? ( <div> <h2>Crear una nueva lista</h2> <Button>Agregar nueva lista</Button> </div> ) : ( <div> <h2>Mi Lista de Tareas</h2> <p>Aquí estarán tus tareas...</p> </div> )} </div> </> );}
- No olvides importar el componente
Button
. Agrégalo a tus importaciones:
import { Button } from "@/components/ui/button";
¡Excelente! Ahora nuestra aplicación puede verificar si una cuenta conectada tiene una lista de tareas y mostrar contenido diferente basado en eso.
En el siguiente capítulo, aprenderemos cómo enviar datos a la cadena para crear una nueva lista de tareas.