Selo de não lidos
Um contador reativo que você pendura no ícone que já existe na sua interface.
Nove pacotes nativos levam o widget para dentro do seu app — selo de não lidos, chat, agente de IA e novidades, com push no celular — inclusive em stacks que costumam ficar de fora, como Delphi 7 e Lazarus.
Os nove pacotes nativos estão publicados, cada um no gerenciador de pacotes da sua plataforma. Onde não há pacote, o widget web funciona em qualquer app com WebView.
Móvel
Desktop
Web e empacotados
O Delphi instala pelo Boss. O Lazarus vem direto do repositório: clone e abra o pacote bfocus_widget_lcl.lpk. Os demais saem do registro de cada plataforma.
Os trechos abaixo são os mesmos do README de cada pacote.
<!-- antes do </body> --> <script> (function (w, d) { w.bFocusQueue = w.bFocusQueue || []; w.bFocus = w.bFocus || { init: function(o){ w.bFocusQueue.push(['init', o]); } }; var s = d.createElement('script'); s.async = true; s.src = 'https://widget.bfocus.com.br/v1/widget.js'; s.setAttribute('data-bf-key', 'bf_pk_…'); d.head.appendChild(s); })(window, document); bFocus.init({ user: { externalId: 'USR-123', name: 'João Silva' }, customer: { externalId: 'EMP-456', name: 'Empresa Ltda' }, userHash: '…' // assinado no SEU servidor }); </script>
Widget web — no ar, servido pela CDN
# Flutter — pubspec.yaml bfocus_widget: ^0.1.0 // iOS — Package.swift (produtos BFocusWidget e BFocusWidgetCore) .package(url: "https://github.com/bernisoftware/bfocus-widget-ios", from: "0.1.2") // Android — build.gradle.kts (para Compose: bfocus-widget-android-compose) implementation("br.com.bernisoftware:bfocus-widget-android:0.1.0") # React Native $ npm i @bfocus/react-native-widget react-native-webview @react-native-async-storage/async-storage # .NET — ou Bfocus.Widget.Wpf / Bfocus.Widget.Maui $ dotnet add package Bfocus.Widget.WinForms // Java desktop — ou bfocus-widget-swing implementation("br.com.bernisoftware:bfocus-widget-javafx:0.1.0") # Delphi $ boss install github.com/bernisoftware/bfocus-widget-delphi # Lazarus — depois abra package/bfocus_widget_lcl.lpk $ git clone https://github.com/bernisoftware/bfocus-widget-lazarus # Python desktop — ou [tk] $ pip install "bfocus-widget[qt]"
Um comando por plataforma. A chave publicável é a mesma em todas.
# pubspec.yaml dependencies: bfocus_widget: ^0.1.0 import 'package:bfocus_widget/bfocus_widget.dart'; await BFocus.init(BFocusConfig( publishableKey: 'bf_pk_…', user: BFocusUser(externalId: u.id, name: u.nome), customer: BFocusCustomer(externalId: u.empresaId), userHashProvider: () => minhaApi.bfocusUserHash(), navigatorKey: navigatorKey, product: 'erp', // opcional: marca do produto ));
Pacote bfocus_widget 0.1.0, publicado no pub.dev
// Flutter: o selo acompanha o estado do widget ValueListenableBuilder<String>( valueListenable: BFocus.badge, // '' | '•' | 'N' | '99+' builder: (context, label, _) => Badge( isLabelVisible: label.isNotEmpty, label: Text(label), child: IconButton( icon: const Icon(Icons.support_agent), onPressed: () => BFocus.open(context: context), ), ), );
O contador de não lidos é reativo: você o desenha onde quiser
O essencial vale em todos. Onde a plataforma muda o jeito, o texto diz qual.
Um contador reativo que você pendura no ícone que já existe na sua interface.
Pílula de versão e banner da última nota, com confirmação de leitura quando você exigir.
No Flutter, iOS, Android, React Native e .NET MAUI, a notificação sai pelo seu projeto Firebase, com o nome e o ícone do seu app. No desktop, o selo e a notificação do sistema vêm de consulta periódica.
Abre direto no chamado ou na novidade; no celular, também pelo toque na notificação com o app fechado.
Enviar foto, documento e baixar o que o atendente mandou, com as permissões certas de cada sistema.
Nos pacotes com WebView, tela própria de rede indisponível, com nova tentativa automática quando ela volta.
No gerenciador de pacotes de cada plataforma: pub.dev, Swift Package Manager, Maven Central, npm, NuGet e PyPI. O Delphi instala pelo Boss e o Lazarus vem direto do GitHub. O código de todos está em github.com/bernisoftware.
Não. Nos pacotes com WebView, a interface vem da CDN. Em todos, textos, cores, base de conhecimento e agente vêm do servidor, sem republicar o app.
Existe o modo navegador: o seu sistema abre o widget no navegador padrão já com a sessão assinada, e o usuário continua identificado. É assim que VB6, Harbour e Visual FoxPro funcionam.
A chave pública identifica a sua conta e pode ficar visível no app. A assinatura HMAC, calculada no seu servidor, é o que prova que aquele usuário é quem diz ser — com a identidade verificada ligada, o bFocus recusa quem não a traz. Ela vale 7 dias: o seu servidor gera outra quando vence.
Precisa. A origem do pacote nativo é app:// seguido do id do aplicativo, e ela entra na mesma lista de domínios autorizados do widget. Ali o id é conferido inteiro: app://com.cliente não libera app://com.cliente.outro, porque o host é um identificador de aplicativo e não um domínio. Cadastre um por app. Na web vale o contrário: o domínio raiz já cobre os subdomínios.
Instale o pacote da sua stack ou comece pelo widget web. A chave é a mesma.