Executando verificação de segurança...
2

Como criar uma extensão no google chrome com react e tailwind

Caso você goste de conteúdo em vídeo, aproveite para se inscrever no meu canal e ativar as notificações para não perder nenhum conteúdo novo!
VIDEO IMAGE

Agora bora para o conteúdo!

https://media.giphy.com/media/v1.Y2lkPTc5MGI3NjExdXlvbHYxcWoxOHBraDg5dWFuNm05emRndzNrd3pjaDBnNWVuMXJrbiZlcD12MV9pbnRlcm5hbF9naWZfYnlfaWQmY3Q9Zw/t3sZxY5zS5B0z5zMIz/giphy-downsized-large.gif
Se você é um desenvolvedor e já está familiarizado com as milhares de extensões disponíveis no Chrome, sabe que algumas delas facilitam muito a nossa vida.

É possível automatizar tarefas, criar processos e consumir dados que ajudam no desenvolvimento, como, por exemplo, o Redux DevTool, React DevTool, e aplicativos que auxiliam na correção de textos.

Enfim, é um mercado gigantesco. Basta dar uma olhada na loja do Google Chrome, onde você encontra quase de tudo, desde aplicativos para produtividade até apps que modificam o cursor do mouse.

Neste artigo, vou te ensinar o básico para criar sua própria extensão com react, vite e tailwind. A extensão que vamos desenvolver é um simples gerador de CPF e CNPJ, o codigo fonte esta aqui.

Ada foto

Vamos para o código?

SETUP

Primeiro você precisa ter um projeto rodando em vite

npm create vite@latest my-project -- --template react

Para instalar o Tailwind, você pode fazer isso facilmente seguindo a documentação oficial do próprio Tailwind.

Criando arquivo manifest

Agora na pasta public crie um arquivo manifest.json

O arquivo manifest.json é um arquivo de manifesto utilizado em extensões do navegador, incluindo extensões para o Google Chrome, Mozilla Firefox, Microsoft Edge e outros navegadores que suportam extensões.

O manifest.json contém informações sobre a extensão, como nome, versão, descrição, ícones, permissões necessárias, páginas que a extensão deve incluir ou modificar, entre outras configurações. Esse arquivo é essencial para a criação e funcionamento de uma extensão.

{
  "name": "Extensions",
  "description": "Chrome Extension",
  "version": "1.0",
  "manifest_version": 3,
  "action": {
    "default_popup": "index.html",
    "default_title": "Extension"
  },
  "icons": {
    "16": "document.png",
    "48": "document.png",
    "128": "document.png"
  },
  "content_security_policy": {
    "extension_pages": "script-src 'self'; object-src 'self';"
  }
}

Rodando

Agora so rodar npm run build abrir o google chrome ir em configurações/extensão/gerenciar extensão e muuuuuuito importante você estar com o modo desenvolvedor habilitado beleza?

Depois você clica em 'Carregar sem compactação' e selecionar sua pasta de dist e pronto!!

Sua primeira extensão ja esta criada. Agora o Céu e o limite para você.
https://media.giphy.com/media/v1.Y2lkPTc5MGI3NjExeWp0Y25mcmc4ZmxxM2gzN3ppZ2wxbXZneXo4cHRtemN6azg4ZGZnbiZlcD12MV9pbnRlcm5hbF9naWZfYnlfaWQmY3Q9Zw/dWBn8eg9Ygpc2eBn5L/giphy-downsized-large.gif

Gerador de documentos

Para criar o gerador de documentos você precisa dessa lib

npm install cpf-cnpj-validator

No arquvio App.jsx altere para

...
import { cpf, cnpj } from 'cpf-cnpj-validator';
...

function App() {
  const [typeOperation, setTypeOperation] = useState('cpf');
  const [isFormat, setIsFormat] = useState(true);
  const [inputValue, setInputValue] = useState('');
  const [isAlert, setIsAlert] = useState(false);

  const operations = {
    cpf: {
      generate: cpf.generate,
      format: cpf.format,
    },
    cnpj: {
      generate: cnpj.generate,
      format: cnpj.format,
    },
  };

  useEffect(() => {
    setInputValue(operations[typeOperation].generate(isFormat));
  }, [typeOperation]);

  function generateDocument() {
    const value = operations[typeOperation].generate(isFormat);
    setInputValue(value);
  }

  async function showAlert() {
    setIsAlert(true);
    await navigator.clipboard.writeText(inputValue);
    setTimeout(() => setIsAlert(false), 2500);
  }

  return (
    <>
      <div className="flex justify-center">
        <div>
          <p className=" text-3xl font-bold my-3">
            Gerador de documento brasileiro
          </p>
          <p>Selecione o tipo o documento</p>
          <div className="flex mb-4">
            <Checkbox
              label="CPF"
              onChange={() => setTypeOperation('cpf')}
              checked={typeOperation == 'cpf'}
            />
          </div>
          <div className="flex items-center ">
            <Checkbox
              label="CNPJ"
              onChange={() => setTypeOperation('cnpj')}
              checked={typeOperation === 'cnpj'}
            />
          </div>
          <div className="flex  items-center justify-between ">
            <Toggle
              label="Formatado?"
              checked={isFormat}
              onChange={(e) => {
                setInputValue(
                  !isFormat
                    ? operations[typeOperation].format(inputValue)
                    : inputValue.replace(/\D/g, '')
                );
                setIsFormat(!isFormat);
              }}
            />
            <Button text="Gerar" onClick={() => generateDocument()} />
          </div>
          <div className="relative my-3">
            <input
              type="search"
              id="search"
              className="block w-full p-4 pl-10 text-sm text-gray-900 border border-gray-300 rounded-lg bg-gray-50 focus:ring-blue-500 focus:border-blue-500 my-3"
              placeholder="Search"
              value={inputValue}
              required
              disabled
            />
            {isAlert && (
              <div
                class="p-4 mb-4 text-sm text-green-800 rounded-lg bg-green-50 dark:bg-gray-800 dark:text-green-400 mt-3"
                role="alert"
              >
                <span class="font-medium">Copiado com sucesso 😊 </span>
              </div>
            )}
            <Button text="Copiar" onClick={() => showAlert()} />
          </div>
        </div>
      </div>
      <div className="flex mt-3 text-sm text-gray-400">
        <a href="https://lorenaporphirio.com/" target="_blank">
          Feito por: Lorena Porphirio ✨
        </a>
      </div>
    </>
  );
}

export default App;

Espero que eu tenha te ajudado em algo, boa sorte na sua jornada!

Caso você tenha gostado desse conteúdo, da uma olhada la no youtube, e se fazer sentido para você se inscreva =)

Para mais conteúdo em texto tem meu site

Até a próxima!
https://media.giphy.com/media/v1.Y2lkPTc5MGI3NjExZTgzaGt5M3ZxcXMzem5yOHFuZjVnbHQ2c3dpMmV2Z2p1ZjhlM3I1cyZlcD12MV9pbnRlcm5hbF9naWZfYnlfaWQmY3Q9Zw/cMPdlbcUKl3xkMCyD3/giphy.gif

Carregando publicação patrocinada...
1

Muito bom, acho que muitas pessoas vao querer usar, caso vc publicar e fazer um bom anuncio.
Porém o google store nao esta mais aceitando extensoes pagar....