WG

Wendeson Gomes

Desenvolvedor Front-End

Como fiz meu site e por que utilizei um design minimalista
Aqui vou mostrar, como fiz meu site e o porque escolhi algumas bibliotecas, tentei ser o mais coeso possível, mostrei algumas parte de código de como usar umas bibliotecas mas se caso ficar alguma duvida pode entrar em contato comigo que ficarei feliz em tirar sua duvida, se caso tem uma critica construtiva pode me chamar para conversar que ficarei feliz em conversa com você. Meu ou Para construir o site, tentei fazer algo rápido e prático, onde não precisasse demorar muito para construir as coisas, então usei o Nextjs Tailwindcss TailwindTypography Shadcn ui Marked Datefns Hygraph CMS acho que todo mundo deve tá cansado de ver nextjs, tailwindcss e shadcn, mas temos que concordo que esses 3 junto agiliza muito para um projeto pequeno, e vários projetos grandes hoje em dia usam essas bibliotecas, o usei para fazer automaticamente a transformação do Markdown em HTML e para estilizálo usei o que com a penas uma className todo meu css é estilizado, o usei para simplesmente para colocar as datas de uma forma mais fácil, e chegamos a parte principal do site o hygraph CMS*, simplesmente praticamente tudo nesse site está lá, se você nunca usou e tem curiosidade de usar, vou mostrar como utilizei ele. Para quem não conhece esses dois (acho muito difícil), o transforma todo seu texto Markdown em código HTML com simplesmente um código ``` const texto = "const markdown = marked.parse(texto)
// Depois disso o // e no site vai ficar desta forma abaixo. //
//

Titulo

//
``` Simples não? Agora vamos fazer só uma coisa muito simples, adicionar o e depois colocar uma className chamada prose ``` const texto = "const markdown = marked.parse(texto)
``` Pronto, simples, fácil e prático, sério, isso é muito rápido de fazer e sem dor de cabeça. Agora vamos para o , na documentação deles, eles recomendam usar o . Tentei sinceramente de todas as formas e não consegui. Se você que está lendo sabe como utilizar ele, ficaria muito feliz que me ensinasse, eu colocaria seu crédito aqui. Mas continuando, para usar o usei do seguinte modo ``` export const hygraph = async () => { try { const response = await fetch(process.env.HYGRAPH_URL!, { method 'POST', headers { 'ContentType' 'application/json', Accept 'application/json', Authorization `Bearer ${process.env.HYGRAPH_TOKEN}`, }, body JSON.stringify({ query }), cache 'nostore', }) if (!response.ok) { throw new Error('Error ao buscar a API') } const { data } = await response.json() return data as portfolioProps } catch (error) { console.error('Error ao buscar dados', error) throw error } } ``` quando tenho que chamar essa função em algum lugar, uso desta forma ``` const { abouts } = await hygraph() ``` Como a função está tipada, tenho todas as informações que preciso sem muito esforço e com a ajuda do TypeScript, não sei se foi a melhor forma de fazer isso, mas está servindo muito bem o proposito do site, mas caso você tenha alguma ideia melhor para melhorar isso, aceito sua ajuda e claro sempre vou dar os devidos créditos a todos que me ajudarem! Ao lado direito coloquei os tópicos da página, aonde se clicar em algum que interessou você, o site ira mostrar esse tópico a você, se caso você esta no celular este recurso fica em baixo da data de postagem desse post, quando você desce a página ele ficara preso na parte superior, você pode mover para os lados e procurar o tópico que quer, se caso queira compartilhar algum tópico com seu amigo, pode clicar no tópico que quer do Post, ele ficara de outra cor clicando nele, você ira copiar um URL, quando seu amigo clicar ele será redirecionado para esta página e será redirecionado automaticamente ao tópico! Deixei esse tópico para o final pelo simples modo de ser gosto meu haha, peguei um design da internet e fiz umas modificações, acho que um site aonde mostre suas habilidades é muito importante, mas quis nesse site mostrar mais algo técnico do que algo visual, eu amo animações e estudo atualmente o se gosta de animações olhe essa biblioteca acho que você vai gostar também, por enquanto foi isso, agradeço a todos que chegaram até aqui! <3

Nextjs

Tailwindcss

Hygraph CMS

April 10, 2024 - 4 min read

Como fiz um código que muda minha foto de perfil do BlueSky a cada vez que ganho um follow.
Estava tranquilo em casa quando ouvi falar dessa BlueSky e fui dar uma olhada, olhei e é praticamente o twitter, mas uma coisa que me chamou muito a atenção foi, você pode fazer tudo no site com codigo, fazer bot gratuitamente sem pagar api, postar, editar a foto, trocar o banner, dar like e etc, quando olhei isso pensei "E se eu fizesse um loading na minha foto, que quando chegasse a 100 seguidores ele completasse a minha foto com o loading", e foi isso que eu fiz e vim mostrar para vocês! Nunca mexi muito com o nodejs puro, então ai já começou um desafio legal, mas a documentação e a api do BlueSky é bem intuitiva e completa. Começei instalando o que a documentação pede para a gente se conectar ao BlueSky, depois disso a gente Chama o depois literalmente é só fazer login na sua conta ``` const agent = new BskyAgent({ service 'https//bsky.social' }) await agent.login({ identifier 'User', password 'Password' }) ``` Agora a gente vai pegar a sua foto de perfil e continua sendo muito simples, coloque o username da sua conta para pode pegar o url da foto de perfil que está lá e sua quantidade de seguidores ``` const { data } = await agent.getProfile({ actor username }) const followers = data.followersCount const avatar = data.avatar ``` agora chegamos aonde eu acho que é a parte mais complicada de explicar, fiz um svg aonde ele fica certinho com a imagem que vem do blueSky e precisamos fazer uns calculos para ficar carregando em cima da sua foto de perfil. Primeiro Fazemos o calculo ``` const QuantosSeguidoresQueQuerChegar = 100 const QuantosSeguidoresTemNoMomento = data.followersCount const QuantoOLoadingVaiCarregando = ( 3018 / QuantosSeguidoresQueQuerChegar ) * QuantosSeguidoresTemNoMomento 3018 ``` O é um numero aonde o circulo fica fechado certinho, Pegamos o e dividimos pelo que dar 3 Agora fazemos o SVG da seguinte forma ``` const svg = ` { if (err) { console.error('Erro ao combinar a imagem e o SVG', err); return; } // Vamos carregar essa imagem lá do lado do BlueSky, Não tem como enviar a foto direto pro upsertProfile const { data } = await agent.uploadBlob(readFileSync('imagem_combinada.jpg'), { encoding "image/png" }); // Agora vamos atualizar o perfil await agent.upsertProfile(async existingProfile => { // Verificando se o perfil existe const existing = existingProfile ?? {}; // Vamos atualizar a imagem existing.avatar = data.blob; return existing; }); }); ``` Para verificar coloquei dentro de um while que verifica a quantidade de followers quando alterar ele atualiza a foto de perfil desse modo ``` let verificarQuantidadeDeFollowrs = 0 while (true){ verificarQuantidadeDeFollowrs = QuantosSeguidoresTemNoMomento } ``` No final o codigo ficou desta forma ``` import { BskyAgent } from '@atproto/api'; import { readFileSync } from 'fs'; import sharp from 'sharp'; import axios from 'axios'; async function VerifyAndChangeImage(){ const username = 'User' const password = 'Password' const agent = new BskyAgent({ service 'https//bsky.social' }); try { await agent.login({ identifier username, password password }); let verificarQuantidadeDeFollowrs = 0 while (true) { const { data } = await agent.getProfile({ actor username }); if (data.followersCount === undefined) { console.log('Erro Não foi possível obter o número de seguidores.'); return; } if(verificarQuantidadeDeFollowrs !== data.followersCount){ const QuantosSeguidoresQueQuerChegar = 100 const QuantosSeguidoresTemNoMomento = data.followersCount const QuantoOLoadingVaiCarregando = ( 3018 / QuantosSeguidoresQueQuerChegar ) * QuantosSeguidoresTemNoMomento 3018 verificarQuantidadeDeFollowrs = QuantosSeguidoresTemNoMomento const svg = ` { if (err) { console.error('Erro ao combinar a imagem e o SVG', err); return; } const { data } = await agent.uploadBlob(readFileSync('imagem_combinada.jpg'), { encoding "image/png" }); await agent.upsertProfile(async existingProfile => { const existing = existingProfile ?? {}; existing.avatar = data.blob; return existing; }); }); } await new Promise(resolve => setTimeout(resolve, 15000)); } } catch (error) { console.error(error); } } VerifyAndChangeImage() ```

NodeJS

Sharp

Axios

@atproto/api

April 26, 2024 - 5 min read