/* Administração de dispositivos de RV — ESP-0009 (RF-DISPOSITIVOS-01, 08, 12,
13, 17). Vive dentro do shell, como `view_users.jsx`.
Esconder o item de menu não é proteção — `/api/devices` recusa quem não é
administrador. As rotas públicas de registro (`/registrations/*`) são do app
de RV; esta tela só faz o lado administrativo.
O painel "Conectar dispositivo" gera, client-side, um QR-Code com a URL do
Portal (`window.NAZIDE_CONFIG.API_BASE`) para o headset ler na tela de
configuração. O QR carrega **só a URL**, nunca o segredo. */
const STATUS_DO_DISPOSITIVO = {
pendente: { rotulo: "Pendente", tag: "accent" },
ativo: { rotulo: "Ativo", tag: "go" },
inativo: { rotulo: "Inativo", tag: "danger" },
};
const ERROS_DE_DISPOSITIVO = {
codigo_de_pareamento_invalido: "Código de pareamento incorreto. Confira o que o app exibe.",
install_id_ja_registrado: null, // a mensagem do backend já orienta
status_invalido: null,
credencial_ja_resgatada: "A credencial deste dispositivo já foi resgatada.",
dispositivo_nao_encontrado: "Dispositivo não encontrado. Atualize a listagem.",
pendentes_no_limite: null,
};
function mensagemDeErroDeDispositivo(erro) {
if (!erro) return "";
const especifica = ERROS_DE_DISPOSITIVO[erro.code];
if (especifica) return especifica;
return erro.message || "Não foi possível concluir a solicitação.";
}
function formatarInstante(iso) {
if (!iso) return "—";
try {
return new Date(iso).toLocaleString("pt-BR", {
day: "2-digit", month: "2-digit", year: "numeric",
hour: "2-digit", minute: "2-digit",
});
} catch (e) {
return iso;
}
}
/* --- QR-Code client-side (biblioteca qrcode-generator via CDN) ------------- */
function QrCode({ texto, tamanho = 200 }) {
const dataUrl = React.useMemo(() => {
if (!texto || typeof window.qrcode !== "function") return null;
try {
const qr = window.qrcode(0, "M"); // versão automática, correção média
qr.addData(texto);
qr.make();
return qr.createDataURL(5, 4); // cellSize (px), margin (módulos)
} catch (e) {
return null;
}
}, [texto]);
if (!dataUrl) {
return {texto || "URL não configurada"};
}
return (
);
}
function PainelConectarDispositivo() {
const apiBase = (window.NAZIDE_CONFIG && window.NAZIDE_CONFIG.API_BASE) || "";
return (
Conectar um dispositivo
Na primeira execução, o app de RV pede a URL do Portal. Aponte o headset
para este QR-Code — ou digite a URL no teclado do visor. O código
transporta apenas o endereço, nunca uma credencial.
{apiBase ? (
{apiBase}
) : (
Defina window.NAZIDE_CONFIG.API_BASE em config.js{" "}
para gerar o QR-Code.
)}