Roadmap
Avançado

𝕏 (Twitter) Descentralizado

Crie um clone do twitter na blockchain

ethers
solidity
vue
tailwind
vercel
github

Adicionando as funções de integração com o MetaMask

Agora adicionaremos um pouco de javascript (e maizena kkkk) dentro do arquivo src/App.vue no projeto x-front-end. Então, copie o código abaixo e cole no arquivo App.vue:

App.vue
<script setup>
import XButton from './components/XButton.vue';
import XTextField from './components/XTextField.vue';
import XPost from './components/XPost.vue';

import { ref, onMounted, watchEffect } from "vue";

const connectedWallet = ref(null);
const loading = ref(false);

const getEthereumObject = () => window.ethereum;

const findMetamaskAccount = async () => {
  loading.value = true;
  try {
    const ethereum = getEthereumObject();

    if (!ethereum) {
      console.error("Instale a extensão do MetaMask!");
      return null;
    }

    console.log("A extensão do MetaMask está instalada:", ethereum);

    const accounts = await ethereum.request({ method: "eth_accounts" });
    if (accounts.length !== 0) {
      const account = accounts[0];
      console.log("Conta MetaMask conectada:", account);
      connectedWallet.value = account;
      return account;
    } else {
      console.error("Nenhuma conta MetaMask conectada D:");
      return null;
    }
  } catch (error) {
    console.error(error);
    return null;
  } finally {
    loading.value = false;
  }
};

const connectWallet = async () => {
  loading.value = true;
  try {
    const ethereum = getEthereumObject();
    if (!ethereum) {
      alert("Instale a extensão do MetaMask!");
      return;
    }

    const accounts = await ethereum.request({
      method: "eth_requestAccounts",
    });

    console.log("Connected", accounts[0]);
    connectedWallet.value = accounts[0];
    getAllWaves();
  } catch (error) {
    console.error(error);
  }
  loading.value = false;
};

onMounted(async() => {
  await findMetamaskAccount();
})

</script>

<template>
  <main
    class="bg-gray-900 min-h-screen flex items-center justify-center flex-col p-20"
  >
    <div
      class="rounded-md border border-gray-700 text-white bg-gray-800 p-6 mx-auto w-full max-w-[600px]"
    >
      <h1 class="text-2xl mb-4">𝕏 (Twitter) Descentralizado</h1>
      <p class="text-base mb-4">
        Esse é um twitter descentralizado, conecte sua sua carteira blockchain e
        use seus Ethereums para enviar uma mensagem. Cada post enviado você terá
        chance de ganhar um valor de Ethereum de volta.
      </p>
      <XButton v-if="!connectedWallet" text="Conectar carteira" @click="connectWallet" :loading="loading" />
      <template v-else>
        <XTextField label="Post" name="post" class="mb-2" type="text" id="post" placeholder="John" required />
        <XButton text="Enviar post" />
        <div class="flex items-center">
          <span
            class="bg-green-100 text-green-800 text-xs font-semibold mr-2 px-2.5 py-0.5 rounded dark:bg-green-200 dark:text-green-900 h-fit"
          >
            Carteira conectada!
          </span>
          <span class="truncate">
            {{ connectedWallet }}
          </span>
        </div>
      </template>
    </div>
    <div
      class="mt-8 rounded-md border border-gray-700 text-white bg-gray-800 p-6 mx-auto w-full max-w-[600px]"
      v-if="connectedWallet"
    >
      <h1 class="text-white text-lg mb-4">Todos os posts</h1>
      <div class="text-center mb-4">Carregando...</div>
      <XPost address="123" timestamp="16:54" message="Descrição da mensagem" />
    </div>
  </main>
</template>
Clique aqui para expandir

Eu adicionei uns console.log para que vocês entendam o que está acontecendo, mas para explicar um pouco mais, nós adicionamos uma função getEthereumObject que retornará a variável global chamada window.ethereum. Essa variável global só existirá se a extensão do MetaMask estiver instalada no seu computador.

Dica: para entender um pouco mais como a variável window.ethereum funciona, você pode acessar a documentação do MetaMask.

Em seguida, criamos a função findMetaMaskAccount e chamamos-a dentro do onMounted para verificar se existe uma carteira conectada toda vez que renderizar a página.

Além disso, nós temos a função principal chamada connectWallet que ao executá-la abrirá o pop-up do MetaMask para conectar com sua carteira ao site.

Salve as atualizações e rode o projeto com npm run dev. Se tudo der certo, sua tela ficará assim:

Conectando sua carteira MetaMask

Pronto! Agora você pode clicar no botão azul "Conectar carteira" e perceba esse pop-up no seu navegador:

Clique no botão "Conectar" e seu app ficará assim:

Agora, é só lembrar de enviar tudo para o GitHub como foi explicado nessa aula aqui.

Parabéns por chegar até aqui! Não deixe de compartilhar seu progresso no Twitter ou LinkedIn.

Opa, calma aí!

Parece que você não está logado, caso tenha interesse em salvar seu progresso de estudo faça login agora.