A react-lgpd-consent
é uma biblioteca client-side focada em aplicações React. A arquitetura é baseada em:
A versão atual é estável e focada em correções de produção e melhorias de compatibilidade. A arquitetura foi consolidada na v0.3.0 para renderizar a UI (banner, modal) automaticamente através do ConsentProvider
, simplificando o uso. A v0.3.1+ introduziu melhorias no controle programático do modal e na compatibilidade de temas.
initialState
para evitar "flash" de conteúdo.src/
├── components/ # Componentes UI (CookieBanner, PreferencesModal, etc.)
├── context/ # Contextos React (ConsentContext, CategoriesContext)
├── hooks/ # Hooks públicos (useConsent, useCategories, etc.)
├── types/ # Definições TypeScript
├── utils/ # Utilitários (ConsentGate, ScriptLoader, etc.)
└── index.ts # Ponto de entrada da API pública
graph TD
A[ConsentProvider mount] --> B[Estado boot: consented=false]
B --> C[useEffect executa]
C --> D{Cookie existe?}
D -->|Sim| E[dispatch HYDRATE]
D -->|Não| F[isHydrated=true]
E --> G[isHydrated=true]
F --> H[Banner pode aparecer]
G --> I[Banner NÃO aparece - zero flash!]
graph TD
A[Usuário clica botão] --> B{Qual ação?}
B -->|Accept All| C[dispatch ACCEPT_ALL]
B -->|Reject All| D[dispatch REJECT_ALL]
B -->|Preferences| E[dispatch OPEN_MODAL]
C --> F[writeConsentCookie]
D --> F
E --> G[Modal abre]
G --> H[Usuário configura]
H --> I[dispatch SET_PREFERENCES]
I --> F
O cookie armazena apenas as informações essenciais para a persistência do consentimento, em conformidade com o princípio de minimização de dados da LGPD.
{
"version": "1.0",
"consented": true,
"preferences": {
"necessary": true,
"analytics": false
},
"consentDate": "2025-08-12T14:30:00.000Z",
"lastUpdate": "2025-08-12T14:30:00.000Z",
"source": "banner",
"projectConfig": {
"enabledCategories": ["analytics"]
}
}
O projeto utiliza tsup
para compilar o código TypeScript para os formatos ESM e CJS, garantindo compatibilidade com diferentes sistemas de módulos.
tsup.config.js
export default {
entry: ['src/index.ts'],
format: ['esm', 'cjs'],
dts: true,
clean: true,
external: ['react', 'react-dom', '@mui/material', 'js-cookie'],
splitting: true,
treeshake: true,
}
Os testes são escritos com Jest e React Testing Library e estão localizados junto aos arquivos de origem (*.test.tsx
). Os cenários de teste críticos incluem:
git clone https://github.com/lucianoedipo/react-lgpd-consent.git
cd react-lgpd-consent
npm install
npm run build
git checkout -b feature/nova-funcionalidade
npm run dev
(ativa o modo watch do tsup
).npm test
e npm run lint
.Situação encontrada (2025-08-25):
Causa:
Correção aplicada:
Como testar localmente:
npm run storybook
.Components / FloatingPreferencesButton
.tooltip
e verifique o hover do botão.hideWhenConsented
e simule consentimento (ou remova o cookie e aceite) para verificar que o botão desaparece quando consented === true
.Notas:
Arquivos importantes:
.storybook/main.ts
— configuração do Storybook (addons, framework).storybook/preview.tsx
— decorator global que aplica ThemeProvider
, CssBaseline
e faz limpeza defensiva entre stories (remove cookie de consentimento, limpa nós portaled e força remount por story id)src/components/*.stories.tsx
— stories de componentes; prefira passar floatingPreferencesButtonProps
para o ConsentProvider
quando o provider monta o componente automaticamenteDicas:
ConsentProvider
nas mesmas stories; prefira usar a instância gerenciada pelo preview para evitar UI duplicada.theme={createTheme({ palette: { mode: 'dark' } })}
para o ConsentProvider
na story.