Hooks e cliente HTTP

useOonApi, useOonResource, useCoreMetadata, useModelSchema, useOonAuth, useOonTenant e o gating de permissões com Can.

Todos os hooks estão em @oondemand/oon-core-front e em @oondemand/oon-core-front/hooks.

useOonApi

const { http, core, resource } = useOonApi();
Valor Descrição
http Instância Axios autenticada: baseUrl, sessão, CSRF, tenant e headers de auditoria
core Cliente de /core/* (metadata, models)
resource(basePath) Cliente CRUD memoizado
const { http } = useOonApi();

await http.post("/pedidos-acoes/123/aprovar");
const { data } = await http.get("/core/role-catalog");
const pdf = await http.post("/pdf/render", { html }, { responseType: "blob" });

useOonResource

const pedidos = useOonResource<Pedido>("/pedidos");

const page = await pedidos.list({ pageIndex: 0, pageSize: 20, searchTerm: "acme", sort: "valor:desc", status: "Aprovado" });
const one = await pedidos.get(id);
await pedidos.create({ numero: "PC-01" }, { origem: "form" });
await pedidos.patch(id, { status: "Enviado" }, { origem: "workflow" });
await pedidos.delete(id);
await pedidos.importMany(rows, { origem: "import" });
const all = await pedidos.exportAll({ status: "Aprovado" });

O segundo argumento das mutações é o contexto de auditoria (origem: datagrid, form, workflow, assistant, import; module, entity), enviado nos headers x-oon-*.

Combinando com TanStack Query

O Core já monta um QueryClient (dados obsoletos após 5 s, revalidação a cada 10 s com a aba visível e ao focar/reconectar).

import { useQuery } from "@tanstack/react-query";
import { useOonResource } from "@oondemand/oon-core-front";

export function UltimosPedidos() {
  const pedidos = useOonResource<Pedido>("/pedidos");
  const { data, isLoading } = useQuery({
    queryKey: ["pedidos", "ultimos"],
    queryFn: () => pedidos.list({ pageSize: 5 }),
  });
  if (isLoading) return <CoreLoadingState />;
  return <ul>{data?.results.map((p) => <li key={p._id}>{p.numero}</li>)}</ul>;
}

Metadata

const { data: metadata } = useCoreMetadata();       // /core/metadata (cache 5 min)
const { data: model } = useModelSchema("Pedido");   // /core/models/Pedido

useOonAuth

const { user, roles, permissions, status, isAuthenticated, hasPermission, logout } = useOonAuth();
Valor Descrição
user Usuário validado (nome, email, tipo…)
roles, permissions, capabilities Resolvidos pelo backend
status loading, authenticated, first-access, unauthenticated, forbidden, error
hasPermission(p) Verifica uma ou várias permissões
logout(), clearSession(), retry() Sessão

can(user, permission) é a versão funcional.

Can e PermissionGate

import { Can } from "@oondemand/oon-core-front";

<Can permission="pedidos.approve" fallback={<span>Sem permissão</span>}>
  <button onClick={aprovar}>Aprovar</button>
</Can>

Can é um alias de PermissionGate. Aceita uma permissão ou uma lista (qualquer uma).

useOonTenant

Disponível em Apps tenant-aware (tenancyModel ≠ none): expõe o tenant selecionado e a troca de contexto. Apps none não montam o TenantProvider. createTenantStorage cria o storage isolado por janela (sessionStorage).