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 && (
- - - +
)}
- +
@@ -110,20 +142,38 @@ export function HomePage() { aprendizado personalizadas através de histórias interativas.

- - +
@@ -149,14 +199,22 @@ export function HomePage() { alt="Platform demo" className="w-full h-full object-cover" /> - +
diff --git a/src/components/ui/plan-for-parents.tsx b/src/components/ui/plan-for-parents.tsx index 1b7d0ed..1c303fa 100644 --- a/src/components/ui/plan-for-parents.tsx +++ b/src/components/ui/plan-for-parents.tsx @@ -1,5 +1,6 @@ import React from 'react'; import { CheckCircle } from 'lucide-react'; +import { Button } from './button'; interface PlanProps { title: string; @@ -113,17 +114,27 @@ export function PlanForParents({ ))} - + ))} diff --git a/src/components/ui/plan-for-schools.tsx b/src/components/ui/plan-for-schools.tsx index 9bc95c5..bc5749b 100644 --- a/src/components/ui/plan-for-schools.tsx +++ b/src/components/ui/plan-for-schools.tsx @@ -1,5 +1,6 @@ import React from 'react'; import { CheckCircle } from 'lucide-react'; +import { Button } from './button'; interface PlanProps { title: string; @@ -14,6 +15,7 @@ interface PlanForSchoolsProps { title?: string; description?: string; plans?: PlanProps[]; + onContactClick?: () => void; } const defaultPlans: PlanProps[] = [ @@ -60,19 +62,22 @@ const defaultPlans: PlanProps[] = [ export function PlanForSchools({ title = "Invista em Educação Baseada em Evidências", description = "Escolha o plano ideal para transformar a educação com base científica", - plans = defaultPlans + plans = defaultPlans, + onContactClick }: PlanForSchoolsProps) { return (
-

- {title} -

-

- {description} -

+
+

+ {title} +

+

+ {description} +

+
-
+
{plans.map((plan, index) => (
- +
))}
+ +
+

+ Precisa de um plano personalizado para sua instituição? +

+
+ +
+
);