Ir para conteúdo principal

Como integrar um widget bsport no Framer

Como incorporar um widget bsport num site Framer, incluindo a abordagem recomendada de Componente Personalizado que resolve o problema de na

O Framer cria sites como aplicações de página única (SPAs), o que altera o comportamento dos widgets incorporados. Saber isto de antemão evita os dois problemas mais reportados pelos estúdios: o widget não aparecer quando um visitante acede à página a partir de outra parte do site, e os pop-ups ficarem confinados a uma pequena caixa.

Antes de começar

Gere o código do seu widget no back office da bsport: Definições → Widgets, escolha o tipo de widget, configure as suas opções e, em seguida, role para baixo e copie o código. Sempre que altera uma definição, é gerado um novo código, e tem de colar a nova versão no seu site para que a alteração tenha efeito.

Método 1 — Componente Embed (rápido, com limitações)

  1. Na área de trabalho do Framer, clique em Insert → procure por Embed

  2. Arraste-o para a página

  3. No painel à direita, escolha HTML e cole o código do seu widget

  4. Redimensione a moldura e clique em Publish

O problema das aplicações de página única

O Framer não recarrega a página quando um visitante se move entre secções do seu site — substitui o conteúdo no local. Além disso, o componente Embed envolve o seu código num iframe, pelo que perde o controlo sobre o momento em que o script do widget é executado. O resultado: o widget pode aparecer vazio na primeira visita — especialmente em iOS (Safari e Chrome) — e só aparecer após uma atualização completa da página. Como funciona ao atualizar, o problema passa muitas vezes despercebido durante os testes.

⚠️ Se vir o widget ao atualizar mas não no primeiro carregamento ou ao navegar para a página, esta é a causa. A solução é substituir o componente Embed por um code component do Framer (Método 2 abaixo), que carrega o script do widget e monta o próprio widget sempre que a página é apresentada.

Método 2 — Code component (recomendado)

  1. No Framer, abra o painel Assets e crie um novo code component.

  2. Elimine o código predefinido e cole o código abaixo.

    import { useEffect } from "react";// Replace with the parentElement value from your bsport widget code
    const WIDGET_ID = "bsport-widget-XXXXXX";export default function BsportWidget() {
    useEffect(() => {
    // Copy these values from your bsport widget code
    const config = {
    parentElement: WIDGET_ID,
    companyId: 1234, // replace with your company ID
    franchiseId: null,
    dialogMode: 1,
    widgetType: "calendar",
    showFab: false,
    fullScreenPopup: false,
    styles: undefined,
    config: {
    calendar: {},
    },
    }; const widgetScriptId = "bsport-widget-cdn"; const loadScript = () => {
    return new Promise((resolve, reject) => {
    if (window.BsportWidget) {
    return resolve("already loaded");
    }
    const existingScript = document.getElementById(widgetScriptId);
    if (existingScript) {
    existingScript.addEventListener("load", resolve);
    existingScript.addEventListener("error", reject);
    return;
    }
    const script = document.createElement("script");
    script.id = widgetScriptId;
    script.src = "https://cdn.bsport.io/scripts/widget.js";
    script.async = true;
    script.onload = resolve;
    script.onerror = reject;
    document.head.appendChild(script);
    });
    }; const mountWidget = (config, repeat = 1) => {
    if (repeat > 50) return;
    if (!window.BsportWidget) {
    return setTimeout(() => mountWidget(config, repeat + 1), 100 * repeat);
    }
    // Avoid mounting twice
    if (document.getElementById(WIDGET_ID)?.hasChildNodes()) {
    return;
    }
    // Clear a previous registration so the widget can mount again
    const list = window.BsportWidget.el_list_id;
    if (list?.includes(WIDGET_ID)) {
    list.splice(list.indexOf(WIDGET_ID), 1);
    }
    window.BsportWidget.mount(config);
    }; loadScript()
    .then(() => mountWidget(config))
    .catch(console.error);
    }, []); return <div id={WIDGET_ID}></div>;
    }

  3. No código do seu widget bsport, encontre o objeto dentro de MountBsportWidget({ ... }) e copie os seus valores (ID da empresa, tipo de widget, opções) para o objeto config abaixo.

    <script>
    ...
    </script>
    <script>
    MountBsportWidget({
    "parentElement": "bsport-widget-441452",
    "companyId": companyId,
    "franchiseId": null,
    "dialogMode": 1,
    "widgetType": "calendar",
    "showFab": false,
    "fullScreenPopup": false,
    "styles": undefined,
    "config": {
    "calendar": {
    }
    }
    });
    </script>

  4. Defina WIDGET_ID com o valor de parentElement do código do seu widget (por exemplo, bsport-widget-441452).

  5. Elimine o antigo componente Embed da sua página e, em seguida, arraste o novo code component de Assets para a página no seu lugar.

  6. Defina a largura e a altura do componente como Fill para que o widget não fique cortado ou oculto.

  7. Clique em Publish e, em seguida, teste navegando para a página a partir de outra página do seu site e num iPhone — não apenas com uma atualização.

Porque é que isto funciona

Numa aplicação de página única, mover-se entre páginas não desencadeia uma atualização completa, pelo que os scripts incorporados — especialmente dentro de um iframe — podem não ser executados novamente. O code component carrega o script da bsport por si próprio e monta o widget diretamente no seu próprio contentor sempre que a página é apresentada, pelo que o widget é renderizado de forma fiável no primeiro carregamento, após navegar dentro do site e em visitas de regresso.

Resolução de problemas

O widget aparece ao atualizar mas não no primeiro carregamento ou ao navegar a partir de outra página.
O problema das aplicações de página única descrito acima. Mude para o Método 2.

Abre-se um pop-up mas fica cortado.
A limitação do iframe no Método 1. Mude para o Método 2.

O code component não mostra nada.
Verifique se o WIDGET_ID corresponde ao parentElement do código do seu widget, se o ID da empresa está correto e se o componente está definido como Fill.

As alterações feitas no back office não aparecem.
A configuração não se atualiza automaticamente no seu site. Copie o código recém-gerado e substitua completamente o antigo, depois publique novamente. Se utilizar o Método 2, atualize os valores no objeto config.

O widget tem um aspeto diferente da pré-visualização no back office.
Ative o Modo de Compatibilidade nas definições do seu widget e, em seguida, copie e cole o novo código.

​Continua com dificuldades? Contacte a nossa equipa de suporte com o URL da página e uma captura de ecrã, e nós vamos analisar o caso.

Isto respondeu à sua pergunta?