Pular para conteúdo

loadPolicy()

Método para carregar e exibir políticas de privacidade, termos de uso e outras políticas diretamente em elementos HTML da sua aplicação.


📋 Visão Geral

O método loadPolicy() permite renderizar políticas dinâmicas criadas no dashboard Complyr diretamente em páginas HTML. As políticas são carregadas via API e inseridas no elemento especificado, mantendo a formatação e estilos configurados.

Características: - ✅ Sincronização Automática: Sempre exibe a versão mais recente da política - ✅ Formatação Preservada: Mantém estilos e estrutura configurados no dashboard - ✅ Seletor CSS: Aceita qualquer seletor CSS válido - ✅ Síncrono: Não retorna Promise (execução imediata) - ✅ Substituição Completa: Sobrescreve conteúdo existente do elemento


🎯 Casos de Uso

Quando Usar

  • Páginas de Políticas Dedicadas: /politica-de-privacidade, /termos-de-uso
  • Modais de Aceite: Exibir política antes de aceitar
  • Formulários de Cadastro: Mostrar termos no momento do registro
  • Páginas de Configuração: Área de privacidade com acesso às políticas
  • E-commerce: Exibir política de cookies na área de checkout
  • Compliance: Garantir que usuários vejam a versão mais recente

Quando NÃO Usar

  • ❌ Para aceitar políticas (use acceptPolicy())
  • ❌ Para coletar consentimento (use o banner automático)
  • ❌ Para links externos (use <a href> normal)

📚 Assinatura do Método

TypeScript

interface ComplyrAPI {
  /**
   * Carrega e exibe uma política em um elemento HTML
   * @param policyType - Tipo da política a carregar
   * @param selector - Seletor CSS do elemento alvo
   * @throws {Error} Se o seletor não encontrar nenhum elemento
   * @throws {Error} Se o policyType for inválido
   * @throws {Error} Se a política não existir ou não estiver publicada
   */
  loadPolicy(policyType: string, selector: string): void;
}

JavaScript

window.complyr.loadPolicy(policyType, selector);

🔧 Parâmetros

policyType (string, obrigatório)

Tipo da política a carregar. Deve corresponder a uma política criada e publicada no dashboard Complyr.

Valores Aceitos:

Valor Descrição Obrigatório LGPD
'privacy-policy' Política de Privacidade ✅ Sim (Art. 9º)
'terms-of-service' Termos de Uso ❌ Opcional
'cookie-policy' Política de Cookies ✅ Sim (se usar cookies)
'data-processing' Acordo de Processamento de Dados ⚠️ B2B apenas

Validação: - Deve ser uma string não vazia - Deve corresponder a uma política existente no workspace - Política deve estar com status published (publicada)


selector (string, obrigatório)

Seletor CSS do elemento HTML onde a política será renderizada.

Seletores Aceitos: - '#element-id' - Por ID (recomendado) - '.class-name' - Por classe (usa primeiro elemento encontrado) - '[data-policy]' - Por atributo - 'div.container > .policy' - Seletores complexos

Comportamento: - Se o seletor encontrar múltiplos elementos, apenas o primeiro será usado - Se o seletor não encontrar nenhum elemento, dispara erro - O conteúdo existente do elemento será completamente substituído


↩️ Valor de Retorno

Tipo: void (síncrono)

O método não retorna nenhum valor. A política é inserida diretamente no DOM.


💡 Exemplos de Uso

Exemplo 1: Página de Política de Privacidade

HTML:

<!DOCTYPE html>
<html lang="pt-BR">
<head>
  <meta charset="UTF-8">
  <title>Política de Privacidade - Minha Empresa</title>

  <!-- Script Complyr -->
  <script src="https://app.complyr.com.br/tag/js"
          data-workspace-id="SEU_WORKSPACE_ID"
          data-complyr-script async defer>
  </script>
</head>
<body>
  <header>
    <h1>Política de Privacidade</h1>
    <p>Última atualização: <span id="last-updated"></span></p>
  </header>

  <!-- Container onde a política será carregada -->
  <main id="policy-container">
    <p>Carregando política...</p>
  </main>

  <footer>
    <a href="/">Voltar ao site</a>
  </footer>

  <script>
    // Aguardar Complyr carregar
    window.addEventListener('complyr:loaded', function() {
      // Carregar Política de Privacidade
      window.complyr.loadPolicy('privacy-policy', '#policy-container');
    });
  </script>
</body>
</html>


Exemplo 2: Modal de Termos de Uso

HTML + JavaScript:

<!-- Botão para abrir modal -->
<button id="show-terms-btn">Ver Termos de Uso</button>

<!-- Modal (oculto inicialmente) -->
<div id="terms-modal" class="modal" style="display: none;">
  <div class="modal-content">
    <span class="close-btn">&times;</span>
    <h2>Termos de Uso</h2>

    <!-- Container da política -->
    <div id="terms-content" class="policy-content">
      <p>Carregando...</p>
    </div>

    <button id="accept-terms-btn">Aceitar e Continuar</button>
  </div>
</div>

<script>
window.addEventListener('complyr:loaded', function() {
  const modal = document.getElementById('terms-modal');
  const btn = document.getElementById('show-terms-btn');
  const closeBtn = document.querySelector('.close-btn');
  const acceptBtn = document.getElementById('accept-terms-btn');

  // Abrir modal
  btn.addEventListener('click', function() {
    modal.style.display = 'block';

    // Carregar termos apenas quando modal abrir (lazy loading)
    window.complyr.loadPolicy('terms-of-service', '#terms-content');
  });

  // Fechar modal
  closeBtn.addEventListener('click', function() {
    modal.style.display = 'none';
  });

  // Aceitar termos
  acceptBtn.addEventListener('click', async function() {
    try {
      // Registrar aceitação
      await window.complyr.acceptPolicy('terms-of-service', 'usuario@example.com');

      modal.style.display = 'none';
      alert('Termos aceitos com sucesso!');

      // Redirecionar para dashboard
      window.location.href = '/dashboard';
    } catch (error) {
      console.error('Erro ao aceitar termos:', error);
      alert('Erro ao aceitar termos. Tente novamente.');
    }
  });
});
</script>

<style>
.modal {
  position: fixed;
  z-index: 9999;
  left: 0;
  top: 0;
  width: 100%;
  height: 100%;
  background-color: rgba(0,0,0,0.7);
  overflow: auto;
}

.modal-content {
  background-color: #fff;
  margin: 5% auto;
  padding: 20px;
  width: 80%;
  max-width: 800px;
  border-radius: 8px;
  max-height: 80vh;
  overflow-y: auto;
}

.policy-content {
  margin: 20px 0;
  max-height: 400px;
  overflow-y: auto;
  border: 1px solid #ddd;
  padding: 15px;
  background-color: #f9f9f9;
}

.close-btn {
  color: #aaa;
  float: right;
  font-size: 28px;
  font-weight: bold;
  cursor: pointer;
}

.close-btn:hover {
  color: #000;
}
</style>


Exemplo 3: React Component - Página de Política

// components/PolicyPage.tsx
import React, { useEffect, useState } from 'react';

interface PolicyPageProps {
  policyType: 'privacy-policy' | 'terms-of-service' | 'cookie-policy' | 'data-processing';
  title: string;
}

export function PolicyPage({ policyType, title }: PolicyPageProps) {
  const [loading, setLoading] = useState(true);
  const [error, setError] = useState<string | null>(null);

  useEffect(() => {
    // Aguardar Complyr carregar
    const loadPolicy = () => {
      if (window.complyr) {
        try {
          window.complyr.loadPolicy(policyType, '#policy-content');
          setLoading(false);
        } catch (err: any) {
          setError(err.message || 'Erro ao carregar política');
          setLoading(false);
        }
      } else {
        // Complyr ainda não carregou, aguardar
        setTimeout(loadPolicy, 100);
      }
    };

    loadPolicy();
  }, [policyType]);

  if (loading) {
    return (
      <div className="policy-page">
        <h1>{title}</h1>
        <div className="loading">
          <p>Carregando política...</p>
          <div className="spinner"></div>
        </div>
      </div>
    );
  }

  if (error) {
    return (
      <div className="policy-page">
        <h1>{title}</h1>
        <div className="error">
          <p> {error}</p>
          <button onClick={() => window.location.reload()}>
            Tentar novamente
          </button>
        </div>
      </div>
    );
  }

  return (
    <div className="policy-page">
      <h1>{title}</h1>

      {/* Container onde a política será carregada */}
      <div id="policy-content" className="policy-content"></div>

      <footer className="policy-footer">
        <a href="/"> Voltar ao site</a>
        <button onClick={() => window.print()}>🖨️ Imprimir</button>
      </footer>
    </div>
  );
}

// Uso:
// app/politica-de-privacidade/page.tsx
export default function PrivacyPolicyPage() {
  return (
    <PolicyPage
      policyType="privacy-policy"
      title="Política de Privacidade"
    />
  );
}

Exemplo 4: Vue.js Composable

// composables/usePolicy.ts
import { ref, onMounted } from 'vue';

export function usePolicy(
  policyType: 'privacy-policy' | 'terms-of-service' | 'cookie-policy' | 'data-processing',
  selector: string
) {
  const loading = ref(true);
  const error = ref<string | null>(null);

  const loadPolicy = () => {
    if (window.complyr) {
      try {
        window.complyr.loadPolicy(policyType, selector);
        loading.value = false;
      } catch (err: any) {
        error.value = err.message || 'Erro ao carregar política';
        loading.value = false;
      }
    } else {
      // Aguardar Complyr carregar
      setTimeout(loadPolicy, 100);
    }
  };

  onMounted(() => {
    loadPolicy();
  });

  return {
    loading,
    error,
    reload: loadPolicy
  };
}

Uso no Component:

<!-- pages/privacy-policy.vue -->
<template>
  <div class="policy-page">
    <h1>Política de Privacidade</h1>

    <div v-if="loading" class="loading">
      <p>Carregando política...</p>
    </div>

    <div v-else-if="error" class="error">
      <p>{{ error }}</p>
      <button @click="reload">Tentar novamente</button>
    </div>

    <div v-else id="policy-content" class="policy-content"></div>
  </div>
</template>

<script setup lang="ts">
import { usePolicy } from '@/composables/usePolicy';

const { loading, error, reload } = usePolicy('privacy-policy', '#policy-content');
</script>

Exemplo 5: Next.js App Router - Dynamic Policy Pages

// app/policies/[policyType]/page.tsx
import { PolicyViewer } from '@/components/PolicyViewer';
import { notFound } from 'next/navigation';

const VALID_POLICIES = {
  'politica-de-privacidade': {
    type: 'privacy-policy' as const,
    title: 'Política de Privacidade'
  },
  'termos-de-uso': {
    type: 'terms-of-service' as const,
    title: 'Termos de Uso'
  },
  'politica-de-cookies': {
    type: 'cookie-policy' as const,
    title: 'Política de Cookies'
  },
  'processamento-de-dados': {
    type: 'data-processing' as const,
    title: 'Acordo de Processamento de Dados'
  }
};

export function generateStaticParams() {
  return Object.keys(VALID_POLICIES).map((slug) => ({
    policyType: slug,
  }));
}

export default function PolicyPage({
  params
}: {
  params: { policyType: string }
}) {
  const policy = VALID_POLICIES[params.policyType as keyof typeof VALID_POLICIES];

  if (!policy) {
    notFound();
  }

  return (
    <div className="container mx-auto py-8 px-4">
      <h1 className="text-3xl font-bold mb-6">{policy.title}</h1>
      <PolicyViewer policyType={policy.type} />
    </div>
  );
}

// components/PolicyViewer.tsx
'use client';

import { useEffect, useState } from 'react';

export function PolicyViewer({
  policyType
}: {
  policyType: string
}) {
  const [loading, setLoading] = useState(true);

  useEffect(() => {
    const loadPolicy = () => {
      if (window.complyr) {
        window.complyr.loadPolicy(policyType, '#policy-viewer');
        setLoading(false);
      } else {
        setTimeout(loadPolicy, 100);
      }
    };

    loadPolicy();
  }, [policyType]);

  if (loading) {
    return <div>Carregando...</div>;
  }

  return <div id="policy-viewer" className="prose max-w-none"></div>;
}

Exemplo 6: WordPress - Página de Política com Shortcode

<?php
/**
 * Plugin Name: Complyr Policy Loader
 * Description: Carrega políticas do Complyr usando shortcodes
 * Version: 1.0
 */

// Adicionar script Complyr no header
function complyr_add_script() {
    $workspace_id = get_option('complyr_workspace_id', '');

    if (empty($workspace_id)) {
        return;
    }
    ?>
    <script src="https://app.complyr.com.br/tag/js"
            data-workspace-id="<?php echo esc_attr($workspace_id); ?>"
            data-complyr-script async defer>
    </script>
    <?php
}
add_action('wp_head', 'complyr_add_script');

// Shortcode para carregar política
// Uso: [complyr_policy type="privacy-policy"]
function complyr_policy_shortcode($atts) {
    $atts = shortcode_atts(array(
        'type' => 'privacy-policy',
        'id' => 'complyr-policy-' . uniqid()
    ), $atts);

    $valid_types = array(
        'privacy-policy',
        'terms-of-service',
        'cookie-policy',
        'data-processing'
    );

    if (!in_array($atts['type'], $valid_types)) {
        return '<p class="error">Tipo de política inválido.</p>';
    }

    $container_id = esc_attr($atts['id']);
    $policy_type = esc_attr($atts['type']);

    ob_start();
    ?>
    <div id="<?php echo $container_id; ?>" class="complyr-policy-container">
        <p>Carregando política...</p>
    </div>

    <script>
    (function() {
        function loadPolicy() {
            if (window.complyr && typeof window.complyr.loadPolicy === 'function') {
                window.complyr.loadPolicy(
                    '<?php echo $policy_type; ?>',
                    '#<?php echo $container_id; ?>'
                );
            } else {
                setTimeout(loadPolicy, 100);
            }
        }

        if (document.readyState === 'loading') {
            document.addEventListener('DOMContentLoaded', loadPolicy);
        } else {
            loadPolicy();
        }
    })();
    </script>

    <style>
    .complyr-policy-container {
        padding: 20px;
        background-color: #f9f9f9;
        border: 1px solid #ddd;
        border-radius: 4px;
        margin: 20px 0;
    }
    </style>
    <?php
    return ob_get_clean();
}
add_shortcode('complyr_policy', 'complyr_policy_shortcode');

// Adicionar configurações no WordPress Admin
function complyr_settings_page() {
    add_options_page(
        'Configurações Complyr',
        'Complyr',
        'manage_options',
        'complyr-settings',
        'complyr_settings_page_html'
    );
}
add_action('admin_menu', 'complyr_settings_page');

function complyr_settings_page_html() {
    if (!current_user_can('manage_options')) {
        return;
    }

    if (isset($_POST['complyr_workspace_id'])) {
        update_option('complyr_workspace_id', sanitize_text_field($_POST['complyr_workspace_id']));
        echo '<div class="updated"><p>Configurações salvas!</p></div>';
    }

    $workspace_id = get_option('complyr_workspace_id', '');
    ?>
    <div class="wrap">
        <h1>Configurações Complyr</h1>
        <form method="post">
            <table class="form-table">
                <tr>
                    <th scope="row">Workspace ID</th>
                    <td>
                        <input type="text"
                               name="complyr_workspace_id"
                               value="<?php echo esc_attr($workspace_id); ?>"
                               class="regular-text">
                        <p class="description">
                            Encontre seu Workspace ID no dashboard Complyr
                        </p>
                    </td>
                </tr>
            </table>
            <?php submit_button('Salvar Configurações'); ?>
        </form>

        <hr>

        <h2>Como usar</h2>
        <p>Use o shortcode <code>[complyr_policy type="privacy-policy"]</code> em qualquer página ou post.</p>
        <p>Tipos disponíveis:</p>
        <ul>
            <li><code>privacy-policy</code> - Política de Privacidade</li>
            <li><code>terms-of-service</code> - Termos de Uso</li>
            <li><code>cookie-policy</code> - Política de Cookies</li>
            <li><code>data-processing</code> - Acordo de Processamento</li>
        </ul>
    </div>
    <?php
}

Uso no WordPress: 1. Ativar o plugin 2. Ir em Configurações → Complyr 3. Adicionar Workspace ID 4. Criar página "Política de Privacidade" 5. Adicionar shortcode: [complyr_policy type="privacy-policy"]


🔄 Fluxo de Execução

sequenceDiagram
    participant App as Aplicação
    participant Complyr as window.complyr
    participant API as Complyr API
    participant DOM as DOM Element

    App->>Complyr: loadPolicy('privacy-policy', '#container')

    Complyr->>Complyr: Validar parâmetros

    alt Parâmetros inválidos
        Complyr-->>App: throw Error
    end

    Complyr->>DOM: Verificar se elemento existe

    alt Elemento não encontrado
        Complyr-->>App: throw Error
    end

    Complyr->>API: GET /policies/{workspaceId}/{policyType}

    API-->>Complyr: HTML da política

    Complyr->>DOM: Substituir innerHTML

    Complyr->>DOM: Aplicar estilos configurados

    Complyr-->>App: void (concluído)

⚠️ Tratamento de Erros

Erros Comuns

1. Elemento Não Encontrado

// ❌ ERRO
window.complyr.loadPolicy('privacy-policy', '#elemento-inexistente');
// Error: Element with selector '#elemento-inexistente' not found

// ✅ SOLUÇÃO
const element = document.querySelector('#policy-container');
if (element) {
  window.complyr.loadPolicy('privacy-policy', '#policy-container');
} else {
  console.error('Container de política não encontrado');
}

2. Tipo de Política Inválido

// ❌ ERRO
window.complyr.loadPolicy('invalid-policy', '#container');
// Error: Invalid policy type 'invalid-policy'

// ✅ SOLUÇÃO
const validTypes = [
  'privacy-policy',
  'terms-of-service',
  'cookie-policy',
  'data-processing'
];

const policyType = 'privacy-policy';

if (validTypes.includes(policyType)) {
  window.complyr.loadPolicy(policyType, '#container');
} else {
  console.error('Tipo de política inválido:', policyType);
}

3. Política Não Publicada

// ❌ ERRO
window.complyr.loadPolicy('terms-of-service', '#container');
// Error: Policy 'terms-of-service' not found or not published

// ✅ SOLUÇÃO
// 1. Verificar no dashboard Complyr se a política existe
// 2. Verificar se o status está como "Publicada"
// 3. Tratar erro graciosamente

try {
  window.complyr.loadPolicy('terms-of-service', '#container');
} catch (error) {
  console.error('Erro ao carregar política:', error);

  // Exibir mensagem alternativa
  document.querySelector('#container').innerHTML = `
    <div class="error-message">
      <p>Não foi possível carregar a política no momento.</p>
      <p>Por favor, entre em contato com o suporte.</p>
    </div>
  `;
}

4. Complyr Não Carregado

// ❌ ERRO
// Script executado antes de Complyr carregar
window.complyr.loadPolicy('privacy-policy', '#container');
// TypeError: Cannot read property 'loadPolicy' of undefined

// ✅ SOLUÇÃO 1: Aguardar evento
window.addEventListener('complyr:loaded', function() {
  window.complyr.loadPolicy('privacy-policy', '#container');
});

// ✅ SOLUÇÃO 2: Polling
function waitForComplyr(callback) {
  if (window.complyr && typeof window.complyr.loadPolicy === 'function') {
    callback();
  } else {
    setTimeout(() => waitForComplyr(callback), 100);
  }
}

waitForComplyr(() => {
  window.complyr.loadPolicy('privacy-policy', '#container');
});

// ✅ SOLUÇÃO 3: Promise
function whenComplyrReady() {
  return new Promise((resolve) => {
    if (window.complyr) {
      resolve(window.complyr);
    } else {
      window.addEventListener('complyr:loaded', () => {
        resolve(window.complyr);
      }, { once: true });
    }
  });
}

// Uso
whenComplyrReady().then((complyr) => {
  complyr.loadPolicy('privacy-policy', '#container');
});

Try/Catch Recomendado

function loadPolicyWithErrorHandling(policyType, selector) {
  try {
    // Verificar se Complyr está disponível
    if (!window.complyr) {
      throw new Error('Complyr não está carregado');
    }

    // Verificar se elemento existe
    const element = document.querySelector(selector);
    if (!element) {
      throw new Error(`Elemento ${selector} não encontrado`);
    }

    // Carregar política
    window.complyr.loadPolicy(policyType, selector);

    console.log(`✅ Política ${policyType} carregada com sucesso`);

  } catch (error) {
    console.error('❌ Erro ao carregar política:', error);

    // Exibir mensagem de erro para usuário
    const fallbackElement = document.querySelector(selector);
    if (fallbackElement) {
      fallbackElement.innerHTML = `
        <div style="padding: 20px; background: #fee; border: 1px solid #fcc;">
          <p><strong>Erro ao carregar política</strong></p>
          <p>${error.message}</p>
          <button onclick="location.reload()">Tentar novamente</button>
        </div>
      `;
    }

    // Enviar para sistema de logging (opcional)
    if (window.Sentry) {
      Sentry.captureException(error);
    }
  }
}

// Uso
window.addEventListener('complyr:loaded', function() {
  loadPolicyWithErrorHandling('privacy-policy', '#policy-container');
});

🎨 Customização de Estilos

As políticas são renderizadas com estilos configurados no dashboard Complyr, mas você pode aplicar CSS adicional:

Método 1: CSS Global

/* styles.css */

/* Container da política */
#policy-container {
  max-width: 800px;
  margin: 0 auto;
  padding: 40px 20px;
  font-family: 'Inter', sans-serif;
  line-height: 1.6;
  color: #333;
}

/* Títulos */
#policy-container h1 {
  font-size: 2rem;
  font-weight: 700;
  margin-bottom: 1rem;
  color: #111;
}

#policy-container h2 {
  font-size: 1.5rem;
  font-weight: 600;
  margin-top: 2rem;
  margin-bottom: 1rem;
  color: #222;
}

/* Parágrafos */
#policy-container p {
  margin-bottom: 1rem;
}

/* Listas */
#policy-container ul,
#policy-container ol {
  margin-left: 1.5rem;
  margin-bottom: 1rem;
}

#policy-container li {
  margin-bottom: 0.5rem;
}

/* Links */
#policy-container a {
  color: #0066cc;
  text-decoration: underline;
}

#policy-container a:hover {
  color: #0052a3;
}

/* Tabelas */
#policy-container table {
  width: 100%;
  border-collapse: collapse;
  margin: 1rem 0;
}

#policy-container th,
#policy-container td {
  padding: 0.75rem;
  border: 1px solid #ddd;
  text-align: left;
}

#policy-container th {
  background-color: #f5f5f5;
  font-weight: 600;
}

/* Responsividade */
@media (max-width: 768px) {
  #policy-container {
    padding: 20px 15px;
  }

  #policy-container h1 {
    font-size: 1.5rem;
  }

  #policy-container h2 {
    font-size: 1.25rem;
  }
}

Método 2: Scoped Styles (React)

// components/PolicyPage.tsx
import styles from './PolicyPage.module.css';

export function PolicyPage() {
  useEffect(() => {
    window.complyr?.loadPolicy('privacy-policy', '#policy-content');
  }, []);

  return (
    <div className={styles.policyPage}>
      <div id="policy-content" className={styles.policyContent}></div>
    </div>
  );
}
/* PolicyPage.module.css */
.policyPage {
  max-width: 800px;
  margin: 0 auto;
  padding: 40px 20px;
}

.policyContent {
  font-family: 'Inter', sans-serif;
  line-height: 1.6;
}

.policyContent :global(h1) {
  font-size: 2rem;
  margin-bottom: 1rem;
}

.policyContent :global(h2) {
  font-size: 1.5rem;
  margin-top: 2rem;
}

Método 3: Tailwind CSS

// components/PolicyViewer.tsx
export function PolicyViewer({ policyType }: { policyType: string }) {
  useEffect(() => {
    window.complyr?.loadPolicy(policyType, '#policy-viewer');
  }, [policyType]);

  return (
    <div
      id="policy-viewer"
      className="
        prose
        prose-lg
        max-w-none
        prose-headings:font-bold
        prose-h1:text-3xl
        prose-h2:text-2xl
        prose-p:text-gray-700
        prose-a:text-blue-600
        prose-a:no-underline
        hover:prose-a:underline
      "
    ></div>
  );
}

🔍 Debug e Inspeção

Console Logging

// Ativar logs detalhados
localStorage.setItem('complyr_debug', 'true');
location.reload();

// Verá logs como:
// [Complyr] Loading policy: privacy-policy
// [Complyr] Target selector: #policy-container
// [Complyr] Fetching policy from API...
// [Complyr] Policy loaded successfully
// [Complyr] HTML inserted into #policy-container

// Desativar logs
localStorage.removeItem('complyr_debug');

Inspeção Manual

// Verificar se elemento existe
console.log('Elemento:', document.querySelector('#policy-container'));

// Verificar se Complyr carregou
console.log('Complyr disponível:', typeof window.complyr !== 'undefined');

// Verificar método loadPolicy
console.log('loadPolicy disponível:', typeof window.complyr?.loadPolicy === 'function');

// Ver conteúdo após carregamento
setTimeout(() => {
  const container = document.querySelector('#policy-container');
  console.log('HTML da política:', container?.innerHTML.substring(0, 500));
}, 2000);

🚀 Performance e Otimizações

Lazy Loading

Carregue políticas apenas quando necessário (ex: quando modal abrir):

// ❌ RUIM: Carregar política na inicialização da página
window.addEventListener('complyr:loaded', function() {
  window.complyr.loadPolicy('privacy-policy', '#hidden-modal-content');
});

// ✅ BOM: Carregar apenas quando modal abrir
document.getElementById('show-policy-btn').addEventListener('click', function() {
  openModal();

  // Carregar apenas na primeira vez
  if (!window.policyLoaded) {
    window.complyr.loadPolicy('privacy-policy', '#modal-content');
    window.policyLoaded = true;
  }
});

Caching

O Complyr já faz cache automático das políticas. Para forçar recarregamento:

// Recarregar política (útil após atualização no dashboard)
function reloadPolicy(policyType, selector) {
  const container = document.querySelector(selector);

  if (container) {
    // Limpar conteúdo
    container.innerHTML = '<p>Recarregando...</p>';

    // Aguardar um momento antes de recarregar
    setTimeout(() => {
      window.complyr.loadPolicy(policyType, selector);
    }, 100);
  }
}

// Botão para recarregar
document.getElementById('reload-btn').addEventListener('click', () => {
  reloadPolicy('privacy-policy', '#policy-container');
});

Múltiplas Políticas na Mesma Página

<!-- Múltiplos containers -->
<div id="privacy-policy-container"></div>
<div id="terms-container"></div>
<div id="cookie-policy-container"></div>

<script>
window.addEventListener('complyr:loaded', function() {
  // Carregar todas as políticas em paralelo
  window.complyr.loadPolicy('privacy-policy', '#privacy-policy-container');
  window.complyr.loadPolicy('terms-of-service', '#terms-container');
  window.complyr.loadPolicy('cookie-policy', '#cookie-policy-container');
});
</script>

✅ Melhores Práticas

DOs ✅

// ✅ Aguardar Complyr carregar
window.addEventListener('complyr:loaded', function() {
  window.complyr.loadPolicy('privacy-policy', '#container');
});

// ✅ Validar elemento antes de carregar
const element = document.querySelector('#policy-container');
if (element) {
  window.complyr.loadPolicy('privacy-policy', '#policy-container');
}

// ✅ Tratar erros graciosamente
try {
  window.complyr.loadPolicy('privacy-policy', '#container');
} catch (error) {
  console.error('Erro:', error);
  // Exibir mensagem de erro
}

// ✅ Usar IDs únicos para seletores
window.complyr.loadPolicy('privacy-policy', '#unique-policy-id');

// ✅ Aplicar estilos customizados via CSS externo
// (não modificar HTML da política diretamente)

DON'Ts ❌

// ❌ NÃO executar antes de Complyr carregar
window.complyr.loadPolicy('privacy-policy', '#container');
// TypeError: window.complyr is undefined

// ❌ NÃO assumir que elemento sempre existe
window.complyr.loadPolicy('privacy-policy', '#maybe-nonexistent');
// Error: Element not found

// ❌ NÃO ignorar erros
window.complyr.loadPolicy('invalid', '#container');
// Erro não tratado

// ❌ NÃO modificar HTML da política manualmente após carregar
document.querySelector('#container').innerHTML += '<p>Extra content</p>';
// Quebra formatação e pode causar problemas

// ❌ NÃO usar seletores genéricos que podem pegar múltiplos elementos
window.complyr.loadPolicy('privacy-policy', '.policy');
// Usa apenas o primeiro elemento (pode não ser o desejado)

🔗 Recursos Relacionados

Métodos da API: - identify() - Identificar usuários para Advanced Matching - acceptPolicy() - Registrar aceitação de política - revokeConsent() - Revogar consentimento - openPreferences() - Abrir modal de preferências

Recursos: - window.complyr - Objeto global da API - Eventos JavaScript - Lista completa de eventos - Exemplos Práticos - Casos de uso completos

Integrações: - Google Tag Manager - Integração GTM - Facebook Pixel - Integração Facebook Pixel


❓ Perguntas Frequentes

P: A política é atualizada automaticamente quando eu editar no dashboard?

R: Não em tempo real. A política é cacheada pelo navegador. Para ver mudanças: 1. Recarregue a página (F5) 2. Limpe o cache do navegador 3. Ou implemente botão de reload manual


P: Posso carregar a mesma política em múltiplos elementos?

R: Sim, basta chamar loadPolicy() múltiplas vezes com seletores diferentes:

window.complyr.loadPolicy('privacy-policy', '#sidebar-policy');
window.complyr.loadPolicy('privacy-policy', '#footer-policy');

P: Como exibir data de última atualização?

R: A política HTML retornada já inclui metadados. Você pode extraí-los:

window.addEventListener('complyr:loaded', function() {
  window.complyr.loadPolicy('privacy-policy', '#policy-container');

  // Aguardar carregamento
  setTimeout(() => {
    const container = document.querySelector('#policy-container');
    const lastUpdated = container.querySelector('[data-last-updated]');

    if (lastUpdated) {
      document.getElementById('last-update-date').textContent =
        lastUpdated.getAttribute('data-last-updated');
    }
  }, 1000);
});

P: Posso usar loadPolicy() sem o script Complyr?

R: Não. O método loadPolicy() faz parte da API JavaScript do Complyr e requer que o script esteja carregado.


P: A política funciona offline?

R: Depende do cache do navegador. Para garantir funcionamento offline, considere usar Service Workers ou pre-renderizar a política no servidor.


P: Como adicionar analytics quando política é carregada?

R: Use eventos customizados ou callbacks:

window.addEventListener('complyr:loaded', function() {
  window.complyr.loadPolicy('privacy-policy', '#policy-container');

  // Enviar evento para Google Analytics
  if (window.gtag) {
    gtag('event', 'policy_loaded', {
      'policy_type': 'privacy-policy',
      'page_location': window.location.href
    });
  }
});

P: Posso traduzir a política para outros idiomas?

R: Sim, crie versões separadas no dashboard Complyr para cada idioma e carregue dinamicamente:

const userLanguage = navigator.language.startsWith('en') ? 'en' : 'pt';
const policyType = userLanguage === 'en'
  ? 'privacy-policy-en'
  : 'privacy-policy';

window.complyr.loadPolicy(policyType, '#policy-container');

📞 Suporte

Problemas com loadPolicy()?