pwi-kdsmobile-hooks
Version:
Biblioteca de React Hooks para acompanhamento em tempo real de pedidos e exibição sequencial de senhas, ideal para sistemas de atendimento, painéis e aplicações que precisam consumir eventos do backend de forma simples e tipada.
163 lines (159 loc) • 4.75 kB
JavaScript
;
var __defProp = Object.defineProperty;
var __getOwnPropDesc = Object.getOwnPropertyDescriptor;
var __getOwnPropNames = Object.getOwnPropertyNames;
var __hasOwnProp = Object.prototype.hasOwnProperty;
var __export = (target, all) => {
for (var name in all)
__defProp(target, name, { get: all[name], enumerable: true });
};
var __copyProps = (to, from, except, desc) => {
if (from && typeof from === "object" || typeof from === "function") {
for (let key of __getOwnPropNames(from))
if (!__hasOwnProp.call(to, key) && key !== except)
__defProp(to, key, { get: () => from[key], enumerable: !(desc = __getOwnPropDesc(from, key)) || desc.enumerable });
}
return to;
};
var __toCommonJS = (mod) => __copyProps(__defProp({}, "__esModule", { value: true }), mod);
// index.ts
var index_exports = {};
__export(index_exports, {
useFilaExibicaoSenha: () => useFilaExibicaoSenha,
usePedidoEventos: () => usePedidoEventos
});
module.exports = __toCommonJS(index_exports);
// hooks/usePedidoEventos.ts
var import_react = require("react");
function usePedidoEventos(props) {
var _a;
const serverEvents = (0, import_react.useRef)(null);
const senhas = (0, import_react.useRef)(null);
const [userHash, setUserHash] = (0, import_react.useState)("");
const [, setTick] = (0, import_react.useState)(0);
function iniciar(tipoEvento) {
switch (tipoEvento) {
case "sse": {
serverEvents.current = new EventSource(
`${props.eventSourceUrl}/v1/pedido/events/sse?token=${props.token}`
);
break;
}
case "ws": {
serverEvents.current = new WebSocket(
`${props.eventSourceUrl}/v1/pedido/events/ws?token=${props.token}`
);
break;
}
default: {
props.onError({
errorID: "FHPEINI001",
msg: `Origem de eventos n\xE3o suportada: ${tipoEvento}`
});
return;
}
}
serverEvents.current.onmessage = (event) => {
var _a2;
const eventOk = handleServerEvent(event.data);
if (typeof eventOk === "object" && eventOk !== null && "errorID" in eventOk) {
(_a2 = serverEvents.current) == null ? void 0 : _a2.close();
props.onError(eventOk);
}
};
}
function handleServerEvent(data) {
let event;
try {
event = JSON.parse(data);
} catch (err) {
return {
errorID: "FHPEHSE001",
msg: "Erro ao receber a atualiza\xE7\xE3o do pedido"
};
}
switch (event.request) {
case "atualizacao-pedido": {
if (event.senhas) {
return handleAtualizacaoPedido(event.senhas);
}
break;
}
case "user-hash": {
if (event.userHash) setUserHash(event.userHash);
break;
}
case "erro": {
if (event.erro) {
return {
errorID: event.erro.errorID,
msg: event.erro.msg
};
}
break;
}
}
return true;
}
function handleAtualizacaoPedido(senhasNovas) {
if (senhas.current === null) {
setTick((t) => ++t);
senhas.current = [...senhasNovas];
return true;
}
const novasParaExibir = [];
for (const senhaNova of senhasNovas) {
const senhaVelha = senhas.current.find(
(item) => item.senha === senhaNova.senha
);
if (senhaVelha === void 0) {
novasParaExibir.push(senhaNova);
continue;
}
if (senhaVelha.status !== senhaNova.status) {
novasParaExibir.push(senhaNova);
}
}
setTick((t) => ++t);
senhas.current = senhasNovas;
if (novasParaExibir.length > 0) {
props.onSenhasParaExibir(novasParaExibir);
}
return true;
}
return {
iniciar,
userHash,
senhas: [...(_a = senhas.current) != null ? _a : []]
};
}
// hooks/useFilaExibicaoSenha.ts
var import_react2 = require("react");
function useFilaExibicaoSenha() {
const [fila, setFila] = (0, import_react2.useState)([]);
const [senhaExibicao, setSenhaExibicao] = (0, import_react2.useState)(null);
const adicionarSenhas = (0, import_react2.useCallback)((novas) => {
setFila((prev) => [...prev, ...novas]);
}, []);
const fimExibicao = (0, import_react2.useCallback)(() => {
setSenhaExibicao(null);
}, []);
(0, import_react2.useEffect)(() => {
if (senhaExibicao === null && fila.length > 0) {
setTimeout(() => {
setSenhaExibicao(fila[0]);
setFila(fila.slice(1));
}, 0);
}
}, [senhaExibicao, fila]);
return {
senhaExibicao,
adicionarSenhas,
fimExibicao
};
}
// Annotate the CommonJS export names for ESM import in node:
0 && (module.exports = {
useFilaExibicaoSenha,
usePedidoEventos
});