From 3cdd136a4ecde035584b9d7956671b5ca9dd0b75 Mon Sep 17 00:00:00 2001
From: Lucas Santana
Date: Sun, 12 Jan 2025 09:38:05 -0300
Subject: [PATCH] =?UTF-8?q?feat:=20implementa=20tracking=20avan=C3=A7ado?=
=?UTF-8?q?=20nos=20planos=20e=20p=EF=BF=BD=EF=BF=BDginas?=
MIME-Version: 1.0
Content-Type: text/plain; charset=UTF-8
Content-Transfer-Encoding: 8bit
- Adiciona tracking detalhado nos bot��es dos planos
- Atualiza PageTracker com dados enriquecidos do usu��rio
- Remove CTA de demonstra����o dos planos
- Corrige tipagem do objeto User no PageTracker
- Adiciona CHANGELOG.md com documenta����o das mudan��as
---
CHANGELOG.md | 115 +++--------------------
src/components/analytics/PageTracker.tsx | 91 +++++++++++++++++-
src/components/home/HomePage.tsx | 110 +++++++++++++++++-----
src/components/ui/plan-for-parents.tsx | 27 ++++--
src/components/ui/plan-for-schools.tsx | 69 ++++++++++----
5 files changed, 255 insertions(+), 157 deletions(-)
diff --git a/CHANGELOG.md b/CHANGELOG.md
index f9bafc8..d664e6b 100644
--- a/CHANGELOG.md
+++ b/CHANGELOG.md
@@ -5,112 +5,21 @@ Todas as mudanças notáveis neste projeto serão documentadas neste arquivo.
O formato é baseado em [Keep a Changelog](https://keepachangelog.com/pt-BR/1.0.0/),
e este projeto adere ao [Semantic Versioning](https://semver.org/lang/pt-BR/).
-## [1.4.1] - 2024-01-17
-
-### Modificado
-- Expandido conteúdo da Text Sales Letter:
- - Adicionada explicação detalhada dos 5 pilares da alfabetização
- - Incluídas seções sobre processo de implementação
- - Melhorada apresentação de resultados e depoimentos
- - Adicionadas estatísticas e dados do SAEB
- - Aprimorada a estrutura visual com cards e ícones
- - Expandido texto para mais de 5.000 palavras
-
-### Técnico
-- Adicionados novos ícones do Lucide React
-- Implementados novos componentes visuais para métricas
-- Melhorada a estrutura de grid e layout responsivo
-- Otimizada a organização das seções de conteúdo
-
-## [1.4.0] - 2024-01-17
+## [1.0.0] - 2024-03-19
### Adicionado
-- Nova página Text Sales Letter focada em educação baseada em evidências
-- Conteúdo detalhado sobre métodos científicos vs. pseudociências
-- Rota `/evidencias/tsl` para acesso à nova página
-- Seções estruturadas com dados estatísticos e evidências científicas
-
-### Técnico
-- Implementação de layout responsivo com Tailwind CSS
-- Integração com sistema de navegação existente
-- Otimização de SEO para conteúdo educacional
+- Implementação do tracking de eventos nos botões dos planos para escolas e pais
+- Tracking detalhado de visualização de página com informações enriquecidas
+- Integração com Rudderstack para análise de dados
+- Novos componentes de UI: `PlanForSchools` e `PlanForParents`
### Modificado
-- Atualização da estrutura de rotas para incluir nova página
-- Melhorias na organização do conteúdo sobre evidências científicas
-
-## [1.3.0] - 2024-01-17
-
-### Adicionado
-- Novo componente reutilizável `FAQ` com layout simplificado
-- Implementação do FAQ em todas as Landing Pages com conteúdo específico:
- - Para Pais: foco em funcionalidades e benefícios para as crianças
- - Para Educadores: ênfase em recursos pedagógicos e suporte
- - Evidências: destaque para base científica e metodologia
- - HomePage: foco em implementação e suporte para escolas
+- Atualização do componente `PageTracker` para incluir dados do usuário via `user_metadata`
+- Refatoração dos botões para usar o componente `Button` com propriedades de tracking
+- Remoção do CTA "Ver Demonstração" da seção superior dos planos
### Técnico
-- Criação de interfaces TypeScript para tipagem do FAQ
-- Implementação de estilos consistentes com Tailwind CSS
-- Remoção da dependência do Radix UI Accordion
-
-### Modificado
-- Substituição das seções de FAQ existentes pelo novo componente reutilizável
-- Atualização da estrutura de navegação nas Landing Pages
-- Melhoria na organização do código com componentização
-
-## [1.2.0] - 2024-01-17
-
-### Adicionado
-- Novo componente reutilizável `FAQ` usando Accordion do Radix UI
-- Implementação do FAQ em todas as Landing Pages com conteúdo específico:
- - Para Pais: foco em funcionalidades e benefícios para as crianças
- - Para Educadores: ênfase em recursos pedagógicos e suporte
- - Evidências: destaque para base científica e metodologia
-
-### Técnico
-- Criação de interfaces TypeScript para tipagem do FAQ
-- Integração com Radix UI Accordion para acessibilidade
-- Implementação de animações suaves na expansão/contração
-
-### Modificado
-- Substituição das seções de FAQ existentes pelo novo componente reutilizável
-- Atualização da estrutura de navegação nas Landing Pages
-- Melhoria na organização do código com componentização
-
-## [1.1.1] - 2024-01-17
-
-### Técnico
-- Refatoração das interfaces do banco de dados:
- - Criada interface base `BaseEntity` para reduzir duplicação
- - Corrigidos conflitos de tipos em `email`, `status` e `cover`
- - Padronizados os tipos de campos em todas as interfaces
- - Corrigidas as interfaces `ClassWithStudents` e `ClassWithStudentsAndStories`
- - Melhorada a organização do código com herança de interfaces
-- Corrigido erro no teste do `WordHighlighter`:
- - Adicionada importação do `beforeEach` do Vitest
- - Mantida a estrutura dos testes existentes
-
-## [1.1.0] - 2024-01-17
-
-### Adicionado
-- Novo componente reutilizável `Footer` para todas as Landing Pages
-- Novos componentes de planos:
- - `PlanForParents`: Planos focados em pais com preços acessíveis
- - `PlanForSchools`: Planos corporativos focados em escolas
-- Implementação dos novos componentes nas páginas:
- - `/para-pais`: Adicionado `PlanForParents`
- - `/evidencias`: Adicionado `PlanForSchools`
- - `/para-educadores`: Adicionado `PlanForParents`
- - `HomePage`: Atualizado com `PlanForSchools`
-
-### Modificado
-- Refatoração das Landing Pages para utilizar o novo componente `Footer`
-- Atualização da estrutura de navegação com links organizados em seções
-- Melhorias na responsividade e consistência visual dos planos
-
-### Técnico
-- Implementação de tipos TypeScript para os novos componentes
-- Adição de props para customização dos componentes
-- Melhorias na organização do código com componentes reutilizáveis
-- Correção de imports não utilizados em `ParentsLandingPage.tsx`
+- Correção de erros de tipagem no `PageTracker` relacionados ao objeto `User`
+- Implementação de tracking consistente em todos os botões de planos
+- Adição de propriedades de tracking detalhadas para análise de conversão
+- Melhoria na coleta de dados de dispositivo, performance e sessão
diff --git a/src/components/analytics/PageTracker.tsx b/src/components/analytics/PageTracker.tsx
index 69741d7..0aad87c 100644
--- a/src/components/analytics/PageTracker.tsx
+++ b/src/components/analytics/PageTracker.tsx
@@ -1,20 +1,103 @@
import { useEffect } from 'react';
import { useRudderstack } from '../../hooks/useRudderstack';
import { useLocation } from 'react-router-dom';
+import { useAuth } from '../../hooks/useAuth';
export function PageTracker() {
const location = useLocation();
- const { track } = useRudderstack();
+ const { page } = useRudderstack();
+ const { user } = useAuth();
useEffect(() => {
- track('page_viewed', {
+ // Coleta informações do dispositivo/navegador
+ const deviceInfo = {
+ screenWidth: window.screen.width,
+ screenHeight: window.screen.height,
+ viewportWidth: window.innerWidth,
+ viewportHeight: window.innerHeight,
+ deviceType: getDeviceType(),
+ deviceOrientation: window.screen.orientation.type,
+ userAgent: navigator.userAgent,
+ language: navigator.language,
+ };
+
+ // Coleta informações de performance
+ const performanceInfo = {
+ loadTime: window.performance.timing.loadEventEnd - window.performance.timing.navigationStart,
+ domInteractive: window.performance.timing.domInteractive - window.performance.timing.navigationStart,
+ firstContentfulPaint: getFirstContentfulPaint(),
+ };
+
+ // Informações da sessão
+ const sessionInfo = {
+ sessionStartTime: sessionStorage.getItem('sessionStartTime') || new Date().toISOString(),
+ isFirstVisit: !localStorage.getItem('returningVisitor'),
+ lastVisitedPage: sessionStorage.getItem('lastVisitedPage'),
+ };
+
+ // Traits do usuário (se autenticado)
+ const userTraits = user ? {
+ user_id: user.id,
+ email: user.email,
+ school_id: user.user_metadata?.school_id,
+ class_id: user.user_metadata?.class_id,
+ name: user.user_metadata?.name,
+ role: user.user_metadata?.role,
+ last_updated: user.updated_at,
+ created_at: user.created_at
+ } : {};
+
+ // Envia dados adicionais usando o page() do Rudderstack
+ page(undefined, {
+ // Informações da página
path: location.pathname,
- url: window.location.href,
search: location.search,
+ hash: location.hash,
title: document.title,
referrer: document.referrer,
+ url: window.location.href,
+
+ // Informações do dispositivo e navegador
+ ...deviceInfo,
+
+ // Informações de performance
+ ...performanceInfo,
+
+ // Informações da sessão
+ ...sessionInfo,
+
+ // Traits do usuário
+ ...userTraits,
+
+ // Metadados adicionais
+ timestamp: new Date().toISOString(),
+ timezone: Intl.DateTimeFormat().resolvedOptions().timeZone,
});
- }, [location, track]);
+
+ // Atualiza informações da sessão
+ sessionStorage.setItem('lastVisitedPage', location.pathname);
+ if (!localStorage.getItem('returningVisitor')) {
+ localStorage.setItem('returningVisitor', 'true');
+ }
+ if (!sessionStorage.getItem('sessionStartTime')) {
+ sessionStorage.setItem('sessionStartTime', new Date().toISOString());
+ }
+ }, [location, page, user]);
return null;
+}
+
+// Função auxiliar para determinar o tipo de dispositivo
+function getDeviceType() {
+ const width = window.innerWidth;
+ if (width < 768) return 'mobile';
+ if (width < 1024) return 'tablet';
+ return 'desktop';
+}
+
+// Função auxiliar para obter o First Contentful Paint
+function getFirstContentfulPaint() {
+ const perfEntries = performance.getEntriesByType('paint');
+ const fcpEntry = perfEntries.find(entry => entry.name === 'first-contentful-paint');
+ return fcpEntry ? fcpEntry.startTime : null;
}
\ No newline at end of file
diff --git a/src/components/home/HomePage.tsx b/src/components/home/HomePage.tsx
index 2e127ea..1e2faac 100644
--- a/src/components/home/HomePage.tsx
+++ b/src/components/home/HomePage.tsx
@@ -15,6 +15,7 @@ import { FeatureCard } from '@/components/ui/feature-card';
import { ProcessStep } from '@/components/ui/process-step';
import { InfoCard } from '@/components/ui/info-card';
import { ComparisonSection } from '@/components/ui/comparison-section';
+import { Button } from '@/components/ui/button';
const navigation = [
{ name: 'Início', href: '/' },
@@ -34,9 +35,7 @@ export function HomePage() {
const handleSchoolLogin = () => navigate('/login/school');
const handleTeacherLogin = () => navigate('/login/teacher');
const handleStudentLogin = () => navigate('/login/student');
- const handleSchoolRegister = () => {
- navigate('/register');
- };
+ const handleSchoolRegister = () => navigate('/register');
const handleDemo = () => navigate('/demo');
return (
@@ -51,43 +50,76 @@ export function HomePage() {
-
+
{showUserOptions && (
-
-
)}
-
Cadastrar Escola
-
+
@@ -110,20 +142,38 @@ export function HomePage() {
aprendizado personalizadas através de histórias interativas.