react-lgpd-consent - v0.3.4
    Preparing search index...

    Function useConsentHydration

    Hook para acessar e manipular o estado de consentimento do usuário.

    Estado e métodos para consentimento.

    • Hook para verificar se a hidratação do estado de consentimento foi concluída.

      Returns boolean

      true se a hidratação do cookie foi concluída, false durante SSR ou antes da hidratação

      Em aplicações com Server-Side Rendering (SSR) como Next.js, o estado inicial é sempre false no servidor para evitar diferenças de hidratação. Este hook permite saber quando a biblioteca já leu o cookie do navegador e atualizou o estado, evitando o "flash" do banner ou comportamentos inconsistentes.

      • Mostrar loading states enquanto carrega o estado real do cookie
      • Evitar flash of unstyled content (FOUC) com banners aparecendo/sumindo
      • Sincronizar componentes que dependem do estado de consentimento
      • Inicializar scripts condicionalmente apenas após hidratação
      • No servidor (SSR): sempre retorna false
      • No cliente: retorna false até o useEffect ler o cookie
      • Após leitura do cookie: retorna true permanentemente
      • Performance: otimizado para evitar re-renders desnecessários
      • Next.js: App Router e Pages Router
      • Remix: SSR completo
      • Gatsby: Static Generation + hidratação
      • Vite SSR: Server-side rendering
      • Create React App: Client-side only (sempre true)
      function App() {
      const { consented } = useConsent();
      const isHydrated = useConsentHydration();

      // Não mostrar nada até hidratar
      if (!isHydrated) {
      return <div>Carregando...</div>;
      }

      return (
      <div>
      {!consented && <span>Banner aparecerá agora</span>}
      </div>
      );
      }
      function Analytics() {
      const { preferences } = useConsent();
      const isHydrated = useConsentHydration();

      React.useEffect(() => {
      if (isHydrated && preferences.analytics) {
      // Só carrega analytics após hidratação
      loadGoogleAnalytics();
      }
      }, [isHydrated, preferences.analytics]);

      return null;
      }
      function ConsentDependentFeature() {
      const { consented, preferences } = useConsent();
      const isHydrated = useConsentHydration();

      // Estados de loading
      if (!isHydrated) {
      return <div className="shimmer">Carregando preferências...</div>;
      }

      // Estado não consentido
      if (!consented) {
      return (
      <div className="consent-required">
      <p>Configure suas preferências de cookies para usar este recurso.</p>
      </div>
      );
      }

      // Estado com consentimento específico
      if (!preferences.functional) {
      return (
      <div className="consent-partial">
      <p>Este recurso requer cookies funcionais.</p>
      <button onClick={() => window.openPreferencesModal?.()}>
      Alterar Preferências
      </button>
      </div>
      );
      }

      return <div>🚀 Recurso funcionando com consentimento!</div>;
      }
      // pages/_app.tsx
      function MyApp(props: any) {
      const isHydrated = useConsentHydration();

      // Só renderiza componentes de consentimento após hidratação
      // para evitar diferenças entre servidor e cliente
      return (
      // ConsentProvider envolve tudo
      // Component com props normalmente
      // CookieBanner só se isHydrated for true
      // FloatingPreferencesButton só se isHydrated for true
      );
      }
      function useConsentAwareFeature(requiredCategory: string) {
      const { consented, preferences } = useConsent();
      const isHydrated = useConsentHydration();

      const isEnabled = React.useMemo(() => {
      if (!isHydrated) return false; // Loading
      if (!consented) return false; // No consent
      return preferences[requiredCategory] === true;
      }, [isHydrated, consented, preferences, requiredCategory]);

      return {
      isEnabled,
      isLoading: !isHydrated,
      hasConsented: consented,
      preferences
      };
      }

      // Uso do hook customizado
      function MyFeature() {
      const { isEnabled, isLoading } = useConsentAwareFeature('analytics');

      if (isLoading) return <Skeleton />;
      if (!isEnabled) return <ConsentRequired />;

      return <AnalyticsChart />;
      }

      ConsentProvider - Para configuração SSR

      0.1.0